Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以C#:WPF与Win形式显示原始未压缩字节源的实时视频_C#_Wpf_Video_Directshow - Fatal编程技术网

以C#:WPF与Win形式显示原始未压缩字节源的实时视频

以C#:WPF与Win形式显示原始未压缩字节源的实时视频,c#,wpf,video,directshow,C#,Wpf,Video,Directshow,我有一个实时的16位灰度视频流,作为未压缩的原始字节流(每像素2字节,每帧2^18像素,每秒32帧)通过内存中的环形缓冲区。(这是来自科学级相机,通过PCI帧抓取器)。我想对视频做一些简单的处理(剪辑动态范围、着色、添加叠加),然后使用C#在窗口中显示它 我使用Windows窗体和GDI(对于每个帧,构建一个位图对象,根据我的后处理步骤写入原始32位RGB像素值,然后使用Graphics类绘制帧)来完成这项工作。但这占用了我想用于其他事情的大量CPU。所以我对使用WPF进行GPU加速视频显示感兴

我有一个实时的16位灰度视频流,作为未压缩的原始字节流(每像素2字节,每帧2^18像素,每秒32帧)通过内存中的环形缓冲区。(这是来自科学级相机,通过PCI帧抓取器)。我想对视频做一些简单的处理(剪辑动态范围、着色、添加叠加),然后使用C#在窗口中显示它

我使用Windows窗体和GDI(对于每个帧,构建一个位图对象,根据我的后处理步骤写入原始32位RGB像素值,然后使用Graphics类绘制帧)来完成这项工作。但这占用了我想用于其他事情的大量CPU。所以我对使用WPF进行GPU加速视频显示感兴趣。(我还想开始使用WPF的数据绑定和布局功能。)

但我以前从未使用过WPF,所以我不确定如何处理这个问题。我在网上找到的关于视频和WPF的大部分内容涉及从磁盘(如WMV)读取压缩视频文件,或使用Windows已经了解的驱动程序层从消费者级摄像头获取流。因此,它似乎不适用于这里(但纠正我,如果我错了这一点)

所以,我的问题是:

  • 是否有一种严格的、基于WPF的方式从内存中未压缩的原始字节播放视频(即使是8位灰度或24位RGB)

  • 我是否需要构建DirectShow过滤器(或其他DirectShow/Media Foundation之类的东西)才能在GPU上进行后期处理

此外,对于适合这些任务的文档、示例、博客等的任何一般性建议/建议,我们将不胜感激。谢谢



跟进:经过一些实验,我发现
WriteableBitmap
足够快,可以满足我的需要,并且非常容易正确使用:只需调用
WritePixels()
,任何绑定到它的
图像
控件都会自动更新<代码>InteropBitmap和内存映射部分的速度明显更快,但我不得不将p/invokes写入kernel32.dll,以便在.NET 3.5上使用它。

一些进一步的谷歌搜索产生了以下结果:


我现在正在研究,但这可能是正确的方法。当然,进一步的想法/建议仍然非常受欢迎。

我的VideoRenderElement虽然效率很高,但确实使用了一些黑客技术使其工作。您可能还想在.NET3.5SP1中试用WriteableBitmap


此外,InteropBitmap也非常快。比WB更高效,因为它不是双缓冲的。尽管它可能会被视频撕裂。

您应该已经正确链接了场外资源