¿Cómo se pone un límite a la cantidad de ancho de banda que un dispositivo USB puede asignar en Linux?
Tengo un par de cámaras web USB baratas que intento ejecutar simultáneamente. En ejecución v4l2-ctl --list-formats-ext --device=/dev/videoN
se muestra que ambos admiten varias resoluciones sin comprimir a 30 y 15 FPS.
Sin embargo, incluso si configuro uno para capturar a 15 FPS con una resolución de 160x120, todavía asigna 480 Mbps de ancho de banda, lo que generalmente me impide usar otros dispositivos USB, y mucho menos la segunda cámara web. Intentar capturar desde la segunda cámara web con el mismo FPS/resolución produce el error:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
Buscar este error en Google generalmente da como resultado respuestas como "eres SOL, ¿quizás compres una cámara que admita MJPG?".
Pero esto no tiene ningún sentido.
La captura de 160x120 RGB sin comprimir equivale a 160*120*3 = 57600 bytes por cuadro. A 15 FPS, eso requiere al menos 864.000 bytes por segundo de ancho de banda (es decir, la friolera de 864.000 bytes por segundo).0,864Mbpso6.912Mbps)! Tengo un concentrador USB2, que admite480Mbps. Debería tener suficiente ancho de banda para ejecutar docenas de estas cámaras web a la vez, pero ejecutar una sola consume casi los 480 Mbits de mi concentrador USB.
Dado que la cámara no necesita 480 Mbps para transmitir 160x120, pero le dice al controlador que asigne esa cantidad, ¿hay alguna forma, a nivel del sistema operativo, de obligar al controlador a asignar una cierta cantidad?
Respuesta1
Este chico proporcionauna solucióneso parece funcionar para algunas personas. En mi caso, lo probé y no cambió nada, pero depende mucho del hardware.
El módulo del kernel uvcvideo se puede configurar para ignorar el ancho de banda solicitado y calcular el ancho de banda correcto. Intentar:
sudo rmmod uvcvideo sudo modprobe uvcvideo quirks=128
Esto se restablecerá cada reinicio. Si esto funciona, cree el siguiente archivo:
sudo vi /etc/modprobe.d/uvcvideo.conf
que contiene la línea:
options uvcvideo quirks=128
De hecho, enesta páginadicen que esto puede no funcionar siempre e incluso dan la opción de cambiar el código en la función uvc_init_video() del driver:
/* Isochronous endpoint, select the alternate setting. */ bandwidth = stream->ctrl.dwMaxPayloadTransferSize;