我尝试调试使用DirectShow.NET从USB摄像头流式传输帧时遇到的延迟问题。
我使用SampleGrabber捕获帧并对它们进行一些算法处理。 SampleGrabber在MJPEG解码器之后连接,因此帧被解码,流配置为30 FPS。 我看到的问题是我的算法需要超过33毫秒来处理帧。在那种情况下,我看到了延迟效应 - 帧不会丢失,帧速率不会降低,而只是迟到。这表明设备驱动程序(通用USB摄像头=通用DirectShow?)内部有一种缓冲机制,具有大量缓冲区,大约16个。
问题是,有人可以对这个问题有所了解,并且可能建议一种设置设备中缓冲区数量的方法吗? 我发现接口IMemAllocator允许通过成员方法更改缓冲区的数量:IMemAllocator :: SetProperties,但是如何在DirectShow.NET中完成?有人有经验吗?
答案 0 :(得分:1)
你正试图控制你不应该控制的东西。分配器属性是您正在捕获视频的Sample Grabber过滤器的上游连接的控制范围。您反过来只能控制Sample Grabber的回调(您应该更准确地了解数据的准确性,SampleCB
或BufferCB
),这样您就能获得所需的数据。
基本上,您管理传入视频流的选项包括:
SampleCB
并考虑在从SampleCB
回调返回之前,整个流媒体线程被阻止为了获得更大的灵活性,您应该使用自定义过滤器而不是Sample Grabber。