最近、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
関連する場合のシステム情報:
仕様によるものです。まず、複数のプロセスが/ dev/video0デバイスを開くことができるが、そのうちの1つだけが特定のcontrols(ioctl ())ストリーミングが開始されるまで。
これらのV4L2コントロールは、ビットレートなどを定義します。ストリーミングを開始した後、カーネルはそれらを変更することを許可せず、試行するとEBUSY
(デバイスまたはリソースがビジー)を返します。カーネルソースの this note を参照してください。ストリーミングを開始する前にこれらを設定する必要があるため、他のコンシューマーを効果的にブロックします。
V4l2loopbackの違いは何ですか? 複数のオープナー のロジックとデータ構造を追加し、デフォルトでは独自のセッターを提供することで 新しいコントロールを適用しようとしない になります。
V4l2loopbackには複数のオープナーが必要であることに注意してください 少なくとも2つは便利です 。 1人の読者と1人の作家。