Ding ding! Mit etwas Hilfe der netten Leute in #v4l auf Freenode ist es mir gelungen, das herauszufinden.
Lange Rede kurzer Sinn:v4l2-ctl ist das beste Tool zum Debuggen von USB-Kameraproblemen. Lesen Sie alle verfügbaren Befehle und die Manpage, es wird Spaß machen, versprochen. Mit v4l2-ctl Ich 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
Was so etwas ausgeben sollte.
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 OpenCV wie ich verwenden, machen Sie sich keine Sorgen, wenn das Standard-Pixelformat nicht komprimiert ist, da OpenCV anscheinend sowieso standardmäßig die Komprimierung verwendet.
**Es sei denn, Sie sind mit einer Auflösung von 320 x 240 oder niedriger zufrieden.*
Die Antwort ist, die von SwDevRefugee geschriebenen und oben beschriebenen uvcvideo-Modifikationen zu verwenden. Er und ich haben erfolgreich 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 kein viertes c270 zum Anschließen, tut mir leid.
Ich kann auch 2*c270 und 1*GEMBIRD 640*480*15fps mit YUV-Format haben, aber das Hinzufügen eines 2 gut kennen:)). 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 ziemlich 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 gibt, denke ich, dass SwDevRefugee bereit ist, den Code in uvc-linux zu integrieren.
Ich habe mir den uvcvideo-Treiber angesehen und der Modulparameter quirks=128 wird ignoriert, wenn der Stream mjpeg-komprimiert ist.
Meine bevorzugten Webcams waren die Logitech C500 und die Logitech C270, und ich fand heraus, dass das von der C500 bei 1280 x 1024 erzeugte Bild 100 KB und das von der C270 bei 1280 x 960 erzeugte Bild 200 KB groß ist.
Wenn ich den C270 mit 10 fps betreibe, beträgt die erforderliche Bitrate 10 x 200000 x 8 =16 Mbit / s. In Ubuntu 14.04 weist das uvcdriver-Modul unabhängig von der Bildrate immer 196 Mbit/s zu. Für den C500 ist es etwas besser erzogen, aber immer noch ein Bandbreitenfresser.
Ich habe den uvcvideo-Treiber so modifiziert, dass ich dem Treiber über die V4L2-Schnittstelle einen "Kompressions"-Faktor zur Verfügung stellen kann. Es ist insofern ein "kleines Hacky", als ich das priv-Attribut 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 lässt, wenn die Kamera auf ein besonders schwer zu komprimierendes Bild stößt. Der C270 mit 1280 x 960 und 10 fps 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.