我有一个实时的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()
和任何{绑定到它的{1}}控件将自行更新。具有内存映射部分的Image
明显更快,但我不得不将p / invokes写入kernel32.dll以在.NET 3.5上使用它。
答案 0 :(得分:1)
进一步的Google搜索产生了这一点:
http://www.codeplex.com/VideoRendererElement
我现在正在研究,但这可能是正确的方法。当然,进一步的想法/建议仍然非常受欢迎。
答案 1 :(得分:1)
我的VideoRendererElement虽然效率很高,但确实使用了一些hackery来使其工作。您可能还想尝试使用.NET 3.5 SP1中的WriteableBitmap。
InteropBitmap也非常快。比WB更有效,因为它不是双缓冲的。虽然它可能会受到视频撕裂的影响。