首页 文章

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

提问于
浏览
4

我有一个实时的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上进行后期处理?

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


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

2 回答

  • 1

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

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

  • 1

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

    http://www.codeplex.com/VideoRendererElement

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

相关问题