ディンディン! freenode の #v4l の親切な人々の助けを借りて、これを解決することができました。
簡単に言うと:v4l2-ctl USB カメラの問題をデバッグするのに最適なツールです。利用可能なすべてのコマンドと man ページを読んでください。きっと楽しいものになるでしょう。 v4l2-ctl の使用 カメラの 1 つが圧縮ビデオ モードをサポートしていないことがわかりました。次のコマンドを実行して、カメラがサポートしているモードを確認できます:
v4l2-ctl -d /dev/video0 --list-formats
これは、このようなものを出力するはずです.
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)
返されるピクセル形式が「YUYV」、「IUYV」、「I420」、または「GBRG」のみの場合、これらの形式は圧縮されていないため、USB コントローラーごとに 1 つのカメラしか実行できません*。 MJPEG またはその他の形式の圧縮をサポートする複数の Web カメラを使用すると、問題なく動作します。
私のように OpenCV を使用している場合、デフォルトのピクセル形式が圧縮されていなくても心配する必要はありません。OpenCV はデフォルトで圧縮を使用するようになっているようです。
**320x240 以下の解像度に満足している場合を除きます。*
答えは、SwDevRefugee によって記述され、上記で説明されている uvcvideo の修正を使用することです。彼と私は協力して、Mod 化されたコードを OpenWrt 用にコンパイルし、成功しました。私が実行しているバージョンは、tplink wdr3600 ルーター上の OpenWRT DESIGNATED DRIVER (Bleeding Edge、r48130) です:
結果:USB 2.0 ハブを介して、MJPG 形式で 1280x960 および 15fps で 3*c270 (logitech) を同時に実行できます。接続する 4 番目の c270 がありません。申し訳ありません。
YUV フォーマットで 2*c270 と 1*GEMBIRD 640*480*15fps を使用することもできますが、2 番目の GEMBIRD を追加すると、恐ろしい「キャプチャを開始できません:デバイスにスペースが残っていません」というエラーが発生します (ここではスペース ==帯域幅です。よく知っている:))。 GEMBIRD (1908:2311) ==http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .
3*c270 の CPU 使用率は、wdr3600 ではかなり妥当です:
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 --
コミュニティがある程度の評判とサポートを提供するなら、SwDevRefugee は喜んでコードを uvc-linux に取り込んでくれると思います。
uvcvideo ドライバーを調べたところ、ストリームが mjpeg 圧縮されている場合、quirks=128 モジュール パラメーターは無視されます。
私が選んだ Web カメラは Logitech C500 と Logitech C270 で、C500 で 1280x1024 で生成される画像は 100kbytes で、C270 で 1280x960 で生成される画像は 200kbytes であることがわかりました。
C270 を 10fps で実行する場合、必要なビットレートは 10x200000x8 =16Mbit/s です。 Ubuntu 14.04 では、フレーム レートに関係なく、uvcdriver モジュールは常に 196Mbits/s を割り当てます。 C500 の場合、動作は少し改善されていますが、それでも帯域幅を大量に消費します。
V4L2 インターフェイスを介してドライバに「圧縮」係数を提供できるように、uvcvideo ドライバを修正しました。構造体 v4l2_pix_format で priv 属性を使用して値を指定したという点で、これは「少しハック」です。ドライバーでは、圧縮されていない画像のサイズを計算し、圧縮係数で割って、使用する USB 帯域幅を計算します。
デフォルトでは、圧縮係数 10 を使用します。これにより、カメラが特に圧縮しにくい画像に遭遇した場合に備えて、大きな余裕ができます。 1280x960 および 10fps で動作する C270 は 41Mbit/s を使用するようになり、1 つのバスで 4 台のカメラを簡単に実行できます。
誰かがこの機能に興味を持っている場合は、uvcvideo のメンテナーに「圧縮」係数の概念を検討してもらいます。