web-dev-qa-db-ja.com

複数のユーザーがWebカメラから*単一の* v4l2-loopbackストリームにアクセスできるのはなぜですか

最近、1つのWebカメラを3つのアプリケーション(Webブラウザー、ビデオ会議アプリ、およびストリームを保存するためのffmpeg)で同時に共有する必要がありました。

/ dev/video *ストリームを単純に共有することはできません。これは、1つのアプリケーションがそれを使用するとすぐに、他のアプリケーションは使用できなくなり、他のものは「デバイスまたはリソースビジー」または同等のものを取得するためです。

そこで、ウェブカメラを3つのループバックにミラーリングするつもりで、v4l2-loopbackに切り替えました。

3つのループバックを使用しても期待どおりに機能しますが、本当に驚いたのは、実際にはそうではないことが判明しましたneed 3ループバックですが、1つしかありません。

単一のループバックを作成し、それをffmpegでフィードする場合、-単一のミラーリングループバック同時に3つのアプリケーションすべてで使用でき、「デバイスまたはリソースはビジーではありません」 " 問題。

したがって、これは私が計画したものよりも優れており、助けを必要とする実際的な問題はありません。

しかし、私の質問は、これはループバックでどのように可能ですか?そして、なぜ元のソースを直接使用しないのですか?

単一のループバックを作成するコマンドの例:

Sudo modprobe v4l2loopback video_nr=30 exclusive_caps=1 card_label="loopback cam"

Ffmpegを使用して/ dev/video5をループバック(/ dev/video30)にミラーリングするコマンドの例。これはデフォルトでrawになりますが、ffmpegの最近のビルドではMJPEGのような代替ストリームを使用できます。動作は同じです。

ffmpeg -f v4l2 -i /dev/video5 -codec copy -f v4l2 /dev/video30

これを行った後、複数のアプリケーションで/ dev/video30にアクセスしてみてください。以下に例をいくつか示します。

ffmpeg -f v4l2 -i /dev/video30 -codec libx264 recordstream.mp4
ffplay -f video4linux2 -i /dev/video30

関連する場合のシステム情報:

  • Ubuntu 20.04
  • カーネル:5.4.0-31-generic
  • パッケージ:v4l2loopback-dkms 0.12.3-1
9
justyn

仕様によるものです。まず、複数のプロセスが/ dev/video0デバイスを開くことができるが、そのうちの1つだけが特定のcontrols(ioctl ())ストリーミングが開始されるまで。

これらのV4L2コントロールは、ビットレートなどを定義します。ストリーミングを開始した後、カーネルはそれらを変更することを許可せず、試行するとEBUSY(デバイスまたはリソースがビジー)を返します。カーネルソースの this note を参照してください。ストリーミングを開始する前にこれらを設定する必要があるため、他のコンシューマーを効果的にブロックします。

V4l2loopbackの違いは何ですか? 複数のオープナー のロジックとデータ構造を追加し、デフォルトでは独自のセッターを提供することで 新しいコントロールを適用しようとしない になります。

V4l2loopbackには複数のオープナーが必要であることに注意してください 少なくとも2つは便利です 。 1人の読者と1人の作家。

6