So begrenzen Sie die USB-Bandbreite, die ein Gerät unter Linux zuweisen kann

4

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/videoNShows 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?

Cerin
quelle
Scheint ein Duplikat von stackoverflow.com/questions/11394712/… zu sein (auf einer anderen Stackexchange-Site)
ChrisInEdmonton
@ ChrisInEdmonton, Art von. Weder die Frage noch die Antworten behandelten das zugrunde liegende Problem, warum nicht genügend Bandbreite für ein Gerät mit sehr geringer Bandbreite vorhanden ist. In der Tat sind diese schlechten Antworten das, was ich in meiner Frage anspreche und warum ich nicht frage, wie ich diesen Fehler beheben kann, sondern wie ich die Bandbreitennutzung einschränke.
Cerin

Antworten:

2

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.

Das uvcvideo-Kernelmodul kann so eingestellt werden, dass die angeforderte Bandbreite ignoriert und die richtige Bandbreite berechnet wird. Versuchen:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

Dies wird bei jedem Neustart zurückgesetzt. Wenn dies funktioniert, erstellen Sie die folgende Datei:

sudo vi /etc/modprobe.d/uvcvideo.conf 

mit der Zeile:

options uvcvideo quirks=128

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:

/* Isochronous endpoint, select the alternate setting. */
bandwidth = stream->ctrl.dwMaxPayloadTransferSize;
David
quelle
Willkommen bei Super User! Bitte geben Sie die relevanten Informationen der verlinkten Seite in Ihrer Antwort an. Dadurch wird sichergestellt, dass Ihre Antwort relevant und nützlich bleibt, falls sich die verknüpfte Seite ändert oder verschwindet.
Hervorragend
@David Derjenige, der den Beitrag bearbeitet: Ich glaube, dass Sie die Antwort als unregistriert gepostet und sich als neuer Benutzer mit demselben Namen registriert haben, ohne Anspruch darauf zu erheben. Wenn es Ihnen etwas ausmacht, schreiben Sie die Antwort noch einmal (oder fordern Sie das Konto an, Sie sollten irgendwo eine E-Mail haben), damit Sie die eventuellen Upvotes besitzen können ...
Hastur