KOTET'S PERSONAL BLOG

#linux v4l2loopbackで画面キャプチャをカメラ入力にする

Created: , Last modified:
#linux #tech

これは1年以上前の記事です

ここに書かれている情報、見解は現在のものとは異なっている場合があります。

最後に記事を書いたのが2019年のまま4月下旬になってしまいました。 今日は「画面キャプチャ カメラ入力」でググって出てきてほしいと思った記事を書きます。 愛知県立大学はCOVID-19の影響により基本的にすべての活動をリモートで行うことになりました。 すべての活動が強制的にリモートになるとビデオ通話をする上でいろんな選択肢が欲しくなります。 今日は画面キャプチャをそのままカメラとして使いたいなと思いました。

v4l2loopback

v4l2loopbackはダミーのビデオデバイスを作れるカーネルモジュールです。

umlaeute/v4l2loopback: v4l2-loopback device

このカーネルモジュールをロードするとループバックデバイス/dev/videoXが生えてきます。 それに何かを書き込むと、書き込んだデータストリームをカメラ入力として使えるようになります。

Video for Linux 2の略なので、4と2の間にあるのは数字の1ではなくアルファベットのLです。 間違えないようにしましょう(1敗)。 ブイフォーエルツーですよ! 気をつけて!

インストール

Arch Linuxではv4l2loopback-dkmsというAURパッケージが利用できます。 Ubuntuにも同名のパッケージが存在しますが、バージョンが古くてうまく動かなかったりするのでソースからインストールしましょう。

$ sudo apt install build-essential libelf-dev linux-headers-$(uname -r) unzip
$ git clone https://github.com/umlaeute/v4l2loopback.git
$ cd v4l2loopback
$ make && sudo make install
$ sudo depmod -a

設定

/etc/modprobe.d/v4l2loopback.confにオプションを書きます。

$ echo "options v4l2loopback video_nr=42 exclusive_caps=1" | sudo tee -a /etc/modprobe.d/v4l2loopback.conf

video_nrオプションで作られるループバックデバイスのIDを指定できます。 今回はてきとうに42にします。 3,7,21,42のように複数のデバイスを作ることもできます。

exclusive_capsはChrome等でデバイスを使えるようにするためのオプションです。

ロード

次に/etc/modules-load.d/modules.confv4l2loopbackと書き足して、カーネルモジュールが自動的にロードされるようにします。

$ echo v4l2loopback | sudo tee -a /etc/modules-load.d/modules.conf

systemd-modules-load.serviceを再起動することでカーネルモジュールが読み込まれます。 これ以降は起動時に自動的にカーネルモジュールがロードされるようになります。

$ sudo systemctl restart systemd-modules-load.service

新しく/dev/video42が生えているのがわかります。

$ ls /dev/video*
/dev/video0  /dev/video42

ffmpeg

上で作った/dev/video42に映像を流し込んでいきます。 いろいろ方法があるようですがffmpegを使います。 ffmpegのインストールは以下のコマンドでできます。

$ sudo apt install ffmpeg

以下のコマンドで画面キャプチャのビデオストリームの色空間を変換し、/dev/video42に出力します。 -s 1920x1080にはキャプチャしたい領域のサイズ、-i $DISPLAY+0,0にはキャプチャ領域のオフセットを指定します。 たとえば画面左上から右に123px、下に456pxの場合-i $DISPLAY+123,456のようになります。 使っている画面に応じて適宜書き換えてください。

$ ffmpeg -f x11grab -s 1920x1080 -i $DISPLAY+0,0 -vf format=pix_fmts=yuv420p -f v4l2 /dev/video42

使うサービスによっては勝手に映像をクリッピングすることがあるので、 画面全体ではなくマウスを追いかけるような映像にする場合は以下のようにします。

ffmpeg -f x11grab -follow_mouse centered -video_size vga -i $DISPLAY -vf format=pix_fmts=yuv420p -f v4l2 /dev/video42

もちろんスクリーンキャスト以外の映像も送れるので、ffmpegわかるマンはいろいろ遊んでみましょう。

結果

上のコマンドが走っている間、ChromeでなにかしらのWebビデオチャットを開いたりするとDummy video deviceという名前のカメラが増えています。