Ding ding! Berhasil menemukan yang ini dengan bantuan dari orang-orang baik di #v4l di freenode.
Singkat cerita:v4l2-ctl adalah alat terbaik untuk men-debug masalah kamera USB. Baca semua perintah yang tersedia dan halaman manual, saya janji akan menyenangkan. Menggunakan v4l2-ctl Saya menemukan salah satu kamera saya tidak mendukung mode video terkompresi apa pun. Anda dapat memeriksa mode apa yang didukung kamera Anda dengan menjalankan perintah berikut:
v4l2-ctl -d /dev/video0 --list-formats
Yang seharusnya menampilkan sesuatu seperti ini.
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)
Jika satu-satunya format piksel yang dikembalikan adalah "YUYV", "IUYV", "I420", atau "GBRG", Anda hanya dapat menjalankan satu kamera per pengontrol USB* karena format tersebut tidak terkompresi. Menggunakan beberapa webcam yang mendukung MJPEG atau beberapa bentuk kompresi lainnya akan berfungsi dengan baik.
Jika Anda menggunakan OpenCV seperti saya, jangan khawatir jika format piksel default tidak dikompresi karena tampaknya OpenCV default untuk tetap menggunakan kompresi.
**Kecuali Anda puas dengan resolusi 320x240 atau lebih rendah.*
Jawabannya adalah menggunakan modifikasi uvcvideo yang ditulis oleh SwDevRefugee, dan dijelaskan di atas. Dia dan saya telah bekerja sama untuk mendapatkan kode mod'ed yang dikompilasi untuk OpenWrt, dengan sukses. Versi tempat saya menjalankannya adalah OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130), pada router tplink wdr3600:
HASIL:Saya dapat menjalankan 3*c270 (logitech) secara bersamaan pada 1280x960 dan 15fps dalam format MJPG, melalui hub usb 2.0. Saya tidak punya c270 keempat untuk dihubungkan, maaf.
Saya juga dapat memiliki 2*c270 dan 1*GEMBIRD 640*480*15fps dengan format YUV, tetapi menambahkan GEMBIRD ke-2 mengarah ke "Tidak dapat memulai penangkapan:Tidak ada ruang tersisa di perangkat" (spasi==bandwidth di sini, karena Anda kenal baik :)). Perhatikan bahwa GEMBIRD (1908:2311) ==http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .
Penggunaan CPU dengan 3*c270 cukup masuk akal pada 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 --
Jika komunitas memberikan reputasi dan dukungan, saya pikir SwDevRefugee bersedia memasukkan kode ke dalam uvc-linux.
Saya melihat driver uvcvideo dan parameter modul quirks=128 diabaikan jika streaming mjpeg dikompresi.
Webcam pilihan saya adalah Logitech C500 dan Logitech C270, dan saya menemukan bahwa gambar yang dihasilkan oleh C500 pada 1280x1024 adalah 100kbytes dan gambar yang dihasilkan oleh C270 pada 1280x960 adalah 200kbytes.
Jika saya menjalankan C270 pada 10fps maka bitrate yang dibutuhkan adalah 10x200000x8 =16Mbit/s. Di Ubuntu 14.04 modul uvcdriver selalu mengalokasikan 196Mbits/s terlepas dari frame rate. Untuk C500 perilakunya sedikit lebih baik, tetapi masih merupakan babi bandwidth.
Saya telah memodifikasi driver uvcvideo sehingga saya dapat memberikan faktor "kompresi" ke driver melalui antarmuka V4L2. Ini adalah "sedikit peretasan" karena saya menggunakan atribut priv di struct v4l2_pix_format untuk menentukan nilainya. Dalam driver itu menghitung ukuran gambar yang tidak terkompresi dan kemudian membaginya dengan faktor kompresi untuk menentukan bandwidth USB yang akan digunakan.
Secara default saya menggunakan faktor kompresi 10 yang memungkinkan margin besar jika kamera menemukan gambar yang sangat sulit untuk dikompres. C270 yang berjalan pada 1280x960 dan 10fps sekarang menggunakan 41Mbit/dtk dan saya dapat dengan mudah menjalankan 4 kamera dalam satu bus.
Jika ada yang tertarik dengan fitur ini maka saya akan mencoba membuat pengelola uvcvideo mempertimbangkan konsep faktor "kompresi".