DirectShow.NET 控制相机设备缓冲区的数量
Posted
技术标签:
【中文标题】DirectShow.NET 控制相机设备缓冲区的数量【英文标题】:DirectShow.NET Controlling number of camera device buffers 【发布时间】:2014-07-15 09:41:19 【问题描述】:我正在尝试调试使用 DirectShow.NET 从 USB 摄像头流式传输帧时遇到的延迟问题。
我正在使用 SampleGrabber 捕获帧并对它们进行一些算法处理。 SampleGrabber 在 MJPEG 解码器之后连接,因此帧被解码,流配置为 30 FPS。 我看到的问题是当我的算法处理一帧的时间超过 33 毫秒时。在这种情况下,我看到了延迟效应——帧没有丢失,帧速率没有降低,只是迟到了。这表明设备驱动程序内部存在某种缓冲机制(通用 USB 摄像头 = 通用 DirectShow?),具有大量缓冲区,大约 16 个。
问题是,有人能解释一下这个问题,或许可以提出一种方法来设置设备中的缓冲区数量吗? 我发现接口IMemAllocator 允许通过成员方法更改缓冲区的数量:IMemAllocator::SetProperties,但是在 DirectShow.NET 中这是如何完成的呢?有人有这方面的经验吗?
【问题讨论】:
【参考方案1】:你试图控制你不应该控制的东西。分配器属性是您正在捕获视频的 Sample Grabber 过滤器的上游连接的控制范围。反过来,您只能在 Sample Grabber 的回调中获得控制权(您应该更具体地了解您如何准确获取数据,SampleCB
或 BufferCB
),因此您得到了所得到的。
基本上,您管理传入视频流的选项是:
-
使用
SampleCB
抓取并考虑在从SampleCB
回调返回之前,整个流线程被阻塞
将数据复制到内部缓冲区以进行异步处理并尽快返回,释放流线程并让它以最大速率运行
为了获得更大的灵活性,您应该使用自定义过滤器而不是 Sample Grabber。
【讨论】:
我正在使用 BufferCB,因为我在处理之前修改了传入的缓冲区。 SampleCB 和 BufferCB 有什么区别? 我添加了另一个工作线程,问题解决了,谢谢 Roman!以上是关于DirectShow.NET 控制相机设备缓冲区的数量的主要内容,如果未能解决你的问题,请参考以下文章