Menjalankan lebih dari satu webcam USB di Debian / Linux menghasilkan kesalahan berikut:
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
Apa yang awalnya tampak sebagai masalah pemrograman di OpenCV berubah menjadi pencarian untuk masalah hardware / software misterius setelah kesalahan yang sama dihasilkan oleh menjalankan keju dan xawtv.
Tampaknya itu disebabkan oleh webcam yang meminta semua bandwidth yang tersedia pada pengontrol host USB. Dengan pemikiran itu aku memutuskan untuk berlari wireshark dan capinfos untuk melihat seberapa banyak bandwidth yang digunakan kamera tunggal.
4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720
Menarik! Itu mungkin menjelaskan mengapa dua kamera pada 320x240 berfungsi tetapi resolusi yang lebih tinggi gagal. Sepertinya kontroler USB saya hanya beroperasi pada kecepatan USB 1, belum lsusb menunjukkan kedua kamera web milik perangkat yang seharusnya mendukung 480 megabit per detik.
Salah satu solusi yang diusulkan memaksa webcam untuk menghitung penggunaan bandwidth mereka alih-alih meminta maksimum dengan menjalankan perintah berikut:
sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128
Sayangnya itu tidak ada bedanya, jadi saya memutuskan untuk mencoba solusi lain. Pos di StackOverflow disarankan memberi tahu webcam saya untuk menggunakan FPS yang lebih rendah atau format video terkompresi seperti MJPEG, tetapi setelah berjalan daftar v4lctl tidak muncul salah satu webcam saya yang mendukung perubahan mode video mereka.
Dan di situlah saya terjebak. Mengapa dua webcam beroperasi jauh di bawah kecepatan maksimum USB 2 akan menghasilkan kesalahan ini?
ps: Ini bukan masalah ruang disk, df menampilkan tidak ada perubahan saat webcam dimulai.
pps: Jika ada bedanya, ini dia output dari lsusb
v4l2-ctl
memang alat yang luar biasa untuk debugging. Mengetahui banyak tentang kamera saya, dan dapat memperbaiki masalah ini. Bagaimanapun, saya dapat memperbaikinya dengan memaksa resolusi kamera saya320x240
dan menggunakanYUYV
sebagai mode keluaran kamera.guvcview
juga banyak membantu.Jawabannya adalah menggunakan modifikasi uvcvideo yang ditulis oleh SwDevRefugee, dan dijelaskan di atas. Dia dan saya telah bekerja bersama untuk mendapatkan kode mod'ed dikompilasi untuk OpenWrt, dengan sukses. Versi yang saya gunakan adalah OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130), pada router wdr3600 tplink:
HASIL: Saya dapat menjalankan 3 * c270 (logitech) secara simultan pada 1280x960 dan 15fps dalam format MJPG, melalui hub usb 2.0. Saya tidak memiliki 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 yang tersisa di perangkat" (space == bandwidth di sini, seperti 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:
Jika komunitas memberikan beberapa reputasi dan dukungan, saya pikir SwDevRefugee bersedia memasukkan kodenya ke uvc-linux.
sumber
Saya melihat driver uvcvideo dan quirks = 128 parameter modul diabaikan jika aliran dikompresi mjpeg.
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 diperlukan adalah 10x200000x8 = 16Mbit / s. Di Ubuntu 14.04 modul uvcdriver selalu mengalokasikan 196Mbit / s terlepas dari frame rate. Untuk C500 itu berperilaku sedikit lebih baik, tetapi masih babi bandwidth.
Saya telah memodifikasi driver uvcvideo sehingga saya dapat memberikan faktor "kompresi" ke driver melalui antarmuka V4L2. Ini adalah "sedikit hacky" di mana saya menggunakan atribut priv di struct v4l2_pix_format untuk menentukan nilai. Dalam driver itu menghitung ukuran gambar yang tidak terkompresi dan kemudian membaginya dengan faktor kompresi untuk mengetahui bandwidth USB yang digunakan.
Secara default saya menggunakan faktor kompresi 10 yang memungkinkan margin besar jika kamera menemukan gambar yang sangat sulit untuk dikompres. C270 berjalan pada 1280x960 dan 10fps sekarang menggunakan 41Mbit / s dan saya dapat dengan mudah menjalankan 4 kamera di satu bus.
Jika ada yang tertarik dengan fitur ini maka saya akan mencoba untuk mendapatkan pengelola uvcvideo untuk mempertimbangkan konsep faktor "kompresi".
sumber
Saya mendapatkan itu dari kesalahan ruang juga. Apa yang berhasil adalah mencabut salah satu kamera dan menancapkannya ke port USB lain pada PC stasioner saya - ada sekitar 6 atau 7 port USB yang tersebar tentang hal itu. Menjalankan 'show_webcams 0 1' lalu tiba-tiba memunculkan dua gambar.
sumber