「V4l2loopback」の版間の差分
(冒頭を同期) |
(同期) |
||
(2人の利用者による、間の15版が非表示) | |||
1行目: | 1行目: | ||
{{Lowercase title}} |
{{Lowercase title}} |
||
− | [[Category: |
+ | [[Category:ビデオ]] |
− | [[Category: |
+ | [[Category:デジタルイメージング]] |
[[en:v4l2loopback]] |
[[en:v4l2loopback]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
13行目: | 13行目: | ||
== インストール == |
== インストール == |
||
− | + | {{Pkg|v4l2loopback-dkms}} パッケージに加えて対象のカーネルのヘッダーファイル'''も'''[[インストール]]してください ([[Dynamic Kernel Module Support#インストール]] を参照)。例えば、デフォルトの {{Pkg|linux}} カーネルの場合、ヘッダファイルは {{Pkg|linux-headers}} です。他のカーネルにはそれぞれのヘッダファイルパッケージがあります |
|
− | + | コマンドラインユーティリティは {{Pkg|v4l2loopback-utils}} と {{Pkg|v4l-utils}} によって提供されています。 |
|
+ | この記事で紹介している使用例の多くは {{Pkg|ffmpeg}} も使用します。 |
||
− | Many of the use case examples in this article also use {{Pkg|ffmpeg}}. |
||
== カーネルモジュールをロードする == |
== カーネルモジュールをロードする == |
||
− | + | {{ic|v4l2loopback}} [[カーネルモジュール]]は [[Dynamic Kernel Module Support]] でロードすることができます: |
|
# modprobe v4l2loopback |
# modprobe v4l2loopback |
||
− | {{ic|v4l2-ctl}} |
+ | {{ic|v4l2-ctl}} を使って全てのビデオデバイスを一覧表示することができます。{{ic|v4l2loopback}} デバイスが新たに現れるはずです: |
$ v4l2-ctl --list-devices |
$ v4l2-ctl --list-devices |
||
+ | {{ic|v4l2loopback}} は、デバイスの作成に関する様々なオプションを指定してロードすることができます: |
||
− | {{ic|v4l2loopback}} can be loaded with various options for device creation: |
||
# modprobe v4l2loopback video_nr=9 card_label=Video-Loopback exclusive_caps=1 |
# modprobe v4l2loopback video_nr=9 card_label=Video-Loopback exclusive_caps=1 |
||
− | + | このコマンドにより、{{ic|/dev/video9}} がループバックデバイスとして作成されます。{{ic|1=exclusive_caps=1}} は一部の Chromium/WebRTC ベースのアプリケーション ({{AUR|jitsi-meet-desktop-bin}} や {{AUR|zoom}} など) で必要です。その他のオプションは[https://github.com/umlaeute/v4l2loopback#options 公式のドキュメント]で確認できます。 |
|
+ | モジュールがすでにロードされている場合、上記のコマンドを実行してもおそらく何も起こりません。モジュールをまずアンロードし、その後にロードし直す必要があります: |
||
− | If the module is already loaded, the above command has likely no effect. The module first has to be unloaded, before loaded again: |
||
# modprobe -r v4l2loopback |
# modprobe -r v4l2loopback |
||
+ | 詳細は [[カーネルモジュール#手動でモジュールを扱う]] を参照してください。 |
||
− | See [[Kernel module#Manual module handling]] for more details. |
||
+ | {{Tip|[https://github.com/umlaeute/v4l2loopback#dynamic-device-management 公式のドキュメント]で説明されているように、{{ic|v4l2loopback-ctl}} を使うことでカーネルモジュールを再ロードすることなくデバイスを動的に管理することもできます。}} |
||
− | {{Tip|It is also possible to manage the devices dynamically without reloading the kernel module using {{ic|v4l2loopback-ctl}} as described in the [https://github.com/umlaeute/v4l2loopback#dynamic-device-management official documentation].}} |
||
+ | {{ic|devices}} 引数を使うことで、複数のループバックデバイスを作成することができます。それぞれのデバイスのオプションはコンマで区切って指定します。以下のコマンドは、{{ic|exclusive_caps}} が有効化された 3 つのループバックデバイスを作成します。ループデバイスは、{{ic|/dev/video8}}、{{ic|/dev/video9}}、そして利用可能な最初の {{ic|/dev/video''X''}} となります。 |
||
− | It is possible to create multiple loopback devices by using the {{ic|devices}} argument. Options for the every device are specified by using a comma. The following command creates three loopback devices, {{ic|/dev/video8}}, {{ic|/dev/video9}} and the first available {{ic|/dev/video''X''}}, all with {{ic|exclusive_caps}} enabled. |
||
# modprobe v4l2loopback devices=3 video_nr=8,9 exclusive_caps=1,1,1 card_label="Loopback-1,Loopback-2,Loopback-3" |
# modprobe v4l2loopback devices=3 video_nr=8,9 exclusive_caps=1,1,1 card_label="Loopback-1,Loopback-2,Loopback-3" |
||
+ | システムを再起動するとモジュールがアンロードされてしまいますが、起動時にカスタムのデバイスオプションを指定してモジュールを自動的にロードさせることができます。これは、ループバックデバイスが内部ウェブカメラとして使用されている場合に便利です。詳細は [[カーネルモジュール#モジュールの自動ロード]] と[https://github.com/umlaeute/v4l2loopback#load-the-module-at-boot 公式のドキュメント]を参照してください。 |
||
− | Restarting the system will unload the module, but is possible to load the modules automatically at boot with custom device options, which is useful if one loopback device is used for an internal webcam. See [[Kernel module#Automatic module loading]] and [https://github.com/umlaeute/v4l2loopback#load-the-module-at-boot the official documentation] for details. |
||
== v4l2loopback のビデオフィードを見る == |
== v4l2loopback のビデオフィードを見る == |
||
+ | {{Note|{{ic|v4l2loopback}} ビデオデバイスは、[[#使用例]] のようにストリームがそのビデオデバイスにパイプで接続されている場合にのみ、ビデオを出力します。さもないと、多くのアプリケーションはそのビデオデバイスを検出すらしません。}} |
||
− | {{Note|{{ic|v4l2loopback}} video devices only output video, if there is a stream piped into them like the examples in [[#Use cases]] do. Otherwise many applications won't even detect the video devices.}} |
||
− | + | ループバックデバイス {{ic|/dev/video0}} は、{{ic|ffplay}} ({{Pkg|ffmpeg}} に同梱)、{{Pkg|mpv}}、または {{ic|gst-launch}} ({{Pkg|gstreamer}} に同梱) を使ってプレビューすることができます: |
|
$ ffplay /dev/video0 |
$ ffplay /dev/video0 |
||
− | |||
$ mpv av://v4l2:/dev/video0 |
$ mpv av://v4l2:/dev/video0 |
||
− | |||
$ gst-launch-1.0 -v v4l2src device=/dev/video0 ! glimagesink |
$ gst-launch-1.0 -v v4l2src device=/dev/video0 ! glimagesink |
||
− | + | [[#カーネルモジュールをロードする]] で説明されている通り、{{ic|1=exclusive_caps=1}} を使えば、[[Chromium]] や {{AUR|jitsi-meet-desktop-bin}} や {{AUR|zoom}} といったアプリケーションはループバックデバイスを仮想ウェブカメラとして使用することができるようになるはずです (ビデオストリームがそのループバックデバイスにパイプで接続されている限り)。[https://webcamtests.com/ webcamtests.com] でブラウザで仮想ウェブカメラをテストできます。 |
|
+ | [[ウェブカメラ#アプリケーション]] も参照してください。 |
||
− | See also [[Webcam setup#Applications]]. |
||
+ | {{Tip|ビデオストリームをビデオデバイスにパイプで接続したが、アプリケーションがそのデバイスを検出しない場合、{{ic|1=exclusive_caps=1}} がある状態とない状態で試してください。}} |
||
− | {{Tip|If you pipe a video stream to the video device and your application doesn't detect it, try it with and without {{ic|1=exclusive_caps=1}}.}} |
||
{{Note| |
{{Note| |
||
+ | * [[Firefox]] では他の様々な問題が報告されています。 |
||
− | * Various other issues with [[Firefox]] have been reported. |
||
+ | * {{AUR|skypeforlinux-bin}} は仮想デバイスを検出するが、黒画面が出力されると報告されています。 |
||
− | * It has been reported, that {{AUR|skypeforlinux-stable-bin}} detects the virtual video device, but outputs a blank screen. |
||
}} |
}} |
||
− | == 使用 |
+ | == 使用例 == |
− | {{Note| |
+ | {{Note|v4l2loopback デバイスは v4l2 デバイスとして扱うことができるので、多くのアプリケーションがこれらのデバイスを使用することができます。[https://www.linuxtv.org/wiki/index.php/Development:_Video4Linux_APIs v4l2 デバイス]に関する詳細は [[ウェブカメラ設定]] の記事を参照してください。}} |
+ | 一般に、[[FFmpeg]] は v4l2loopback と組み合わせて使うと非常に便利です。FFmpeg は、{{ic|ffmpeg}} の引数 {{ic|1=-vf format=yuv420p -f v4l2}} を使用することにより、様々な入力ストリームを広くサポートされている yuv420p ピクセルフォーマットにトランスコードし、その出力を v4l2loopback デバイスにパイプで接続できるからです。以下の例を参照してください。 |
||
− | Generally, [[FFmpeg]] is very convenient in combination with v4l2loopback, because it can transcode various input streams to the widely supported yuv420p pixel format and pipe the output to a v4l2loopback device by using the {{ic|ffmpeg}} arguments {{ic|1=-vf format=yuv420p -f v4l2}}. See the examples below in this article. |
||
+ | また、FFmpeg は v4l2loopback デバイスを入力ストリームとして使用することもできます。[[FFmpeg#ウェブカメラの録画]] を参照してください。 |
||
− | FFmpeg can also use the v4l2loopback device as an input stream. See [[FFmpeg#Recording webcam]]. |
||
− | [[GStreamer]] |
+ | [[GStreamer]] もまた、v4l2loopback デバイスを[https://gstreamer.freedesktop.org/documentation/video4linux2/v4l2src.html ソース]や[https://gstreamer.freedesktop.org/documentation/video4linux2/v4l2sink.html シンク]として使用することができます。 |
− | + | その他の例は[https://github.com/umlaeute/v4l2loopback/wiki v4l2loopback の公式 wiki]にあります。 |
|
+ | {{Tip|[[PipeWire]] は新しい低レベルなマルチメディアフレームワークであり、v4l2loopback を使ってできることのいくつかは PipeWire を使っても行うことができます。}} |
||
− | {{Tip|[[PipeWire]] is an upcoming new low-level multimedia framework, which can also do some things v4l2loopback is used for.}} |
||
=== スクリーンキャスト === |
=== スクリーンキャスト === |
||
+ | 以下は、仮想ウェブカメラとして使用できる v4l2 ループバックデバイスにスクリーンをストリーミングして、画面共有を実装する例です。 |
||
− | Below are examples how to implement screen sharing by streaming the screen to a v4l2 loopback device, which can be used as a virtual webcam. |
||
==== FFmpeg を使って X11 をキャストする ==== |
==== FFmpeg を使って X11 をキャストする ==== |
||
− | {{Note| |
+ | {{Note|ここでは、{{ic|1=exclusive_caps=1}} で[[#カーネルモジュールをロードする]]必要があり、作成されたビデオデバイスは {{ic|/dev/video0}} であると仮定します。}} |
+ | [[FFmpeg]] を使用することにより、[[X11]] ディスプレイ上の領域を選択して、その領域を v4l2 ループバックデバイスへストリーミングすることができます: |
||
− | [[FFmpeg]] can be used to select a region on a [[X11]] display and then stream it to a v4l2 loopback device: |
||
$ ffmpeg -f x11grab -select_region 1 -show_region 1 -framerate 25 -i $DISPLAY -vf format=yuv420p -f v4l2 /dev/video0 |
$ ffmpeg -f x11grab -select_region 1 -show_region 1 -framerate 25 -i $DISPLAY -vf format=yuv420p -f v4l2 /dev/video0 |
||
− | + | 全ての引数説明は [https://www.ffmpeg.org/ffmpeg-devices.html#x11grab x11grab docs] を参照してください。 |
|
==== wf-recorder を使って Wayland をキャストする ==== |
==== wf-recorder を使って Wayland をキャストする ==== |
||
{{Note| |
{{Note| |
||
− | * |
+ | * 別のアプローチは [[PipeWire#WebRTC 画面共有]] を参照してください。 |
+ | * ここでは、{{ic|1=exclusive_caps=1}} で[[#カーネルモジュールをロードする]]必要があり、作成されたビデオデバイスは {{ic|/dev/video0}} であると仮定します。 |
||
− | * This requires [[#Loading the kernel module]] with {{ic|1=exclusive_caps=1}} and assumes the created video device is {{ic|/dev/video0}}. |
||
}} |
}} |
||
− | + | {{Pkg|wf-recorder}} (または {{AUR|wf-recorder-git}}) を[[インストール]]してください。{{ic|wf-recorder}} で画面の録画を開始し、映像を v4l2 ループバックデバイスにストリーミングするには、以下を使用してください: |
|
$ wf-recorder --muxer=v4l2 --codec=rawvideo --file=/dev/video0 -x yuv420p |
$ wf-recorder --muxer=v4l2 --codec=rawvideo --file=/dev/video0 -x yuv420p |
||
− | + | {{ic|Unknown V4L2 pixel format equivalent for rgb0}} というエラーが発生した場合、{{ic|--force-yuv}} または {{ic|-t}} を付けて {{ic|wf-recorder}} を実行して、GPU へデータを送る前にデータから yuv フォーマットへの変換を強制してください。[https://github.com/ammen99/wf-recorder/issues/164] |
|
===== 特定の領域のみをスクリーンキャストする ===== |
===== 特定の領域のみをスクリーンキャストする ===== |
||
+ | {{Warning|この方法では、ウィンドウがリサイズされた後も共有される領域が変わらないため、個々のアプリケーションの画面共有を適切に実装することはできません。}} |
||
− | {{Warning|This method does not involve a proper implementation of individual application sharing as the region being shared will not change after resizing any windows.}} |
||
+ | 先のセクションで説明した通り、{{Pkg|slurp}} で領域を選択しておくことにより、{{ic|wf-recorder}} は画面の一部分のみを録画することができます。この機能を使って仮想ビデオデバイスを介して特定の領域/アプリケーションウィンドウを共有するには、以下の修正されたコマンドを使って画面の録画を開始してください: |
||
− | As explained above, {{ic|wf-recorder}} is able to record only a portion of the screen by first selecting a region with {{Pkg|slurp}}. To use this functionality for sharing a specific region/application window through a virtual video device, start recording the screen with the following modified command: |
||
$ wf-recorder '''-g "$(slurp)"''' --muxer=v4l2 --codec=rawvideo --file=/dev/video0 -x yuv420p |
$ wf-recorder '''-g "$(slurp)"''' --muxer=v4l2 --codec=rawvideo --file=/dev/video0 -x yuv420p |
||
123行目: | 121行目: | ||
=== gPhoto でフォトカメラをウェブカメラとして使う === |
=== gPhoto でフォトカメラをウェブカメラとして使う === |
||
− | {{Note| |
+ | {{Note|ここでは、{{ic|1=exclusive_caps=1}} で[[#カーネルモジュールをロードする]]必要があり、作成されたビデオデバイスは {{ic|/dev/video0}} であると仮定します。}} |
+ | [[gPhoto]] がインストールされていて、あなたのカメラで動作可能である場合、{{ic|gphoto2}} と [[FFmpeg]] を使ってカメラのライブビューストリームを v4l2 ループバックデバイスにパイプで流すことができます: |
||
− | If [[gPhoto]] is installed and working with your camera, you can use {{ic|gphoto2}} and [[FFmpeg]] to pipe the liveview stream of the camera to a v4l2 loopback device: |
||
$ gphoto2 --stdout --capture-movie | ffmpeg -i - -vf format=yuv420p -f v4l2 /dev/video0 |
$ gphoto2 --stdout --capture-movie | ffmpeg -i - -vf format=yuv420p -f v4l2 /dev/video0 |
||
+ | トラブルシューティングは [[gPhoto#トラブルシューティング]] を参照してください。この方法は、[http://www.gphoto.org/doc/remote/ official gPhoto のウェブサイト]にリストアップされているライブビュー機能を搭載している全てのカメラでうまく行くはずです。 |
||
− | For troubleshooting refer to [[gPhoto#Troubleshooting]]. This should work with all cameras, which have the liveview functionality listed on the [http://www.gphoto.org/doc/remote/ official gPhoto website]. |
||
=== ネットワークストリームをウェブカメラとして使う === |
=== ネットワークストリームをウェブカメラとして使う === |
||
− | {{Note| |
+ | {{Note|ここでは、{{ic|1=exclusive_caps=1}} で[[#カーネルモジュールをロードする]]必要があり、作成されたビデオデバイスは {{ic|/dev/video0}} であると仮定します。}} |
+ | [[FFmpeg]] を使って、ネットワークストリームをキャプチャし、そのデータを v4l2 ループバックデバイスにパイプで流すことができます: |
||
− | [[FFmpeg]] can be used to capture a network stream and pipe it to a v4l2 loopback device: |
||
$ ffmpeg -i http://''ip_address'':''port''/video -vf format=yuv420p -f v4l2 /dev/video0 |
$ ffmpeg -i http://''ip_address'':''port''/video -vf format=yuv420p -f v4l2 /dev/video0 |
||
141行目: | 139行目: | ||
==== Android デバイスをウェブカメラとして使う ==== |
==== Android デバイスをウェブカメラとして使う ==== |
||
− | + | Android では、[https://play.google.com/store/apps/details?id=com.pas.webcam IP Webcam] を使って、ネットワークビデオストリームをブロードキャストすることができます。その場合、上記のコマンドを使ってデータを v4l2 ループバックデバイスにパイプで流し、デバイスをウェブカメラのように使用することができます。IP Webcam はデフォルトで 8080 ポートを使用します。 |
|
+ | ネットワーク接続にもよりますが、WiFi 経由のネットワークストリームは高レイテンシである場合があり、スタッタリングが発生する可能性があります。あなたのコンピュータと Android デバイスで [[Android Debug Bridge]] が設定されている場合、{{ic|adb forward}} を使って USB ケーブル経由でストリームをトンネルすることができます。これにより、より安定した接続を得られます: |
||
− | Depending on the network connection, the network stream over WiFi might have a lot of latency and could be stuttering. If you have [[Android Debug Bridge]] configured with your computer and the Android device, it is possible to tunnel the stream over a USB cable using {{ic|adb forward}}, which provides a more stable connection: |
||
$<nowiki> adb wait-for-usb-device && adb forward tcp:8080 tcp:8080 && ffmpeg -i http://127.0.0.1:8080/video -vf format=yuv420p -f v4l2 /dev/video0</nowiki> |
$<nowiki> adb wait-for-usb-device && adb forward tcp:8080 tcp:8080 && ffmpeg -i http://127.0.0.1:8080/video -vf format=yuv420p -f v4l2 /dev/video0</nowiki> |
||
− | {{Tip|1= |
+ | {{Tip|1=[https://play.google.com/store/apps/details?id=com.jacksoftw.webcam Iriun] と {{AUR|iriunwebcam-bin}} を使用するという選択肢もあります。}} |
+ | |||
+ | === ビデオ会議で背景画像を使用する === |
||
+ | |||
+ | Microsoft Teams や Zoom といったビデオ会議ソフトウェアで背景を隠す/置き換える方法がいくつかあります。 |
||
+ | |||
+ | ==== OBS ==== |
||
+ | |||
+ | [https://obsproject.com/ OBS] は動画配信者がビデオフィードの切り替えのためにリアルタイムの動画管理システムとして使っています。複数の "シーン" をセットアップすることができ (例えば、それぞれに異なる背景画像を設定するなど)、ボタンクリックでそれらを切り替えることができます。また、他のビデオフィルタを提供したり (新しいフィルタ用のプラグインシステムがあります)、複数のビデオフィードを同時に表示したりなどもできます。OBS は出力を v4l2loopback デバイスに送ることができ、V4L2 カメラをサポートする他のアプリケーションで使用することができます。 |
||
+ | |||
+ | これをセットアップするには: |
||
+ | |||
+ | # メインの {{Pkg|obs-studio}} パッケージと {{AUR|obs-backgroundremoval}} プラグインを[[インストール]]してください。 |
||
+ | # {{ic|obs}} を起動し、実際のカメラを入力ソースとしてシーンに追加してください。 |
||
+ | # カメラソースを右クリックしてフィルターを編集し、背景除去フィルタを追加してください。この状態では、背景が除去され、黒い背景のみが表示されているはずです。(詳細設定で、背景の除去ではなくぼかしを掛けることもできます。) |
||
+ | # "画像" タイプの他の入力ソースを追加し、所望の背景画像を選択してください。ソースのタイプは動画ファイルや他のウェブカメラにすることもできますが、うまく行くまでは画像で試しましょう。 |
||
+ | # ソースリスト内の画像エントリをドラッグし、映像ソースより下に配置してください。これで、背景画像が映像ソースより前ではなく後ろに表示されます。 |
||
+ | # 背景画像を移動/リサイズして、シーンの大部分を占めるようにしてください。 |
||
+ | # 仮想出力を有効化すれば、仮想ウェブカメラの準備は完了です。 |
||
+ | |||
+ | {{ic|obs}} は、ビデオ会議ソフトウェアで仮想カメラを使えるようにするには、仮想出力を有効化した状態で走らせ続けておく必要があります。 |
||
+ | |||
+ | 映像がおかしかったり何も表示されない場合は (出力の解像度を変更した後によく起こります)、V4L2 ループバックデバイスを一旦削除し、再度作り直す必要があるかもしれません (または、{{ic|v4l2loopback}} モジュールを一旦アンロードし、再度ロードし直す)。 |
||
+ | |||
+ | トラブルシューティングは上記の [[#v4l2loopback のビデオフィードを見る]] を見てください。これらのプログラムでフィードを正しく再生できるのであれば、問題はビデオフィードを取り入れている側のアプリケーションにあります。これらのユーティリティで動画を正しく再生できない場合は、ループバックデバイスのセットアップに問題があります。 |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
153行目: | 175行目: | ||
=== Firefox === |
=== Firefox === |
||
− | + | Firefox がビデオストリームを読み込むことができず、{{ic|AbortError: Starting video failed}} のようなメッセージが出力される場合、v4l2compat.so をプリロードしてみてください: |
|
$ LD_PRELOAD=/usr/lib/v4l1compat.so firefox |
$ LD_PRELOAD=/usr/lib/v4l1compat.so firefox |
||
159行目: | 181行目: | ||
=== ioctl(VIDIOC_G_FMT) === |
=== ioctl(VIDIOC_G_FMT) === |
||
− | + | {{ic|ffmpeg}} でビデオデバイスを使おうとしたときに {{ic|ioctl(VIDIOC_G_FMT)}} エラーが発生する場合、カーネルモジュールを一旦アンロードし、再びロードし直してみてください。 [https://github.com/umlaeute/v4l2loopback/issues/504] |
|
== 参照 == |
== 参照 == |
||
− | * [https://github.com/umlaeute/v4l2loopback v4l2loopback |
+ | * [https://github.com/umlaeute/v4l2loopback v4l2loopback リポジトリ] |
* [https://github.com/umlaeute/v4l2loopback/wiki v4l2loopback wiki] |
* [https://github.com/umlaeute/v4l2loopback/wiki v4l2loopback wiki] |
||
+ | |||
+ | {{TranslationStatus|v4l2loopback|2024-04-10|805091}} |
2024年4月10日 (水) 18:58時点における最新版
関連記事
プロジェクトのリポジトリより:
- v4l2loopback - V4L2 ループバックデバイスを作成するためのカーネルモジュール
- このモジュールにより、"仮想ビデオデバイス"を作成することができます。通常の (v4l2) アプリケーションは仮想ビデオデバイスを通常のビデオデバイスかのように読み取りますが、ビデオはキャプチャカードなどから読み取られずに他のアプリケーションによって生成されます。
インストール
v4l2loopback-dkms パッケージに加えて対象のカーネルのヘッダーファイルもインストールしてください (Dynamic Kernel Module Support#インストール を参照)。例えば、デフォルトの linux カーネルの場合、ヘッダファイルは linux-headers です。他のカーネルにはそれぞれのヘッダファイルパッケージがあります
コマンドラインユーティリティは v4l2loopback-utils と v4l-utils によって提供されています。
この記事で紹介している使用例の多くは ffmpeg も使用します。
カーネルモジュールをロードする
v4l2loopback
カーネルモジュールは Dynamic Kernel Module Support でロードすることができます:
# modprobe v4l2loopback
v4l2-ctl
を使って全てのビデオデバイスを一覧表示することができます。v4l2loopback
デバイスが新たに現れるはずです:
$ v4l2-ctl --list-devices
v4l2loopback
は、デバイスの作成に関する様々なオプションを指定してロードすることができます:
# modprobe v4l2loopback video_nr=9 card_label=Video-Loopback exclusive_caps=1
このコマンドにより、/dev/video9
がループバックデバイスとして作成されます。exclusive_caps=1
は一部の Chromium/WebRTC ベースのアプリケーション (jitsi-meet-desktop-binAUR や zoomAUR など) で必要です。その他のオプションは公式のドキュメントで確認できます。
モジュールがすでにロードされている場合、上記のコマンドを実行してもおそらく何も起こりません。モジュールをまずアンロードし、その後にロードし直す必要があります:
# modprobe -r v4l2loopback
詳細は カーネルモジュール#手動でモジュールを扱う を参照してください。
devices
引数を使うことで、複数のループバックデバイスを作成することができます。それぞれのデバイスのオプションはコンマで区切って指定します。以下のコマンドは、exclusive_caps
が有効化された 3 つのループバックデバイスを作成します。ループデバイスは、/dev/video8
、/dev/video9
、そして利用可能な最初の /dev/videoX
となります。
# modprobe v4l2loopback devices=3 video_nr=8,9 exclusive_caps=1,1,1 card_label="Loopback-1,Loopback-2,Loopback-3"
システムを再起動するとモジュールがアンロードされてしまいますが、起動時にカスタムのデバイスオプションを指定してモジュールを自動的にロードさせることができます。これは、ループバックデバイスが内部ウェブカメラとして使用されている場合に便利です。詳細は カーネルモジュール#モジュールの自動ロード と公式のドキュメントを参照してください。
v4l2loopback のビデオフィードを見る
ループバックデバイス /dev/video0
は、ffplay
(ffmpeg に同梱)、mpv、または gst-launch
(gstreamer に同梱) を使ってプレビューすることができます:
$ ffplay /dev/video0 $ mpv av://v4l2:/dev/video0 $ gst-launch-1.0 -v v4l2src device=/dev/video0 ! glimagesink
#カーネルモジュールをロードする で説明されている通り、exclusive_caps=1
を使えば、Chromium や jitsi-meet-desktop-binAUR や zoomAUR といったアプリケーションはループバックデバイスを仮想ウェブカメラとして使用することができるようになるはずです (ビデオストリームがそのループバックデバイスにパイプで接続されている限り)。webcamtests.com でブラウザで仮想ウェブカメラをテストできます。
ウェブカメラ#アプリケーション も参照してください。
使用例
一般に、FFmpeg は v4l2loopback と組み合わせて使うと非常に便利です。FFmpeg は、ffmpeg
の引数 -vf format=yuv420p -f v4l2
を使用することにより、様々な入力ストリームを広くサポートされている yuv420p ピクセルフォーマットにトランスコードし、その出力を v4l2loopback デバイスにパイプで接続できるからです。以下の例を参照してください。
また、FFmpeg は v4l2loopback デバイスを入力ストリームとして使用することもできます。FFmpeg#ウェブカメラの録画 を参照してください。
GStreamer もまた、v4l2loopback デバイスをソースやシンクとして使用することができます。
その他の例はv4l2loopback の公式 wikiにあります。
スクリーンキャスト
以下は、仮想ウェブカメラとして使用できる v4l2 ループバックデバイスにスクリーンをストリーミングして、画面共有を実装する例です。
FFmpeg を使って X11 をキャストする
FFmpeg を使用することにより、X11 ディスプレイ上の領域を選択して、その領域を v4l2 ループバックデバイスへストリーミングすることができます:
$ ffmpeg -f x11grab -select_region 1 -show_region 1 -framerate 25 -i $DISPLAY -vf format=yuv420p -f v4l2 /dev/video0
全ての引数説明は x11grab docs を参照してください。
wf-recorder を使って Wayland をキャストする
wf-recorder (または wf-recorder-gitAUR) をインストールしてください。wf-recorder
で画面の録画を開始し、映像を v4l2 ループバックデバイスにストリーミングするには、以下を使用してください:
$ wf-recorder --muxer=v4l2 --codec=rawvideo --file=/dev/video0 -x yuv420p
Unknown V4L2 pixel format equivalent for rgb0
というエラーが発生した場合、--force-yuv
または -t
を付けて wf-recorder
を実行して、GPU へデータを送る前にデータから yuv フォーマットへの変換を強制してください。[1]
特定の領域のみをスクリーンキャストする
先のセクションで説明した通り、slurp で領域を選択しておくことにより、wf-recorder
は画面の一部分のみを録画することができます。この機能を使って仮想ビデオデバイスを介して特定の領域/アプリケーションウィンドウを共有するには、以下の修正されたコマンドを使って画面の録画を開始してください:
$ wf-recorder -g "$(slurp)" --muxer=v4l2 --codec=rawvideo --file=/dev/video0 -x yuv420p
gPhoto でフォトカメラをウェブカメラとして使う
gPhoto がインストールされていて、あなたのカメラで動作可能である場合、gphoto2
と FFmpeg を使ってカメラのライブビューストリームを v4l2 ループバックデバイスにパイプで流すことができます:
$ gphoto2 --stdout --capture-movie | ffmpeg -i - -vf format=yuv420p -f v4l2 /dev/video0
トラブルシューティングは gPhoto#トラブルシューティング を参照してください。この方法は、official gPhoto のウェブサイトにリストアップされているライブビュー機能を搭載している全てのカメラでうまく行くはずです。
ネットワークストリームをウェブカメラとして使う
FFmpeg を使って、ネットワークストリームをキャプチャし、そのデータを v4l2 ループバックデバイスにパイプで流すことができます:
$ ffmpeg -i http://ip_address:port/video -vf format=yuv420p -f v4l2 /dev/video0
Android デバイスをウェブカメラとして使う
Android では、IP Webcam を使って、ネットワークビデオストリームをブロードキャストすることができます。その場合、上記のコマンドを使ってデータを v4l2 ループバックデバイスにパイプで流し、デバイスをウェブカメラのように使用することができます。IP Webcam はデフォルトで 8080 ポートを使用します。
ネットワーク接続にもよりますが、WiFi 経由のネットワークストリームは高レイテンシである場合があり、スタッタリングが発生する可能性があります。あなたのコンピュータと Android デバイスで Android Debug Bridge が設定されている場合、adb forward
を使って USB ケーブル経由でストリームをトンネルすることができます。これにより、より安定した接続を得られます:
$ adb wait-for-usb-device && adb forward tcp:8080 tcp:8080 && ffmpeg -i http://127.0.0.1:8080/video -vf format=yuv420p -f v4l2 /dev/video0
ビデオ会議で背景画像を使用する
Microsoft Teams や Zoom といったビデオ会議ソフトウェアで背景を隠す/置き換える方法がいくつかあります。
OBS
OBS は動画配信者がビデオフィードの切り替えのためにリアルタイムの動画管理システムとして使っています。複数の "シーン" をセットアップすることができ (例えば、それぞれに異なる背景画像を設定するなど)、ボタンクリックでそれらを切り替えることができます。また、他のビデオフィルタを提供したり (新しいフィルタ用のプラグインシステムがあります)、複数のビデオフィードを同時に表示したりなどもできます。OBS は出力を v4l2loopback デバイスに送ることができ、V4L2 カメラをサポートする他のアプリケーションで使用することができます。
これをセットアップするには:
- メインの obs-studio パッケージと obs-backgroundremovalAUR プラグインをインストールしてください。
obs
を起動し、実際のカメラを入力ソースとしてシーンに追加してください。- カメラソースを右クリックしてフィルターを編集し、背景除去フィルタを追加してください。この状態では、背景が除去され、黒い背景のみが表示されているはずです。(詳細設定で、背景の除去ではなくぼかしを掛けることもできます。)
- "画像" タイプの他の入力ソースを追加し、所望の背景画像を選択してください。ソースのタイプは動画ファイルや他のウェブカメラにすることもできますが、うまく行くまでは画像で試しましょう。
- ソースリスト内の画像エントリをドラッグし、映像ソースより下に配置してください。これで、背景画像が映像ソースより前ではなく後ろに表示されます。
- 背景画像を移動/リサイズして、シーンの大部分を占めるようにしてください。
- 仮想出力を有効化すれば、仮想ウェブカメラの準備は完了です。
obs
は、ビデオ会議ソフトウェアで仮想カメラを使えるようにするには、仮想出力を有効化した状態で走らせ続けておく必要があります。
映像がおかしかったり何も表示されない場合は (出力の解像度を変更した後によく起こります)、V4L2 ループバックデバイスを一旦削除し、再度作り直す必要があるかもしれません (または、v4l2loopback
モジュールを一旦アンロードし、再度ロードし直す)。
トラブルシューティングは上記の #v4l2loopback のビデオフィードを見る を見てください。これらのプログラムでフィードを正しく再生できるのであれば、問題はビデオフィードを取り入れている側のアプリケーションにあります。これらのユーティリティで動画を正しく再生できない場合は、ループバックデバイスのセットアップに問題があります。
トラブルシューティング
Firefox
Firefox がビデオストリームを読み込むことができず、AbortError: Starting video failed
のようなメッセージが出力される場合、v4l2compat.so をプリロードしてみてください:
$ LD_PRELOAD=/usr/lib/v4l1compat.so firefox
ioctl(VIDIOC_G_FMT)
ffmpeg
でビデオデバイスを使おうとしたときに ioctl(VIDIOC_G_FMT)
エラーが発生する場合、カーネルモジュールを一旦アンロードし、再びロードし直してみてください。 [2]