Quando tento capturar vídeo de duas câmeras usb (uvc) conectadas em uma única porta USB, há um erro:
libv4l2: error turning on stream: No space left on device
Unable to start capture: No space left on device
Eu sei que isso é um problema conhecido; às vezes isso acontece porque não há largura de banda disponível na porta usb e, às vezes, podemos resolver isso por meio dos comandos sudo rmmod uvcvideo; sudo modprobe uvcvideo quirks=128
.
No entanto, descobri que quase na mesma condição (USB 2, dois mesmos dispositivos de câmera), podemos obter fluxo de vídeo em algumas máquinas, e não podemos fazer em algumas máquinas. O abaixo é minha investigação. Eu quero saber por que eles acontecem, e mais interessante, como transmitir de duas ou mais câmeras em geral.
Experiências :
Câmeras que eu usei: ELP-USBFHD01M-L180
Saída de v4l2-ctl --list-formats-ext
(usamos apenas 320x240; outras resoluções são omitidas):
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)
Máquinas:
Método: Em cada máquina, executando mjpg-streamer no modo YUYV ou modo MJPG para uma ou duas câmeras. / p>
Resultado:
Assim, no Raspberry Pi 3B, podemos transmitir vídeo de duas câmeras no modo MJPG a 60+ FPS, enquanto não poderíamos fazer isso nas outras máquinas devido ao erro "Nenhum espaço deixado no dispositivo".
Eu quero saber por que e como disponibilizá-lo nas outras máquinas (Thinkpad, Odroid).
De acordo com esta questão , eu verifiquei:
cat /sys/kernel/debug/usb/devices | grep "B: "
ao transmitir a partir das câmeras.
Resultado:
Thinkpad T440p, Ubuntu 14.04.5, USB 2
sem câmera
3:B: Alloc= 0/800 us ( 0%), #Int= 1, #Iso= 0
56:B: Alloc= 0/800 us ( 0%), #Int= 3, #Iso= 0
duas câmeras 320x240 YUYV trabalhavam a 30 fps.
3:B: Alloc=512/800 us (64%), #Int= 4, #Iso= 10
113:B: Alloc= 0/800 us ( 0%), #Int= 3, #Iso= 0
uma câmera 320x240 MJPG trabalhou a 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
sem câmera
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
duas câmeras 320x240 YUYV trabalhavam a 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
uma câmera 320x240 MJPG trabalhou a 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
Raspberry Pi 3B, Ubuntu 16.04, USB 2
sem câmera
B: Alloc=-7151580/800 us (-893947%), #Int= -9, #Iso=-119193
duas câmeras 320x240 YUYV trabalhavam a 30 fps.
B: Alloc=-5395920/800 us (-674489%), #Int= -8, #Iso=-89932
duas câmeras 320x240 MJPG trabalhavam a 65 fps.
B: Alloc=-4363020/800 us (-545377%), #Int= -8, #Iso=-72717
Muito obrigado!
--Akihiko