DirectShow.NET控制摄像机设备缓冲区的数量

时间:2014-05-26 15:10:12

标签: video camera directshow video-capture directshow.net

我尝试调试使用DirectShow.NET从USB摄像头流式传输帧时遇到的延迟问题。

我使用SampleGrabber捕获帧并对它们进行一些算法处理。 SampleGrabber在MJPEG解码器之后连接,因此帧被解码,流配置为30 FPS。 我看到的问题是我的算法需要超过33毫秒来处理帧。在那种情况下,我看到了延迟效应 - 帧不会丢失,帧速率不会降低,而只是迟到。这表明设备驱动程序(通用USB摄像头=通用DirectShow?)内部有一种缓冲机制,具有大量缓冲区,大约16个。

问题是,有人可以对这个问题有所了解,并且可能建议一种设置设备中缓冲区数量的方法吗? 我发现接口IMemAllocator允许通过成员方法更改缓冲区的数量:IMemAllocator :: SetProperties,但是如何在DirectShow.NET中完成?有人有经验吗?

1 个答案:

答案 0 :(得分:1)

你正试图控制你不应该控制的东西。分配器属性是您正在捕获视频的Sample Grabber过滤器的上游连接的控制范围。您反过来只能控制Sample Grabber的回调(您应该更准确地了解数据的准确性,SampleCBBufferCB),这样您就能获得所需的数据。

基本上,您管理传入视频流的选项包括:

  1. 抓取SampleCB并考虑在从SampleCB回调返回之前,整个流媒体线程被阻止
  2. 将数据复制到内部缓冲区以进行异步处理并返回ASAP,释放流线程并让它以最大速率运行
  3. 为了获得更大的灵活性,您应该使用自定义过滤器而不是Sample Grabber。