Das Ausführen 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 anfangs ein Programmierproblem in OpenCV zu sein schien, entwickelte sich zu einer Suche nach einem mysteriösen Hardware- / Softwareproblem, nachdem die gleichen Fehler bei der Ausführung von cheese und xawtv aufgetreten waren.
Anscheinend wird dies durch Webcams verursacht, die die gesamte verfügbare Bandbreite des USB-Hostcontrollers abfragen. Vor diesem Hintergrund habe ich mich für Wireshark und Capinfos entschieden, um zu sehen, wie viel Bandbreite eine einzelne Kamera verbraucht.
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, eine höhere Auflösung jedoch ausfällt. Es ist, als würde mein USB-Controller nur mit USB 1-Geschwindigkeit betrieben, aber lsusb zeigt beide Webcams, die zu einem Gerät gehören, das angeblich 480 Megabits pro Sekunde unterstützt.
In einer Lösung wurde vorgeschlagen, die Webcams zu zwingen, ihre Bandbreitennutzung zu berechnen, anstatt ihr Maximum durch Ausführen der folgenden Befehle anzufordern:
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
Da dies leider keinen Unterschied machte, habe ich mich für eine andere Lösung entschieden. In einem Beitrag auf StackOverflow wurde empfohlen, dass meine Webcams ein niedrigeres FPS- oder komprimiertes Videoformat wie MJPEG verwenden sollen. Nach dem Ausführen von v4lctl list wird jedoch nicht angezeigt, dass eine meiner Webcams das Ändern des Videomodus unterstützt.
Und da stecke ich fest. Warum würden zwei Webcams, die deutlich unter der maximalen Geschwindigkeit von USB 2 arbeiten, diesen Fehler verursachen?
ps: Es ist kein Speicherplatzproblem, df zeigt beim Starten der Webcams keine Änderung an.
pps: Wenn es einen Unterschied macht, ist hier die Ausgabe von lsusb
v4l2-ctl
ist in der Tat ein hervorragendes Tool zum Debuggen. Ich habe viel über meine Kamera erfahren und konnte das Problem beheben. Wie auch immer, ich war in der Lage , es zu beheben durch meine Kamera Auflösung zu zwingen320x240
und die VerwendungYUYV
als Kamera - Ausgabemodus.guvcview
hat auch sehr geholfen.Die Antwort ist, die von SwDevRefugee geschriebenen und oben beschriebenen uvcvideo-Modifikationen zu verwenden. Er und ich haben mit Erfolg zusammengearbeitet, um den modifizierten Code 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 ausführen. Ich habe keine vierte c270 zum Anschließen, sorry.
Ich kann auch 2 * c270 und 1 * GEMBIRD 640 * 480 * 15fps mit YUV-Format haben, aber das Hinzufügen eines 2. GEMBIRD führt zu der gefürchteten Meldung "Capture kann nicht gestartet werden: Auf dem Gerät ist kein Speicherplatz mehr verfügbar" (Speicherplatz == Bandbreite hier, so wie Sie gut kennen:)). Beachten Sie, dass GEMBIRD (1908: 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .
CPU-Auslastung mit 3 * c270 ist auf einem wdr3600 ziemlich vernünftig:
Wenn die Community etwas Ansehen und Unterstützung bietet, ist SwDevRefugee bereit, den Code in uvc-linux zu integrieren.
quelle
Ich habe mir den uvcvideo-Treiber angesehen und der Modulparameter quirks = 128 wird ignoriert, wenn der Stream mit MJPEG komprimiert ist.
Meine bevorzugten Webcams waren Logitech C500 und Logitech C270, und ich stellte fest, dass das vom C500 bei 1280 x 1024 erzeugte Bild 100 KB groß und das vom C270 bei 1280 x 960 erzeugte Bild 200 KB groß ist.
Wenn ich die C270 mit 10fps betreibe, ist eine Bitrate von 10x200000x8 = 16Mbit / s erforderlich. In Ubuntu 14.04 weist das uvcdriver-Modul unabhängig von der Bildrate immer 196 Mbit / s zu. Für den C500 ist es ein bisschen besser, aber es ist immer noch eine Schwäche für Bandbreite.
Ich habe den uvcvideo-Treiber so geändert, dass ich dem Treiber über die V4L2-Schnittstelle einen "Komprimierungsfaktor" zur Verfügung stellen kann. Es ist insofern ein "kleiner Hacky", als ich das Attribut priv in der Struktur v4l2_pix_format verwendet habe, um den Wert anzugeben. Im Treiber wird die Größe des unkomprimierten Bildes berechnet und dann durch den Komprimierungsfaktor dividiert, um die zu verwendende USB-Bandbreite zu ermitteln.
Standardmäßig verwende ich einen Komprimierungsfaktor von 10, der einen großen Spielraum für den Fall bietet, dass die Kamera auf ein besonders schwer zu komprimierendes Bild stößt. Die C270, die mit 1280x960 und 10 fps läuft, 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.
quelle
Ich habe den Fehler auch aus dem All bekommen. Was funktionierte, war, eine der Kameras abzuziehen und sie an einen anderen USB-Port meines stationären PCs anzuschließen - es gibt ungefähr 6 oder 7 USB-Ports, die darüber verstreut sind. Wenn Sie 'show_webcams 0 1' ausführen, werden die beiden Bilder plötzlich angezeigt.
quelle