Ejecutar más de una cámara web USB en Debian / Linux da como resultado el siguiente error:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
Lo que inicialmente parecía ser un problema de programación en OpenCV se convirtió en una búsqueda de un misterioso problema de hardware / software después de que se produjeran los mismos errores al ejecutar cheese y xawtv.
Aparentemente es causado por cámaras web que solicitan todo el ancho de banda disponible en el controlador host USB. Con eso en mente, decidí ejecutar wireshark y capinfos para ver cuánto ancho de banda usaba una sola cámara.
4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720
¡Interesante! Eso podría explicar por qué funcionan dos cámaras a 320x240 pero falla cualquier resolución más alta. Es como si mi controlador USB solo funcionara a velocidades de USB 1, pero lsusb muestra ambas cámaras web que pertenecen a un dispositivo que supuestamente admite 480 megabits por segundo.
Una solución propuso obligar a las cámaras web a calcular su uso de ancho de banda en lugar de solicitar su máximo ejecutando los siguientes comandos:
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
Lamentablemente, eso no marcó la diferencia, así que decidí probar otra solución. Una publicación en StackOverflow sugirió decirles a mis cámaras web que utilicen un formato de video comprimido o FPS más bajo como MJPEG, pero después de ejecutar la lista v4lctl , no parece que ninguna de mis cámaras web admita cambiar su modo de video.
Y ahí es donde estoy atrapado. ¿Por qué dos cámaras web que funcionan muy por debajo de la velocidad máxima de USB 2 producirían este error?
ps: no es un problema de espacio en disco, df no muestra ningún cambio cuando se inician las cámaras web.
pps: si hace la diferencia, aquí está la salida de lsusb
v4l2-ctl
De hecho, es una excelente herramienta para la depuración. Descubrí mucho sobre mi cámara y pude solucionar el problema. De todos modos, pude solucionarlo al forzar la resolución de mi cámara320x240
y usarlaYUYV
como el modo de salida de la cámara.guvcview
También ayudó mucho.La respuesta es usar las modificaciones de uvcvideo escritas por SwDevRefugee y descritas anteriormente. Él y yo hemos trabajado juntos para obtener el código modificado compilado para OpenWrt, con éxito. La versión en la que lo estoy ejecutando es OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130), en un enrutador tplink wdr3600:
RESULTADO: Puedo tener 3 * c270 (logitech) ejecutándose simultáneamente a 1280x960 y 15 fps en formato MJPG, a través de un hub usb 2.0. No tengo un cuarto c270 para conectar, lo siento.
También puedo tener 2 * c270 y 1 * GEMBIRD 640 * 480 * 15 fps con formato YUV, pero agregar un segundo GEMBIRD conduce a la temida "No se puede iniciar la captura: no queda espacio en el dispositivo" (espacio == ancho de banda aquí, como usted conocer bien:)). Tenga en cuenta que GEMBIRD (1908: 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .
El uso de la CPU con 3 * c270 es bastante razonable en un wdr3600:
Si la comunidad da algo de reputación y apoyo, creo que SwDevRefugee está dispuesto a poner el código en uvc-linux.
fuente
Miré el controlador uvcvideo y el parámetro del módulo quirks = 128 se ignora si la secuencia está comprimida mjpeg.
Mis cámaras web preferidas han sido la Logitech C500 y la Logitech C270, y descubrí que la imagen producida por la C500 a 1280x1024 es de 100kbytes y la imagen producida por la C270 a 1280x960 es de 200kbytes.
Si ejecuto el C270 a 10 fps, entonces la tasa de bits requerida es 10x200000x8 = 16Mbit / s. En Ubuntu 14.04, el módulo uvcdriver siempre asigna 196Mbits / s independientemente de la velocidad de fotogramas. Para el C500, se comporta un poco mejor, pero sigue siendo un cerdo de ancho de banda.
He modificado el controlador uvcvideo para poder proporcionar un factor de "compresión" al controlador a través de la interfaz V4L2. Es un "pequeño truco" porque utilicé el atributo priv en la estructura v4l2_pix_format para especificar el valor. En el controlador, calcula el tamaño de la imagen sin comprimir y luego se divide por el factor de compresión para determinar qué ancho de banda USB usar.
Por defecto, uso un factor de compresión de 10 que permite un gran margen si la cámara encuentra una imagen particularmente difícil de comprimir. El C270 que funciona a 1280x960 y 10 fps ahora usa 41Mbit / sy puedo ejecutar fácilmente 4 cámaras en un bus.
Si alguien está interesado en esta característica, intentaré que los mantenedores de uvcvideo consideren el concepto del factor de "compresión".
fuente
También lo saqué del error de espacio. Lo que funcionó fue desconectar una de las cámaras y conectarla a otro puerto USB de mi PC estacionaria; hay unos 6 o 7 puertos USB dispersos al respecto. Al ejecutar 'show_webcams 0 1', de repente aparecieron las dos imágenes.
fuente