Проблема "Нет свободного места на устройстве" при использовании нескольких камер
Когда я пытаюсь захватить видео с двух USB (uvc) камер, подключенных к одному порту USB, возникает ошибка:
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
- Raspberry Pi 3B, Ubuntu 16.04, USB 2
Метод: На каждой машине выполняется mjpg- streamer в режиме YUYV или MJPG для одной или двух камер.
Результат:
- Thinkpad T440p, Ubuntu 14.04.5, USB 2
- две камеры 320x240 YUYV работали на скорости 30 кадров в секунду.
- одна камера 320x240 MJPG работала на скорости 67 кадров в секунду.
- две камеры 320х240 MJPG не работали.
- Odroid XU4, Ubuntu 16.04.2, USB 3
- две камеры 320x240 YUYV работали на скорости 30 кадров в секунду.
- одна камера 320x240 MJPG работала на скорости 69 кадров в секунду.
- две камеры 320х240 MJPG не работали.
- Raspberry Pi 3B, Ubuntu 16.04, USB 2
- две камеры 320x240 YUYV работали на скорости 30 кадров в секунду.
- две камеры 320x240 MJPG работали на скорости 65 кадров в секунду.
Итак, на Raspberry Pi 3B мы могли передавать потоковое видео с двух камер в режиме MJPG со скоростью 60+ FPS, в то время как мы не могли сделать это на других машинах из-за ошибки "Нет свободного места на устройстве".
Я хочу знать, почему и как сделать это доступным на других машинах (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 кадров в секунду.
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 кадров в секунду.
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 кадров в секунду.
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 кадров в секунду.
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
Raspberry Pi 3B, Ubuntu 16.04, USB 2
не снимать
B: Alloc=-7151580/800 us (-893947%), #Int= -9, #Iso=-119193
две камеры 320x240 YUYV работали на скорости 30 кадров в секунду.
B: Alloc=-5395920/800 us (-674489%), #Int= -8, #Iso=-89932
две камеры 320x240 MJPG работали на скорости 65 кадров в секунду.
B: Alloc=-4363020/800 us (-545377%), #Int= -8, #Iso=-72717
Большое спасибо!
--Akihiko