Проблема "Нет свободного места на устройстве" при использовании нескольких камер

Когда я пытаюсь захватить видео с двух 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

0 ответов

Другие вопросы по тегам