我喜欢在 Windows 10 电脑上设置三个网络摄像头,以便同时从所有三个摄像头捕获视频。所有三个 USB2.0 摄像头都连接到有源 USB3.0 集线器,该集线器连接到 PC。这些摄像头将以低分辨率、低 FPS 模式使用,因此 USB3.0(甚至 USB2.0)的带宽足以满足这三个低分辨率、低 FPS 流的需求。
然而,问题在于,摄像机正在向控制器报告其最大分辨率、最大 FPS 流的带宽要求,因此如果连接到同一个 USB 主控制器,UVC 驱动程序将不允许同时使用三个摄像机(甚至两个也不行)。
我已设法使用三个独立的 USB 控制器设置了三个摄像头(一个内置于我的笔记本电脑中,两个位于我的扩展坞中,其中一个是 USB2.0,一个位于 USB3.0 端口),因此问题显然是通过使用集线器将它们连接到同一个控制器而引起的。
不幸的是,要求是构建一个包含三个摄像头的最终产品,并从外部有一个 USB 端口,因此我们需要使用集线器。
我们已经尝试了此设置的 Linux 版本,并设法使用 Linuxuvcvideo
驱动程序的其中一种“怪癖”模式使其正常工作,称为UVC_QUIRK_FIX_BANDWIDTH
:
尝试估算未压缩流所需的带宽,而不是依赖相机报告的值。有关更多信息,请参阅常见问题解答 7。
由于 uvcvideo 驱动程序无法知道设备需要多少带宽,因此设备负责尽可能准确地向驱动程序报告所需带宽量。视频流接口的每个替代设置都对应相关端点的一个可能的带宽值,然后驱动程序选择带宽最低且高于或等于设备请求带宽的替代设置。
虽然大多数设备都实现了几种替代设置,并且只请求它们真正需要的带宽量,但有些设备总是请求单个端点可用的最大带宽,等于 198.608 Mb/s(不包括协议开销)。该带宽的两倍将超过高速 USB 限制,从而导致 -27(-ENOSPC)错误。
如果设备实现了多个备用设置,驱动程序可以忽略请求的带宽并选择较低的带宽备用设置。当前,在使用未压缩格式时,此行为是通过 FIX_BANDWIDTH 怪癖实现的。压缩格式更难解决,因为驱动程序无法估计设备实际需要多少带宽。
FIX_BANDWIDTH 怪癖可以安全启用,而不会对系统稳定性产生任何不利影响,因为它仅影响 UVC 设备。在极少数情况下,理论上它可能低估所需的 USB 带宽,导致 USB 数据包丢失和图像损坏。截至目前,实践中尚未报告此类情况。
通过将 uvcvideo 模块跟踪参数设置为 0x400,您可以了解设备请求了多少带宽以及驱动程序选择了哪种替代设置。驱动程序会将与带宽相关的信息打印到内核日志中。
更多详细信息请参见此处:http://www.ideasonboard.org/uvc/faq/
因此,我想在 Windows 上做类似的事情,让 UVC 驱动程序忽略摄像机报告的带宽,因为实际带宽将比报告的低得多。
有什么办法吗?比如使用一些替代驱动程序,或修改当前驱动程序以允许这种“怪癖”?