【问题标题】:DirectShow.NET Controlling number of camera device buffersDirectShow.NET 控制相机设备缓冲区的数量
【发布时间】:2014-07-15 09:41:19
【问题描述】:

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

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

问题是,有人能解释一下这个问题,或许可以提出一种方法来设置设备中的缓冲区数量吗? 我发现接口IMemAllocator 允许通过成员方法更改缓冲区的数量:IMemAllocator::SetProperties,但是在 DirectShow.NET 中这是如何完成的呢?有人有这方面的经验吗?

【问题讨论】:

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


    【解决方案1】:

    你试图控制你不应该控制的东西。分配器属性是您正在捕获视频的 Sample Grabber 过滤器的上游连接的控制范围。反过来,您只能在 Sample Grabber 的回调中获得控制权(您应该更具体地了解您如何准确获取数据,SampleCBBufferCB),因此您得到了所得到的。

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

    1. 使用SampleCB 抓取并考虑在从SampleCB 回调返回之前,整个流线程被阻塞
    2. 将数据复制到内部缓冲区以进行异步处理并尽快返回,释放流线程并让它以最大速率运行

    为了获得更大的灵活性,您应该使用自定义过滤器而不是 Sample Grabber。

    【讨论】:

    • 我正在使用 BufferCB,因为我在处理之前修改了传入的缓冲区。 SampleCB 和 BufferCB 有什么区别?
    • 我添加了另一个工作线程,问题解决了,谢谢 Roman!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多