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 的回调中获得控制权(您应该更具体地了解您如何准确获取数据,SampleCBBufferCB),因此您得到了所得到的。

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

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

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

【讨论】:

我正在使用 BufferCB,因为我在处理之前修改了传入的缓冲区。 SampleCB 和 BufferCB 有什么区别? 我添加了另一个工作线程,问题解决了,谢谢 Roman!

以上是关于DirectShow.NET 控制相机设备缓冲区的数量的主要内容,如果未能解决你的问题,请参考以下文章

OpenHarmony Camera组件架构分析以及拍照流程源码解析

Android知识要点整理----控制相机

在 Forge 查看器中控制相机

哪些第三方平台支持自定义相机应用程序?

从连续的物理内存写入硬盘

EGL 错误:0x3003,相机设备遇到严重错误(Camera2 Api)