在DirectShow中获取捕获的视频帧的不同方法

时间:2012-05-17 07:02:59

标签: directshow webcam samplegrabber

我正在使用回调机制来抓取媒体应用程序中的网络摄像头帧。它起作用,但由于在回调本身内执行了某些额外的缓冲区功能,因此速度很慢。

现在我正在尝试另一种获取帧的方法。也就是说,调用方法并抓取帧(而不是回调)。我在CodeProject中使用了一个使用IVMRWindowlessControl9 :: GetCurrentImage的示例。

我遇到了以下问题。

  1. 在微软网络摄像头中,预览不会在Windows 7上渲染(仅黑屏)。但是相同的摄像头在XP上渲染预览。
  2. 我怀疑的是,VMR特定功能是否依赖于不同平台上的摄像头驱动程序?否则,这种差异怎么会发生?

    1. 无论样本应用程序在哪里工作,我都观察到生成的BITMAPINFOHEADER结构的biBitCount成员是32.
    2. 这是应用程序设置的值还是VMR操作的驱动程序设置?这是如何配置的? 最后,哪个是抓住网络摄像头帧的最佳方法?回调方法?还是直接的方法?

      提前致谢,

1 个答案:

答案 0 :(得分:2)

IVMRWindowlessControl9::GetCurrentImage适用于偶尔的快照,而非常规图像抓取。

来自MSDN:

  

无论过滤器处于什么状态,都可以随时调用此方法   无论是跑步,停止还是暂停。 然而,经常打电话给   此方法会降低视频播放性能。

此方法从视频内存中读取,这首先是缓慢的。此方法会对RGB色彩空间进行转换(即再次缓慢),因为此格式最适合非流式应用,并且兼容性问题较少。

总而言之,你可以用它来定期抓图像,但这不是你应该做的。要以流速捕获,您需要在管道中使用过滤器,或使用带回调的Sample Grabber。