Linuxで複数のUSB Webカメラを使用する


30

Debian / Linuxで複数のUSB Webカメラを実行すると、次のエラーが発生します。

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

当初、OpenCVのプログラミングの問題のように思われたものが、チーズとxawtvを実行して同じエラーが発生した後、謎のハードウェア/ソフトウェアの問題の探求に変わりました。

どうやらそれは、USBホストコントローラーで利用可能なすべての帯域幅を要求するウェブカメラが原因です。それを念頭に置いて、wiresharkcapinfosを実行して、1台のカメラがどれだけの帯域幅を使用しているかを確認することにしました。

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

面白い!320x240の2台のカメラが機能するが、それ以上の解像度は失敗する理由を説明するかもしれません。USBコントローラーがUSB 1の速度でのみ動作しているように見えますが、lsusbは、480メガビット/秒をサポートするデバイスに属する両方のWebカメラを表示します。

1つのソリューションでは、次のコマンドを実行して最大値を要求するのではなく、ウェブカメラに帯域幅使用量を強制的に計算させることを提案しました。

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

残念ながら違いはありませんでしたので、別の解決策を試してみることにしました。StackOverflowの投稿は、Webカメラに低FPSまたはMJPEGなどの圧縮ビデオ形式を使用するように指示することが提案されましたが、v4lctl listを実行した後、ビデオモードの変更をサポートするWebカメラは表示されません。

そして、それは私が立ち往生しているところです。USB 2の最大速度を十分に下回る速度で動作する2つのWebカメラがこのエラーを生成するのはなぜですか?

ps:ディスク容量の問題ではありません。ウェブカメラの起動時にdfに変更は表示されません。

pps:違いがある場合、ここにlsusbの出力があります

回答:


25

ディンディン!freenodeの#v4lにいる素敵な人々の助けを借りて、なんとかこの問題を解決しました。

簡単に言えば、v4l2-ctlはUSBカメラの問題をデバッグするための最良のツールです。利用可能なすべてのコマンドとマニュアルページを読んでください。私は約束します。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以下の解像度に満足していない限り。*


1
こんにちは、可能であれば、両方のカメラを640x480でキャプチャできるように、2台のカメラのピクセル形式を設定する方法を教えてください。私はOpenCVのを使用して、あなたが320×240以下でどこ両方のカメラがするだけの仕事を持っているように、現在、同じ状況を経験しています
lexma

あぁ!v4l2-ctl実際、デバッグ用の優れたツールです。カメラについて多くのことを知り、問題を解決することができました。とにかく、私は私のカメラの解像度を強制的にそれを修正することができました320x240し、使用してYUYVカメラの出力モードとして。guvcviewまた、多くを助けました。
Sheharyar

320x240以下の解像度を使用すると、混合した結果が得られます。同じメーカー/モデルの4つの安価なUSBウェブカメラを購入しました。160x120で2を実行しようとすると、それらの一部は正常に機能し、一部はメモリエラーを発生させました。韻も理由もない。確かに、これらのウェブカメラの価格は1ドル3ドルなので、私が支払った金額を手に入れたと思います。
セリン

これらのカメラのうち2台以上をUSB3.0に接続すると、USB2.0ハブを介しても正常に機能します。YUYVで確認しました。
ミチャウレオン

7

答えは、SwDevRefugeeによって記述され、上記で説明したuvcvideoの変更を使用することです。彼と私は協力して、OpenWrt用にmod'edコードをコンパイルすることに成功しました。実行しているバージョンは、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に取り込むことをいとわないと思います。


4

uvcvideoドライバーを調べましたが、ストリームがmjpeg圧縮されている場合、quirks = 128モジュールパラメーターは無視されます。

私が選んだウェブカメラはLogitech C500とLogitech C270で、C500で1280x1024で生成された画像は100kバイトで、C270で1280x960で生成された画像は200kバイトであることがわかりました。

C270を10fpsで実行する場合、必要なビットレートは10x200000x8 = 16Mbit / sです。Ubuntu 14.04では、uvcdriverモジュールはフレームレートに関係なく常に196Mbits / sを割り当てます。C500の場合、動作は少し良くなりますが、それでも帯域幅を浪費します。

V4L2インターフェイスを介して「圧縮」係数をドライバーに提供できるように、uvcvideoドライバーを変更しました。値を指定するためにstruct v4l2_pix_formatのpriv属性を使用したという点で、「ちょっとしたハック」です。ドライバーでは、非圧縮イメージのサイズを計算し、使用するUSB​​帯域幅を計算するために圧縮係数で除算します。

デフォルトでは10の圧縮係数を使用します。これにより、カメラで圧縮するのが特に難しい画像に遭遇した場合に大きなマージンが得られます。1280x960および10fpsで動作するC270は41Mbit / sを使用するようになり、1つのバスで4台のカメラを簡単に実行できます。

誰かがこの機能に興味を持っているなら、私はuvcvideoメンテナーに「圧縮」要素の概念を考慮してもらうよう試みます。


私とOpenROVコミュニティの他のメンバーは、uvcドライバー@SwDevRefugeeに対するあなたのmodを見ることに熱心です。2つのWebカメラをOpenROVに統合しようと取り組んでいます(1つは下向きの視覚走行距離測定用、もう1つは通常の操縦/表示用)が、同じBW問題に直面しています。MODの投稿/変更のプルリクエストの送信について考えたことはありますか?

uvcドライバーの変更を要求する公式の方法は、次のメーリングリストを使用することです:linux-uvc-devel@lists.sourceforge.net。変更要求を2015年12月30日に投稿し、さらに詳細な情報を含む他の投稿を投稿しました。メンテナーからの返信がありません。他の2人がこの変更に関心を示しています。アクションを取得するのに何人が必要かわかりません。おそらく@laughlinbもメーリングリストに投稿できます。
SwDevAlien

@SwDevRefugee:私はあなたのアドバイスを希望unix.stackexchange.com/q/287279/52764
Ragav

@Ragav:障害が発生した場合に有益なエラーメッセージを表示するluvcviewなどの動作の良いアプリケーションを使用して、適切な解像度ですべてのカメラを同時に開くことで問題を特定する必要があると思います
SwDevAlien

1
Ragavの問題は、彼のカメラがYUYVのみをサポートし、ドライバーがquirks = 0x80フラグを使用すると、ドライバーがカメラあたり少なくとも1024バイト/マイクロフレーム(65.5 Mbit / s)を使用することを強制することです。これは、カメラがサポートする最低のより大きな帯域幅が2040バイト/マイクロフレームであるため、6fpsで320x240しか必要としないにもかかわらず、1つのUSBバスで2台のカメラしか使用できないという事実によって悪化します。カーネルの2.6.32と3.16リリースの間のどこかに、最小1024バイト/マイクロフレームの制限がuvcvideoドライバーに追加されました。
SwDevAlien

-1

スペース不足エラーも発生しました。うまくいったのは、カメラの1つを取り外し、それを固定PCの別のUSBポートに接続することでした-6個または7個のUSBポートが散在しています。「show_webcams 0 1」を実行すると、突然2つの画像が表示されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.