如何限制 USB 设备在 Linux 上可分配的带宽量?
我有几个便宜的 USB 网络摄像头,我想同时运行它们。运行结果v4l2-ctl --list-formats-ext --device=/dev/videoN
表明它们都支持 30 和 15 FPS 的几种未压缩分辨率。
但是,即使我将一个摄像头配置为以 15 FPS 和 160x120 分辨率进行捕获,它仍会分配 480 Mbps 的带宽,这通常会阻止我使用任何其他 USB 设备,更不用说第二个网络摄像头了。尝试以相同的 FPS/分辨率从第二个网络摄像头进行捕获会导致错误:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
谷歌搜索此错误通常会导致这样的答案,“你是 SOL,也许买一个支持 MJPG 的相机?”。
但这根本没有意义。
捕获未压缩的 160x120 RGB 相当于每帧 160*120*3 = 57600 字节。在 15 FPS 下,这至少需要每秒 864000 字节的带宽(即高达0.864 Mbps或者6.912兆位)!我有 USB2 集线器,它支持480兆位/秒。我应该有足够的带宽来同时运行几十个这样的网络摄像头,但运行一个网络摄像头就几乎消耗了我的 USB 集线器的全部 480 Mbits!
由于相机不需要 480 Mbps 来传输 160x120,但它告诉驱动程序分配那么多,在操作系统级别,有没有什么方法可以强制驱动程序分配一定量?
答案1
这家伙提供一个办法对某些人来说这似乎有用。就我而言,我试过了,但什么也没改变,但这非常依赖于硬件。
可以将 uvcvideo 内核模块设置为忽略请求的带宽,并计算正确的带宽。尝试:
sudo rmmod uvcvideo sudo modprobe uvcvideo quirks=128
每次重启都会重置。如果成功,请创建以下文件:
sudo vi /etc/modprobe.d/uvcvideo.conf
包含以下行:
options uvcvideo quirks=128
确实,在这一页他们说这可能并不总是有效,他们甚至提供了在驱动程序的函数 uvc_init_video() 中更改代码的选项:
/* Isochronous endpoint, select the alternate setting. */ bandwidth = stream->ctrl.dwMaxPayloadTransferSize;