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

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

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

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

所以,我的问题:

>是否有基于WPF的直接方式从内存中的原始未压缩字节播放视频(即使只是8位灰度或24位RGB)?
>我是否需要构建DirectShow过滤器(或其他DirectShow / Media Foundation-ish的东西)才能在GPU上进行后期处理?

此外,任何适合这些任务的文档,示例,博客等的一般建议/建议将不胜感激.谢谢!

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

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

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

点赞