A execução de mais de uma webcam USB no Debian / Linux resulta no seguinte erro:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
O que inicialmente parecia ser um problema de programação no OpenCV se transformou em uma busca por um misterioso problema de hardware / software depois que os mesmos erros foram produzidos pela execução de cheese e xawtv.
Aparentemente, isso é causado por webcams solicitando toda a largura de banda disponível no controlador host USB. Com isso em mente, decidi executar o wireshark e o capinfos para ver quanta largura de banda uma única câmera usava.
4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720
Interessante! Isso pode explicar por que duas câmeras de 320x240 funcionam, mas qualquer resolução maior falha. É como se meu controlador USB estivesse operando apenas na velocidade USB 1, mas o lsusb mostra as duas webcams pertencentes a um dispositivo que supostamente suporta 480 megabits por segundo.
Uma solução proposta forçou as webcams a calcular seu uso de largura de banda em vez de solicitar o máximo executando os seguintes comandos:
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
Infelizmente, isso não fez diferença, então decidi tentar outra solução. Uma publicação no StackOverflow sugeriu que minhas webcams usassem um FPS menor ou formato de vídeo compactado como MJPEG, mas depois de executar a lista v4lctl , não parece que nenhuma das minhas webcams suporta a alteração do modo de vídeo.
E é aí que eu estou preso. Por que duas webcams operando bem abaixo da velocidade máxima do USB 2 produziriam esse erro?
ps: não é um problema de espaço em disco, o df não mostra alterações quando as webcams são iniciadas.
pps: se isso faz diferença, aqui está a saída do lsusb
v4l2-ctl
é realmente uma excelente ferramenta para depuração. Descobri muito sobre minha câmera e consegui resolver o problema. De qualquer forma, consegui corrigi-lo forçando a resolução da câmera320x240
e usando-oYUYV
como modo de saída da câmera.guvcview
também ajudou muito.A resposta é usar as modificações uvcvideo escritas por SwDevRefugee e descritas acima. Ele e eu trabalhamos juntos para compilar o código modificado para o OpenWrt, com sucesso. A versão na qual estou executando o é o OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130), em um roteador tplink wdr3600:
RESULTADO: Posso ter 3 * c270 (logitech) executando simultaneamente em 1280x960 e 15fps no formato MJPG, através de um hub USB 2.0. Eu não tenho um quarto c270 para ligar, desculpe.
Também posso ter 2 * c270 e 1 * GEMBIRD 640 * 480 * 15fps no formato YUV, mas adicionar um segundo GEMBIRD leva ao temido "Não é possível iniciar a captura: não resta espaço no dispositivo" (espaço == largura de banda aqui, como você conhecer bem:)). Observe que GEMBIRD (1908: 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .
O uso da CPU com 3 * c270 é bastante razoável em um wdr3600:
Se a comunidade der alguma reputação e suporte, acho que o SwDevRefugee está disposto a inserir o código no uvc-linux.
fonte
Eu olhei para o driver uvcvideo e o parâmetro quirks = 128 module será ignorado se o fluxo for mjpeg compactado.
Minhas webcams escolhidas foram o Logitech C500 e o Logitech C270, e descobri que a imagem produzida pelo C500 em 1280x1024 tem 100kbytes e a imagem produzida pelo C270 em 1280x960 é 200kbytes.
Se eu rodar o C270 a 10fps, a taxa de bits necessária é 10x200000x8 = 16Mbit / s. No Ubuntu 14.04, o módulo uvcdriver sempre aloca 196Mbits / s, independentemente da taxa de quadros. Para o C500, ele se comporta um pouco melhor, mas ainda é um porco da largura de banda.
Modifiquei o driver uvcvideo para fornecer um fator de "compactação" ao driver por meio da interface V4L2. É um "pequeno hacky", porque usei o atributo priv na estrutura v4l2_pix_format para especificar o valor. No driver, ele calcula o tamanho da imagem não compactada e depois divide pelo fator de compactação para determinar qual largura de banda USB usar.
Por padrão, eu uso um fator de compressão 10, que permite uma grande margem, se a câmera encontrar uma imagem particularmente difícil de compactar. O C270 rodando em 1280x960 e 10fps agora usa 41Mbit / se eu posso rodar facilmente 4 câmeras em um barramento.
Se alguém estiver interessado nesse recurso, tentarei convencer os mantenedores do uvcvideo a considerar o conceito do fator "compressão".
fonte
Também obtive esse erro de falta de espaço. O que funcionou foi desconectar uma das câmeras e conectá-la a outra porta USB no meu PC estacionário - existem cerca de 6 ou 7 portas USB espalhadas por ela. Executar 'show_webcams 0 1' e, de repente, trouxe as duas imagens.
fonte