在C#中显示来自原始未压缩字节源的实时video:WPF与Win表单

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

我使用Windows Forms和GDI工作(对于每个帧,构建一个Bitmap对象,根据我的后处理步骤写入原始的32位RGB像素值,然后使用Graphics类绘制帧)。 但是这使用了我想要用于其他事情的大量CPU。 所以我对使用WPF进行GPU加速video显示感兴趣。 (我也想开始使用WPF来实现其数据绑定和布局function。)

但我之前从未使用过WPF,所以我不确定如何处理这个问题。 我在网上发现的关于video和WPF的大多数内容涉及从磁盘(例如WMV)读取压缩video文件,或者使用Windows已经理解的驱动程序层从消费级相机获取流。 所以它似乎不适用于此(但如果我错了,请纠正我)。

所以,我的问题:

  • 是否有基于WPF的直接方式从内存中的原始未压缩字节播放video(即使只是8位灰度或24位RGB)?

  • 我是否需要构建DirectShowfilter(或其他DirectShow / Media Foundation-ish的东西)才能在GPU上进行后期处理?

此外,任何适合这些任务的文档,示例,博客等的一般建议/建议都将受到赞赏。 谢谢!


后续:经过一些实验,我发现WriteableBitmap足够快,满足我的需求,并且非常容易正确使用:只需调用WritePixels() ,任何绑定到它的Image控件都会自行更新。 具有内存映射部分的InteropBitmap明显更快,但我不得不将p / InteropBitmap写入kernel32.dll以在.NET 3.5上使用它。

我的VideoRendererElement虽然效率很高,但确实使用了一些hackery来使它工作。 您可能还想尝试.NET 3.5 SP1中的WriteableBitmap。

InteropBitmap也非常快。 它比WB更高效,因为它不是双缓冲的。 虽然它可能会受到video撕裂。

一些进一步的Google搜索产生了这样的结果:

http://www.codeplex.com/VideoRendererElement

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