rac*_*erp 32 linux usb webcam debian bandwidth
在 Debian/Linux 中运行多个 USB 网络摄像头会导致以下错误:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
Run Code Online (Sandbox Code Playgroud)
在运行 cheese 和 xawtv 产生相同的错误后,最初似乎是 OpenCV 中的一个编程问题变成了对神秘硬件/软件问题的探索。
显然,这是由网络摄像头请求 USB 主机控制器上的所有可用带宽引起的。考虑到这一点,我决定运行wireshark和capinfos来查看单个摄像头使用了多少带宽。
4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720
Run Code Online (Sandbox Code Playgroud)
有趣的!这或许可以解释为什么两个 320x240 的摄像头可以工作,但任何更高的分辨率都失败了。就好像我的 USB 控制器仅以 USB 1 的速度运行,但lsusb显示属于一个据称支持每秒 480 兆位的设备的两个网络摄像头。
一种解决方案提出强制网络摄像头计算其带宽使用情况,而不是通过运行以下命令来请求最大带宽:
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有什么区别,所以我决定尝试另一种解决方案。StackOverflow 上的一篇文章建议告诉我的网络摄像头使用较低的 FPS 或像 MJPEG 这样的压缩视频格式,但在运行v4lctl list后,我的两个网络摄像头似乎都不支持更改其视频模式。
这就是我被困的地方。为什么两个网络摄像头的运行速度远低于 USB 2 的最大速度会产生此错误?
ps:这不是磁盘空间问题,网络摄像头启动时 df 显示没有变化。
pps:如果它有所作为,这里是 lsusb 的输出
rac*_*erp 26
叮叮!在freenode上#v4l的好人的帮助下设法解决了这个问题。
长话短说:v4l2-ctl是调试 USB 摄像头问题的最佳工具。阅读所有可用的命令和手册页,我保证会很有趣。使用v4l2-ctl我发现我的一台相机不支持任何压缩视频模式。您可以通过运行以下命令来检查您的相机支持哪些模式:
v4l2-ctl -d /dev/video0 --list-formats
Run Code Online (Sandbox Code Playgroud)
哪个应该输出这样的东西。
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : MJPEG
Index : 1
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUV 4:2:2 (YUYV)
Run Code Online (Sandbox Code Playgroud)
如果返回的唯一像素格式是“YUYV”、“IUYV”、“I420”或“GBRG”,您将只能为每个 USB 控制器运行一台相机*,因为这些格式是未压缩的。使用支持 MJPEG 或其他某种压缩形式的多个网络摄像头可以正常工作。
如果您像我一样使用 OpenCV,请不要担心默认像素格式是否未压缩,因为 OpenCV 似乎默认使用压缩。
**除非您对 320x240 或更低的分辨率感到满意。*
答案是使用 SwDevRefugee 编写的 uvcvideo 修改,如上所述。他和我一起努力为 OpenWrt 编译了修改过的代码,并取得了成功。我运行它的版本是 OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130),在 tplink wdr3600 路由器上:
结果:我可以通过 USB 2.0 集线器以 MJPG 格式以 1280x960 和 15fps 的速度同时运行 3*c270(罗技)。我没有第四个 c270 可以连接,抱歉。
我也可以使用 YUV 格式的 2*c270 和 1*GEMBIRD 640*480*15fps,但是添加第二个 GMBIRD 会导致可怕的“无法开始捕获:设备上没有剩余空间”(空间==带宽,就像你一样)熟悉:))。请注意 GEMBIRD (1908:2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/。
3*c270 的 CPU 使用率在 wdr3600 上相当合理:
Mem: 50600K used, 75444K free, 320K shrd, 3436K buff, 8800K cached
CPU: 16% usr 27% sys 0% nic 45% idle 0% io 0% irq 10% sirq
Load average: 1.20 0.85 0.44 4/60 2546
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
2240 1679 root S 15348 12% 17% mjpg_streamer --input input_uvc.so --
2505 1679 root S 15368 12% 11% mjpg_streamer --input input_uvc.so --
2239 1679 root S 15532 12% 11% mjpg_streamer --input input_uvc.so --
Run Code Online (Sandbox Code Playgroud)
如果社区给予一些声望和支持,我认为 SwDevRefugee 愿意将代码引入 uvc-linux。
小智 5
我查看了 uvcvideo 驱动程序,如果流是 mjpeg 压缩的,则 quirks=128 模块参数将被忽略。
我选择的网络摄像头是 Logitech C500 和 Logitech C270,我发现 C500 在 1280x1024 下生成的图像为 100kbytes,而 C270 在 1280x960 下生成的图像为 200kbytes。
如果我以 10fps 运行 C270,则所需的比特率为 10x200000x8 = 16Mbit/s。在 Ubuntu 14.04 中,uvcdriver 模块始终分配 196Mbits/s,无论帧速率如何。对于 C500 来说,它的表现要好一些,但仍然占用带宽。
我修改了uvcvideo驱动程序,以便可以通过V4L2接口向驱动程序提供“压缩”因子。这是一个“小黑客”,因为我使用 struct v4l2_pix_format 中的 priv 属性来指定值。在驱动程序中,它会计算未压缩图像的大小,然后除以压缩系数以计算出要使用的 USB 带宽。
默认情况下,我使用的压缩系数为 10,如果相机遇到特别难以压缩的图像,则可以留出很大的余量。以 1280x960 和 10fps 运行的 C270 现在使用 41Mbit/s,我可以轻松地在一辆总线上运行 4 个摄像机。
如果有人对此功能感兴趣,那么我将尝试让 uvcvideo 维护者考虑“压缩”因子概念。
| 归档时间: |
|
| 查看次数: |
54581 次 |
| 最近记录: |