我有一个实时 16 位灰度视频流,它作为原始未压缩字节流(每像素 2 个字节,2^18 像素/帧,32 帧/秒)通过内存中的环形缓冲区推送。(这是来自科学级相机,通过 PCI 图像采集卡)。我想对视频进行一些简单的处理(剪辑动态范围、着色、添加叠加),然后使用 C# 在窗口中显示它。
我使用 Windows 窗体和 GDI 进行这项工作(对于每个帧,构建一个位图对象,根据我的后处理步骤写入原始 32 位 RGB 像素值,然后使用 Graphics 类绘制帧)。但这使用了我想用于其他事情的大量 CPU。所以我有兴趣将 WPF 用于其 GPU 加速的视频显示。(我也想开始使用 WPF 的数据绑定和布局功能。)
但我以前从未使用过 WPF,所以我不确定如何处理这个问题。我在网上找到的关于视频和 WPF 的大部分内容都涉及从磁盘读取压缩视频文件(例如 WMV),或者使用 Windows 已经理解的驱动程序层从消费级相机获取流。所以它似乎不适用于这里(但如果我错了,请纠正我)。
所以,我的问题:
是否有一种直接的、基于 WPF 的方式来从内存中的原始、未压缩字节播放视频(即使只是 8 位灰度或 24 位 RGB)?
我是否需要构建 DirectShow 过滤器(或其他 DirectShow/Media Foundation 类似的东西)才能在 GPU 上进行后处理?
此外,任何适用于这些任务的文档、示例、博客等的一般建议/建议将不胜感激。谢谢!
跟进:经过一些实验,我发现WriteableBitmap
它足够快,可以满足我的需求,并且非常容易正确使用:只需调用它WritePixels()
,任何Image
绑定到它的控件都会自行更新。 InteropBitmap
内存映射部分明显更快,但我必须将 p/invokes 写入 kernel32.dll 才能在 .NET 3.5 上使用它。