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.