最近、3つのアプリケーション(Webブラウザ、ビデオ会議アプリケーション、およびストリームを保存するためのffmpeg)で同時に共有するWebカメラが必要でした。
/dev/video* ストリームを単純に共有することは不可能です。あるアプリケーションでこれを使用すると、他のアプリケーションでは使用できなくなり、他のアプリケーションでは「デバイスまたはリソースの使用中」または同様の状態が発生するためです。
そのため、Webカメラを3つのループバックにミラーリングする目的でv4l2ループバックに切り替えました。
3つのループバックを使用すると期待どおりに機能しましたが、本当に驚いたのは実際にはそうではありませんでした。必要3つのループバックがありますが、1つしかありません。
ループバックを作成してffmpegとして提供すると、シングルミラーループバック利用できる3つのアプリケーションを同時にすべて適用、「デバイスまたはリソースを使用中」の問題はありません。
だから思ったよりも良くなり、助けが必要な実際の問題もありませんでした。
しかし、私の質問は、ループバックを使用してどのようにこれを行うことができるかということです。なぜ元のソースを使用しないのですか?
単一ループバックを生成するコマンドの例:
sudo modprobe v4l2loopback video_nr=30 exclusive_caps=1 card_label="loopback cam"
ffmpeg を使用して /dev/video5 をループバック (/dev/video30) にミラーリングするコマンドの例。デフォルトは生データですが、最近の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-一般
- パッケージ: v4l2loopback-dkms 0.12.3-1
答え1
これは意図的に設計されています。まず、複数のプロセスがデバイス/dev/video0を開くことができますが、そのうちの1つだけが特定のコマンドを実行できるとします。コントロール(ioctl()) ストリームが開始されるまで。
V4L2コントロールビットレートなどを定義します。ストリーミングを開始した後は、カーネルでそれを変更することはできず、試してみるとEBUSY
返されます(デバイスまたはリソースを使用しています)。バラよりこのメモカーネルのソースコードから。ストリーミングを開始する前に設定する必要があるため、他の消費者を効果的にブロックします。
v4l2loopbackの違いは何ですか?ロジックとデータ構造を追加します。複数の開口部そして基本的に新しいコントロールを適用する試みはありません。独自のセッターを提供します。
v4l2loopback には複数のオープナーが必要です。少なくとも2つは便利です。読者で作家です。