Cer*_*rin 6 linux usb webcam bandwidth usb-2
您如何限制 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
Run Code Online (Sandbox Code Playgroud)
谷歌搜索这个错误通常会得到这样的答案,“你是 SOL,也许购买支持 MJPG 的相机?”。
但这完全没有意义。
捕获未压缩的 160x120 RGB 等于 160*120*3 = 每帧 57600 字节。在 15 FPS 时,这至少需要每秒 864000 字节的带宽(即高达0.864 Mbps或6.912 Mbits)!我有支持480 Mbit/s 的USB2 集线器。我应该有足够的带宽同时运行几十个这样的网络摄像头,但运行一个网络摄像头几乎消耗了我 USB 集线器的所有 480 Mbits!
由于相机不需要 480 Mbps 来流式传输 160x120,但它告诉驱动程序分配那么多,有没有办法在操作系统级别强制驱动程序分配一定数量?
小智 3
这个人提供了一个似乎对某些人有用的解决方案。就我而言,我已经尝试过了,但它没有改变任何东西,但它非常依赖于硬件。
uvcvideo 内核模块可以设置为忽略请求的带宽,并计算正确的带宽。尝试:
Run Code Online (Sandbox Code Playgroud)sudo rmmod uvcvideo sudo modprobe uvcvideo quirks=128每次重新启动都会重置此值。如果有效,请创建以下文件:
Run Code Online (Sandbox Code Playgroud)sudo vi /etc/modprobe.d/uvcvideo.conf包含行:
Run Code Online (Sandbox Code Playgroud)options uvcvideo quirks=128
事实上,在这个页面中,他们说这可能并不总是有效,他们甚至提供了更改驱动程序的函数 uvc_init_video() 中的代码的选项:
Run Code Online (Sandbox Code Playgroud)/* Isochronous endpoint, select the alternate setting. */ bandwidth = stream->ctrl.dwMaxPayloadTransferSize;
| 归档时间: |
|
| 查看次数: |
3828 次 |
| 最近记录: |