以C#:WPF与Win形式显示原始未压缩字节源的实时视频
我有一个实时的16位灰度视频流,作为未压缩的原始字节流(每像素2字节,每帧2^18像素,每秒32帧)通过内存中的环形缓冲区。(这是来自科学级相机,通过PCI帧抓取器)。我想对视频做一些简单的处理(剪辑动态范围、着色、添加叠加),然后使用C#在窗口中显示它 我使用Windows窗体和GDI(对于每个帧,构建一个位图对象,根据我的后处理步骤写入原始32位RGB像素值,然后使用Graphics类绘制帧)来完成这项工作。但这占用了我想用于其他事情的大量CPU。所以我对使用WPF进行GPU加速视频显示感兴趣。(我还想开始使用WPF的数据绑定和布局功能。) 但我以前从未使用过WPF,所以我不确定如何处理这个问题。我在网上找到的关于视频和WPF的大部分内容涉及从磁盘(如WMV)读取压缩视频文件,或使用Windows已经了解的驱动程序层从消费者级摄像头获取流。因此,它似乎不适用于这里(但纠正我,如果我错了这一点) 所以,我的问题是:以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加速视频显示感兴
- 是否有一种严格的、基于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更高效,因为它不是双缓冲的。尽管它可能会被视频撕裂。您应该已经正确链接了场外资源