Wie kann die Bandbreite, die ein USB-Gerät unter Linux zuweisen kann, begrenzt werden?
Ich habe ein paar billige USB-Webcams, die ich gleichzeitig ausführen möchte. Laufende v4l2-ctl --list-formats-ext --device=/dev/videoN
Shows unterstützen beide verschiedene unkomprimierte Auflösungen mit 30 und 15 FPS.
Selbst wenn ich ein Gerät so konfiguriere, dass es mit 15 FPS und einer Auflösung von 160 x 120 Pixeln aufzeichnet, werden dennoch 480 Mbit / s Bandbreite zugewiesen, sodass ich normalerweise keine anderen USB-Geräte verwenden kann, geschweige denn die zweite Webcam. Der Versuch, mit derselben FPS / Auflösung von der zweiten Webcam aufzunehmen, führt zu folgendem Fehler:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
Wenn Sie diesen Fehler googeln, erhalten Sie in der Regel Antworten wie "Sie sind SOL, kaufen Sie vielleicht eine Kamera, die MJPG unterstützt?".
Das macht aber absolut keinen Sinn.
Das Aufnehmen von unkomprimiertem 160x120 RGB entspricht 160 * 120 * 3 = 57600 Bytes pro Frame. Dies erfordert bei 15 FPS mindestens 864000 Bytes pro Sekunde Bandbreite (dh satte 0,864 Mbit / s oder 6,912 Mbit / s )! Ich habe einen USB2-Hub, der 480 Mbit / s unterstützt . Ich sollte genug Bandbreite haben, um Dutzende dieser Webcams auf einmal zu betreiben, aber ein einziger verbraucht fast alle 480 Mbit meines USB-Hubs!
Da die Kamera keine 480 Mbit / s zum Streamen von 160 x 120 benötigt, der Treiber jedoch aufgefordert wird, so viel zuzuweisen, gibt es auf Betriebssystemebene eine Möglichkeit, den Treiber zu zwingen, eine bestimmte Menge zuzuweisen?
Antworten:
Dieser Typ bietet eine Lösung , die für einige Leute zu funktionieren scheint. In meinem Fall habe ich es versucht und es hat sich nichts geändert, aber es ist sehr hardwareabhängig.
In der Tat sagen sie auf dieser Seite , dass dies nicht immer funktioniert und sie geben sogar die Möglichkeit, den Code in der Funktion uvc_init_video () des Treibers zu ändern:
quelle