Wie begrenzen Sie die Bandbreite, die ein USB-Gerät unter Linux zuweisen kann?
Ich habe ein paar billige USB-Webcams, die ich gleichzeitig laufen lassen möchte. Beim Laufen v4l2-ctl --list-formats-ext --device=/dev/videoN
zeigt sich, dass beide mehrere unkomprimierte Auflösungen bei 30 und 15 FPS unterstützen.
Aber selbst wenn ich eine Kamera so konfiguriere, dass sie mit 15 FPS bei einer Auflösung von 160 x 120 aufzeichnet, belegt sie immer noch 480 Mbit/s Bandbreite, sodass ich normalerweise keine anderen USB-Geräte verwenden kann, geschweige denn die zweite Webcam. Der Versuch, mit der zweiten Webcam mit derselben FPS/Auflösung aufzuzeichnen, 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 normalerweise Antworten wie: „Da haben Sie Pech gehabt. Kaufen Sie sich vielleicht eine Kamera, die MJPG unterstützt?“.
Aber das macht absolut keinen Sinn.
Die Aufnahme von unkomprimiertem 160x120 RGB entspricht 160*120*3 = 57600 Bytes pro Frame. Bei 15 FPS erfordert dies mindestens 864000 Bytes pro Sekunde Bandbreite (also satte0,864 Mbit/soder6,912 Mbit/s)! Ich habe einen USB2-Hub, der unterstützt480 Mbit/s. Ich sollte über genügend Bandbreite verfügen, um Dutzende dieser Webcams gleichzeitig zu betreiben, doch der Betrieb einer einzigen verbraucht fast alle 480 Mbit/s meines USB-Hubs!
Da die Kamera keine 480 Mbit/s benötigt, um 160 x 120 zu streamen, dem Treiber aber sagt, dass er so viel zuweisen soll, gibt es auf Betriebssystemebene eine Möglichkeit, den Treiber zu zwingen, eine bestimmte Menge zuzuweisen?
Antwort1
Dieser Typ bieteteine Lösungdas scheint bei manchen Leuten zu funktionieren. In meinem Fall habe ich es versucht und es hat nichts geändert, aber es ist sehr hardwareabhängig.
Das Kernelmodul uvcvideo kann so eingestellt werden, dass es die angeforderte Bandbreite ignoriert und die richtige Bandbreite berechnet. Versuchen Sie:
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
Tatsächlichdiese SeiteSie sagen, dass dies möglicherweise nicht immer funktioniert und bieten 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;