Linux'ta birden fazla USB web kamerası kullanma


30

Debian / Linux'ta birden fazla USB web kamerasının çalıştırılması aşağıdaki hatayı verir:

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device

Başlangıçta OpenCV'deki bir programlama sorunu gibi görünen şey, aynı hataları peyniri ve xawtv çalıştırarak ürettikten sonra gizemli bir donanım / yazılım sorunu arayışına dönüştü.

Görünüşe göre USB host kontrol cihazında mevcut olan tüm bant genişliğini isteyen web kameralarından kaynaklanıyor. Bunu göz önünde bulundurarak tek bir kameranın ne kadar bant genişliği kullandığını görmek için wireshark ve capinfos kullanmaya karar verdim .

4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720

İlginç! Bu, neden 320x240’daki iki kameranın çalıştığını ancak daha yüksek çözünürlüklerin başarısız olduğunu açıklayabilir. USB denetleyicim yalnızca USB 1 hızında çalışıyormuş gibi görünüyor, ancak lsusb , sözde saniyede 480 megabit destekleyen bir cihaza ait web kamerasını gösteriyor.

Web kameralarını, aşağıdaki komutları çalıştırarak maksimumlarını istemek yerine bant genişliği kullanımlarını hesaplamaya zorlamak için bir çözüm önerdi:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

Ne yazık ki bu fark yaratmadı, bu yüzden başka bir çözüm denemeye karar verdim. StackOverflow'ta yayınlanan bir yazı , web kameralarımın daha düşük bir FPS veya MJPEG gibi sıkıştırılmış video formatını kullanmalarını önerdi, ancak v4lctl listesini çalıştırdıktan sonra, web kameralarımdan hiçbiri video modlarını değiştirmeyi desteklemiyor gibi görünüyor.

Ve burada sıkışıp kaldım. Neden iki web kamerası maksimum USB 2 hızının çok altında çalışıyor? Bu hatayı üretti?

ps: Bu bir disk alanı sorunu değil, web kameraları başlatıldığında df hiçbir değişiklik göstermiyor.

pps: Bir fark yaratırsa , işte lsusb'un çıktısı

Yanıtlar:


25

Ding Ding! Freenode'daki # v4l'deki iyi insanların yardımlarıyla bunu çözmeyi başardık.

Uzun lafın kısası: v4l2-ctl , USB kamera sorunlarını gidermek için en iyi araçtır. Mevcut tüm komutları ve man sayfasını oku, söz verdiğim eğlenceli olacak. V4l2-ctl kullanarak kameralarımdan birinin sıkıştırılmış video modunu desteklemediğini keşfettim. Aşağıdaki komutu çalıştırarak kameralarınızın hangi modları desteklediğini kontrol edebilirsiniz:

v4l2-ctl -d /dev/video0 --list-formats

Bunun gibi bir şey çıktı.

 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)

Döndürülen yalnızca piksel biçimi "YUYV", "IUYV", "I420" veya "GBRG" ise, bu biçimler sıkıştırılmamış olduğundan, USB denetleyicisi başına yalnızca bir kamera çalıştırabilirsiniz *. MJPEG veya başka bir sıkıştırma biçimini destekleyen çoklu web kamerası kullanılması iyi sonuç verir.

Benim gibi OpenCV kullanıyorsanız, varsayılan piksel biçiminin yine de sıkıştırma kullanmak için OpenCV varsayılanları göründüğü gibi sıkıştırılmadığından endişelenmeyin.

** 320x240 veya daha düşük çözünürlükten memnun değilseniz


1
Merhaba, mümkünse, her ikisini de 640x480'de yakalayabilmem için 2 kameranın piksel biçimini nasıl ayarlamam gerektiğini söyleyebilir misiniz? OpenCV kullanıyorum ve şu anda her iki kameranın sadece 320x240 veya daha düşük
sürümlerde

Aha! v4l2-ctlgerçekten hata ayıklama için mükemmel bir araçtır. Kameram hakkında çok şey öğrendim ve sorunu çözebildik. Neyse, kameramın çözünürlüğünü kamera çıkış modunu 320x240kullanmaya zorlayarak ve çözerek düzeltebildim YUYV. guvcviewayrıca çok yardımcı oldu.
Sheharyar

320x240 veya daha düşük çözünürlükleri kullanırken, karışık sonuçlar alıyorum. Aynı marka / modelde 4 adet ucuz USB kamerası satın aldım. 160x120'de 2'yi çalıştırmaya çalışırken, bazıları birlikte iyi çalışır ve bazıları hafıza hatası verir. Hiçbir kafiye ya da sebep göremiyorum. Kabul ediyorum, bu web kameralarının her biri 3 dolara mal oluyor, bu yüzden sanırım parasını ödedim.
Cerin

Bu kameralardan ikisinin veya daha fazlasının USB 3.0'a bağlanması, USB 2.0 hub üzerinden bile iyi çalışıyor. YUYV ile kontrol edildi.
Michał Leon,

7

Cevap, SwDevRefugee tarafından yazılan ve yukarıda açıklanan uvcvideo değişikliklerini kullanmaktır. O ve ben, OpenWrt için derlenmiş mod kodunu almak için birlikte başarılı bir şekilde çalıştık. Çalıştırdığım sürüm, bir tplink wdr3600 yönlendiricisindeki OpenWRT DESIGNATED DRIVER (Bleeding Edge, r48130);

SONUÇ: Bir USB 2.0 hub aracılığıyla simüle olarak 1280x960 ve 15fps'de MJPG formatında çalışan 3 * c270 (logitech) alabilirim. Bağlanmak için dördüncü bir c270'im yok, üzgünüm.

Ayrıca 2 * c270 ve 1 * GEMBIRD 640 * 480 * 15fps YUV biçimine sahip olabilirim, ancak 2. GEMBIRD eklenmesi dehşete neden olur: "Yakalama başlatılamıyor: Cihazda yer kalmadı" (boşluk == bant genişliği, burada iyi biliyorum :)). GEMBIRD (1908: 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ olduğunu unutmayın .

3 * c270 ile CPU kullanımı bir wdr3600 için oldukça makul:

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 --

Topluluk biraz itibar ve destek verirse, SwDevRefugee'nin kodu uvc-linux'a almaya hazır olduğunu düşünüyorum.


4

Uvcvideo sürücüsüne baktım ve akış mjpeg sıkıştırılmışsa quirks = 128 module parametresi yoksayılır.

Seçtiğim web kameralarım Logitech C500 ve Logitech C270, C500 tarafından 1280x1024'te üretilen görüntünün 100kbayt, C270 tarafından 1280x960'ta üretilen görüntünün 200kbayt olduğunu gördüm.

C270'i 10 fps hızında çalıştırıyorsam, gereken bit hızı 10x200000x8 = 16Mbit / s'dir. Ubuntu 14.04'te uvc sürücü modülü, kare hızından bağımsız olarak her zaman 196Mbit / s ayırır. C500 için biraz daha iyi davranılmış, ancak yine de bir bant genişliği domuz.

Uvcvideo sürücüsünü değiştirdim, böylece sürücüye V4L2 arabirimi aracılığıyla bir "sıkıştırma" faktörü sağlayabiliyorum. Bu, değeri belirtmek için struct v4l2_pix_format içindeki priv niteliğini kullandığım için "küçük bir kesinlik". Sürücüde sıkıştırılmamış görüntünün boyutunu hesaplar ve ardından hangi USB bant genişliğini kullanacağını hesaplamak için sıkıştırma faktörüne böler.

Varsayılan olarak, kamera sıkıştırmak için özellikle zor bir görüntüyle karşılaşırsa, büyük bir marj sağlayan 10'luk bir sıkıştırma faktörü kullanırım. 1280x960 ve 10fps hızında çalışan C270 artık 41Mbit / s kullanıyor ve tek bir otobüste 4 kamerayı kolayca çalıştırabilirim.

Bu özellik ile ilgilenen varsa, uvcvideo sahiplerine "sıkıştırma" faktörü kavramını göz önünde bulundurmaya çalışacağım.


Ben ve potansiyel olarak OpenROV topluluğundaki diğer kişiler, modunuzu @SwDevRefugee uvc sürücüsüne kadar görmeye istekli olurdum. İki web kamerasını OpenROV'a entegre etmeye çalışıyorum (biri aşağıya doğru görünen görsel odometri, diğeri normal pilotluk / görüntüleme için), ancak aynı BW sorunuyla karşılaşıyorum. Modunuzu yayınlamayı / veya değişiklik için bir çekme isteği göndermeyi düşündünüz mü?

Uvc sürücüsünde değişiklik istemenin resmi yolu bu posta listesi aracılığıyladır: linux-uvc-devel@lists.sourceforge.net. Değişiklik isteğimi 30 Aralık 2015’te ve daha sonra daha fazla bilgi içeren diğer bazı yazılar gönderdim Bir bakıcıdan cevap alamadım. Diğer iki kişi değişime ilgi duyduğunu belirtti. Herhangi bir işlem yapmak için kaç kişinin gerekli olduğunu bilmiyorum. Belki de @laughlinb mail listesine de gönderebilir.
SwDevAlien

@SwDevRefugee: Tavsiyenizi rica ediyorum unix.stackexchange.com/q/287279/52764
Ragav

@Ragav: Tüm kameraları aynı anda uygun çözünürlüklerde açarak luvcview gibi iyi davranışlı bir uygulama kullanarak uygun bir çözünürlükte açarak problemi izole etmeniz gerektiğini düşünüyorum.
SwDevAlien 3

1
Ragav'ın sorunu, kameralarının yalnızca YUYV'yi desteklemesi ve tuhaflıklar = 0x80 işaretini kullanması durumunda, sürücü onu kamera başına en az 1024 bayt / mikro kare (65,5 Mbit / s) kullanmaya zorluyor. Bu, kameraların desteklediği en düşük bant genişliğinin 2040 bayt / mikro çerçeve olması gerçeğiyle birleşiyor, bu yüzden 6fps'de sadece 320x240 istediği halde bir USB veriyolunda sadece 2 kameraya sahip olabiliyor. Uvcvideo sürücüsüne çekirdeğin 2.6.32 ve 3.16 sürümleri arasında bir yere en az 1024 bayt / mikro çerçeve kısıtlaması eklendi.
SwDevAlien

-1

Bunu uzaydan aldım hatası da. Amacım kameralardan birinin fişini çekip sabit bilgisayarımdaki başka bir USB portuna takmaktı; üzerine dağılmış 6 veya 7 USB portu vardı. 'Show_webcams 0 1' çalıştırıldığında aniden iki görüntü ortaya çıktı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.