Linux でデバイスが割り当てることができる USB 帯域幅を制限する方法

Linux でデバイスが割り当てることができる USB 帯域幅を制限する方法

Linux 上で USB デバイスが割り当てることができる帯域幅の量に上限を設定するにはどうすればよいでしょうか?

安価な USB ウェブカメラを 2 つ持っていて、同時に実行しようとしています。実行すると、v4l2-ctl --list-formats-ext --device=/dev/videoNどちらも 30 FPS と 15 FPS の両方でいくつかの非圧縮解像度をサポートしていることがわかります。

ただし、160x120 解像度で 15 FPS でキャプチャするように 1 つを構成しても、480 Mbps の帯域幅が割り当てられるため、通常は他の USB デバイスを使用できず、2 つ目のウェブカメラを使用することはできません。2 つ目のウェブカメラから同じ FPS/解像度でキャプチャしようとすると、次のエラーが発生します。

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

このエラーを Google で検索すると、通常は「もうだめです。MJPG をサポートするカメラを買ったらどうですか?」のような回答が返されます。

しかし、これは全く意味がありません。

圧縮されていない160x120 RGBをキャプチャすると、160*120*3 = 57600バイト/フレームになります。15FPSでは、少なくとも864000バイト/秒の帯域幅が必要です(つまり、0.864 Mbpsまたは6.912 メガビット)! 私はUSB2ハブを持っていて、480 メガビット/秒数十台のウェブカメラを同時に実行するには十分な帯域幅があるはずですが、1 台を実行するだけで USB ハブの 480 Mbit のほとんどすべてが消費されてしまいます。

カメラは 160x120 をストリーミングするのに 480 Mbps を必要としませんが、ドライバーにその量を割り当てるように指示しているので、OS レベルでドライバーに特定の量を割り当てるように強制する方法はありますか?

答え1

この男は解決策一部の人には効果があるようです。私の場合は試してみましたが何も変わりませんでしたが、ハードウェアに大きく依存します。

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;

関連情報