Verwenden mehrerer USB-Webcams unter Linux

Verwenden mehrerer USB-Webcams unter Linux

Der Betrieb von mehr als einer USB-Webcam unter Debian/Linux führt zu folgendem Fehler:

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device

Was zunächst wie ein Programmierproblem in OpenCV aussah, entwickelte sich zu einer Suche nach einem mysteriösen Hardware-/Softwareproblem, nachdem beim Ausführen von Cheese und xawtv dieselben Fehler auftraten.

Anscheinend liegt es daran, dass Webcams die gesamte verfügbare Bandbreite auf dem USB-Host-Controller beanspruchen. Vor diesem Hintergrund habe ich beschlossen,WiresharkUndAbonnierenum zu sehen, wie viel Bandbreite eine einzelne Kamera verwendet.

4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720

Interessant! Das könnte erklären, warum zwei Kameras mit 320x240 funktionieren, aber jede höhere Auflösung fehlschlägt. Es ist, als ob mein USB-Controller nur mit USB 1-Geschwindigkeiten arbeitet, aberAbonnierenzeigt beide Webcams, die zu einem Gerät gehören, das angeblich 480 Megabit pro Sekunde unterstützt.

Eine Lösung schlug vor, die Webcams durch Ausführen der folgenden Befehle zu zwingen, ihre Bandbreitennutzung zu berechnen, anstatt ihr Maximum anzufordern:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

Leider hat das keinen Unterschied gemacht, also habe ich beschlossen, eine andere Lösung auszuprobieren. Ein Beitragauf StackOverflowschlug vor, meine Webcams anzuweisen, eine niedrigere FPS oder ein komprimiertes Videoformat wie MJPEG zu verwenden, aber nach dem Ausführenv4lctl-Listees scheint, dass keine meiner Webcams das Ändern des Videomodus unterstützt.

Und da stecke ich fest. Warum würden zwei Webcams, die weit unter der maximalen Geschwindigkeit von USB 2 arbeiten, diesen Fehler erzeugen?

PS: Es liegt kein Problem mit dem Speicherplatz, df zeigt keine Änderung an, wenn die Webcams gestartet werden.

pps: Falls es einen Unterschied macht, hier istdie Ausgabe von lsusb

Antwort1

Ding, ding! Mit etwas Hilfe der netten Leute in #v4l auf Freenode habe ich es geschafft, das herauszufinden.

Um es kurz zu machen:v4l2-ctlist das beste Tool zum Debuggen von USB-Kameraproblemen. Lesen Sie alle verfügbaren Befehle und die Manpage, es wird Spaß machen, versprochen. Mitv4l2-ctlIch habe festgestellt, dass eine meiner Kameras keine komprimierten Videomodi unterstützt. Sie können überprüfen, welche Modi Ihre Kameras unterstützen, indem Sie den folgenden Befehl ausführen:

v4l2-ctl -d /dev/video0 --list-formats

Die Ausgabe sollte ungefähr so ​​aussehen.

 ioctl: VIDIOC_ENUM_FMT
 Index       : 0
 Type        : Video Capture
 Pixel Format: 'MJPG' (compressed)
 Name        : MJPEG

 Index       : 1
 Type        : Video Capture
 Pixel Format: 'YUYV'
 Name        : YUV 4:2:2 (YUYV)

Wenn das einzige zurückgegebene Pixelformat „YUYV“, „IUYV“, „I420“ oder „GBRG“ ist, können Sie nur eine Kamera pro USB-Controller* betreiben, da diese Formate unkomprimiert sind. Die Verwendung mehrerer Webcams, die MJPEG oder eine andere Form der Komprimierung unterstützen, funktioniert problemlos.

Wenn Sie wie ich OpenCV verwenden, machen Sie sich keine Sorgen, wenn das Standardpixelformat nicht komprimiert ist, da OpenCV anscheinend ohnehin standardmäßig die Komprimierung verwendet.

**Es sei denn, Sie sind mit einer Auflösung von 320 x 240 oder weniger zufrieden.*

Antwort2

Die Antwort besteht darin, die von SwDevRefugee geschriebenen und oben beschriebenen UVCvideo-Modifikationen zu verwenden. Er und ich haben zusammengearbeitet, um den modifizierten Code erfolgreich für OpenWrt zu kompilieren. Die Version, auf der ich es ausführe, ist OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130), auf einem TPLink WDR3600-Router:

ERGEBNIS: Ich kann 3*c270 (Logitech) gleichzeitig mit 1280 x 960 und 15 fps im MJPG-Format über einen USB 2.0-Hub laufen lassen. Ich habe leider keinen vierten c270 zum Anschließen.

Ich kann auch 2*c270 und 1*GEMBIRD 640*480*15fps mit YUV-Format haben, aber das Hinzufügen eines zweiten GEMBIRD führt zu der gefürchteten Meldung „Aufnahme kann nicht gestartet werden: Kein Speicherplatz mehr auf dem Gerät“ (Platz == Bandbreite hier, wie Sie wissen:)). Beachten Sie, dass GEMBIRD (1908:2311) ==http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/.

Die CPU-Auslastung mit 3*c270 ist auf einem wdr3600 recht vernünftig:

Mem: 50600K used, 75444K free, 320K shrd, 3436K buff, 8800K cached

CPU:  16% usr  27% sys   0% nic  45% idle   0% io   0% irq  10% sirq

Load average: 1.20 0.85 0.44 4/60 2546

  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND

 2240  1679 root     S    15348  12%  17% mjpg_streamer --input input_uvc.so --

 2505  1679 root     S    15368  12%  11% mjpg_streamer --input input_uvc.so --

 2239  1679 root     S    15532  12%  11% mjpg_streamer --input input_uvc.so --

Wenn die Community etwas Ansehen und Unterstützung mitbringt, denke ich, dass SwDevRefugee bereit ist, den Code in uvc-linux zu integrieren.

Antwort3

Ich habe mir den UVCvideo-Treiber angesehen und der Modulparameter „quirks=128“ wird ignoriert, wenn der Stream MJPEG-komprimiert ist.

Ich habe mich für die Webcams Logitech C500 und Logitech C270 entschieden und festgestellt, dass das von der C500 bei 1280 x 1024 erzeugte Bild 100 KB groß ist und das von der C270 bei 1280 x 960 erzeugte Bild 200 KB groß ist.

Wenn ich den C270 mit 10 Bildern pro Sekunde laufen lasse, ist die erforderliche Bitrate 10 x 200000 x 8 = 16 Mbit/s. In Ubuntu 14.04 weist das Modul uvcdriver unabhängig von der Bildrate immer 196 Mbit/s zu. Beim C500 verhält es sich etwas besser, ist aber immer noch ein Bandbreitenfresser.

Ich habe den uvcvideo-Treiber so geändert, dass ich dem Treiber über die V4L2-Schnittstelle einen „Komprimierungsfaktor“ bereitstellen kann. Es ist ein „kleiner Hack“, da ich das priv-Attribut in der Struktur v4l2_pix_format verwendet habe, um den Wert anzugeben. Im Treiber berechnet es die Größe des unkomprimierten Bildes und dividiert es dann durch den Komprimierungsfaktor, um die zu verwendende USB-Bandbreite zu ermitteln.

Standardmäßig verwende ich einen Komprimierungsfaktor von 10, der einen großen Spielraum lässt, falls die Kamera auf ein besonders schwer zu komprimierendes Bild stößt. Die C270 mit 1280 x 960 und 10 Bildern pro Sekunde verwendet jetzt 41 Mbit/s und ich kann problemlos 4 Kameras an einem Bus betreiben.

Wenn jemand an dieser Funktion interessiert ist, werde ich versuchen, die Betreuer von uvcvideo dazu zu bringen, das Konzept des „Komprimierungsfaktors“ zu berücksichtigen.

Antwort4

Ich hatte auch diesen „Nicht genügend Speicherplatz“-Fehler. Was funktionierte, war, eine der Kameras abzutrennen und sie an einen anderen USB-Anschluss meines stationären PCs anzuschließen – dort sind ungefähr 6 oder 7 USB-Anschlüsse verstreut. Als ich „show_webcams 0 1“ ausführte, wurden dann plötzlich die beiden Bilder angezeigt.

verwandte Informationen