当我尝试从连接在单个 USB 端口上的两个 USB(UVC)摄像头捕获视频时出现错误:
libv4l2: error turning on stream: No space left on device
Unable to start capture: No space left on device
我知道这是一个已知问题;有时这是因为 USB 端口上没有剩余带宽,有时我们可以通过sudo rmmod uvcvideo; sudo modprobe uvcvideo quirks=128
命令解决这个问题。
但是我发现在几乎相同的条件下(USB 2,两个相同的摄像头设备),我们可以在某些机器上获得视频流,而在某些机器上则无法获得。以下是我的调查。我想知道为什么会发生这种情况,更有趣的是,如何从两个或更多个摄像头进行流式传输。
实验:
我使用的相机:ELP-USBFHD01M-L180
输出v4l2-ctl --list-formats-ext
(我们仅使用 320x240;省略其他分辨率):
ioctl: VIDIOC_ENUM_FMT
Index : 0
Type : Video Capture
Pixel Format: 'MJPG' (compressed)
Name : Motion-JPEG
Size: Discrete 320x240
Interval: Discrete 0.008s (120.101 fps)
Index : 1
Type : Video Capture
Pixel Format: 'YUYV'
Name : YUYV 4:2:2
Size: Discrete 320x240
Interval: Discrete 0.033s (30.000 fps)
机器:
- Thinkpad T440p,Ubuntu 14.04.5,USB 2
- Odroid XU4,Ubuntu 16.04.2,USB 3
- 树莓派 3B,Ubuntu 16.04,USB 2
方法:在每台机器上执行mjpg-streamer适用于一台或两台摄像机的 YUYV 模式或 MJPG 模式。
结果:
- Thinkpad T440p,Ubuntu 14.04.5,USB 2
- 两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
- 一台相机 320x240 MJPG 以 67 fps 的速度工作。
- 两个摄像头 320x240 MJPG 无法工作。
- Odroid XU4,Ubuntu 16.04.2,USB 3
- 两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
- 一台相机 320x240 MJPG 以 69 fps 的速度工作。
- 两个摄像头 320x240 MJPG 无法工作。
- 树莓派 3B,Ubuntu 16.04,USB 2
- 两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
- 两个 320x240 MJPG 摄像机以 65 fps 的速度工作。
因此,在 Raspberry Pi 3B 上,我们可以以 60+ FPS 的速度从两个摄像头以 MJPG 模式流式传输视频,而由于“设备上没有剩余空间”错误,我们无法在其他机器上执行此操作。
我想知道为什么,以及如何在其他机器(Thinkpad,Odroid)上提供此功能。
根据这个问题, 我检查了:
cat /sys/kernel/debug/usb/devices | grep "B: "
从摄像机流式传输时。
结果:
Thinkpad T440p,Ubuntu 14.04.5,USB 2
没有相机
3:B: Alloc= 0/800 us ( 0%), #Int= 1, #Iso= 0
56:B: Alloc= 0/800 us ( 0%), #Int= 3, #Iso= 0
两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
3:B: Alloc=512/800 us (64%), #Int= 4, #Iso= 10
113:B: Alloc= 0/800 us ( 0%), #Int= 3, #Iso= 0
一台相机 320x240 MJPG 以 67 fps 的速度工作。
3:B: Alloc=488/800 us (61%), #Int= 3, #Iso= 5
113:B: Alloc= 0/800 us ( 0%), #Int= 3, #Iso= 0
Odroid XU4,Ubuntu 16.04.2,USB 3
没有相机
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 39/900 us ( 4%), #Int= 2, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 9
B: Alloc= 39/900 us ( 4%), #Int= 2, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
一台相机 320x240 MJPG 以 69 fps 的速度工作。
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 5
B: Alloc= 39/900 us ( 4%), #Int= 2, #Iso= 0
B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0
树莓派 3B,Ubuntu 16.04,USB 2
没有相机
B: Alloc=-7151580/800 us (-893947%), #Int= -9, #Iso=-119193
两个摄像机 320x240 YUYV 以 30 fps 的速度工作。
B: Alloc=-5395920/800 us (-674489%), #Int= -8, #Iso=-89932
两个 320x240 MJPG 摄像机以 65 fps 的速度工作。
B: Alloc=-4363020/800 us (-545377%), #Int= -8, #Iso=-72717
非常感谢!
--Akihiko