LinuxでUSBデバイスが割り当てることができる帯域幅の量にどのように上限を設けますか?
同時に実行しようとしている安価なUSBWebカメラがいくつかあります。ランニング v4l2-ctl --list-formats-ext --device=/dev/videoN
は、両方とも30FPSと15FPSの両方でいくつかの非圧縮解像度をサポートしていることを示しています。
ただし、160x120の解像度で15 FPSでキャプチャするように構成した場合でも、480 Mbpsの帯域幅が割り当てられるため、通常、他のUSBデバイス、ましてや2番目のWebカメラを使用できなくなります。同じFPS /解像度で2番目のWebカメラからキャプチャしようとすると、エラーが発生します。
libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device
このエラーをグーグルで検索すると、通常、「あなたはSOLです、多分MJPGをサポートするカメラを購入しますか?」のような答えになります。
しかし、これはまったく意味がありません。
非圧縮の160x120RGBをキャプチャすると、フレームあたり160 * 120 * 3 = 57600バイトになります。 15 FPSでは、少なくとも864000バイト/秒の帯域幅が必要です(つまり、なんと.864 Mbpsまたは6.912 Mbits)! 480 Mbit/sをサポートするUSB2ハブがあります。一度に数十のこれらのWebカメラを実行するのに十分な帯域幅が必要ですが、1つのWebカメラを実行すると、USBハブのほぼすべての480メガビットが消費されます。
カメラは160x120をストリーミングするのに480Mbpsを必要としませんが、ドライバーにその量を割り当てるように指示しているので、OSレベルで、ドライバーに特定の量を割り当てるように強制する方法はありますか?
この男は提供します 解決策 それは何人かの人々のために働くようです。私の場合、試してみましたが何も変わりませんでしたが、ハードウェアに大きく依存しています。
Uvcvideoカーネルモジュールは、要求された帯域幅を無視し、適切な帯域幅を計算するように設定できます。試してみてください:
Sudo rmmod uvcvideo Sudo modprobe uvcvideo quirks=128
これは再起動するたびにリセットされます。これが機能する場合は、次のファイルを作成します。
Sudo vi /etc/modprobe.d/uvcvideo.conf
行を含む:
options uvcvideo quirks=128
実際、 このページ では、これが常に機能するとは限らないと述べており、ドライバーの関数uvc_init_video()のコードを変更するオプションも提供しています。
/* Isochronous endpoint, select the alternate setting. */ bandwidth = stream->ctrl.dwMaxPayloadTransferSize;