Linux の v4l2loopback:導入・永続化・よくあるエラー
Linux には仮想カメラが標準で用意されていません。アプリは /dev/video0 のようなデバイスを開いてフレームを読み取り、カーネルはその背後に実際のハードウェアがあることを前提とします。v4l2loopback は、カメラのように振る舞いながら中身をソフトウェアから供給されるデバイスを作るカーネルモジュールです。
Linux における仮想カメラの土台であり、OBS も ffmpeg のパイプラインも CamLooper も、すべてループバックデバイスに書き込みます。正しい設定手順は次のとおりです。
インストール
カーネル更新のたびにモジュールが自動で再ビルドされるよう、DKMS パッケージを入れてください。
# Debian / Ubuntu
sudo apt install v4l2loopback-dkms
# Fedora / RHEL
sudo dnf install v4l2loopback
# Arch
sudo pacman -S v4l2loopback-dkms
ここで DKMS が重要です。これがないとモジュールはインストール時点のカーネル向けにビルドされ、次のカーネル更新後に仮想カメラが何も告げずに動かなくなります。
モジュールの読み込み
sudo modprobe v4l2loopback
デバイスができたか確認します。
lsmod | grep v4l2loopback
ls -l /dev/video*
読み込み時に便利なオプション:
sudo modprobe v4l2loopback \
devices=1 \
video_nr=10 \
card_label="Virtual Camera" \
exclusive_caps=1
video_nr=10はデバイスを/dev/video10に固定し、実際のWebカメラとの衝突を避けますcard_labelはアプリのカメラ一覧に表示される名前を決めますexclusive_caps=1が決定的なオプションです。何かが書き込んでいるときだけキャプチャ機能を告知するようになります。Chrome や Firefox、いくつかの Electron アプリはこれがないループバックデバイスを無視するため、v4l2-ctlでは見えているのにブラウザには出てこない、という状況が起こります
再起動後も維持する
modprobe の効果は再起動までです。次の2つのファイルで恒久化します。
# /etc/modules-load.d/v4l2loopback.conf
v4l2loopback
# /etc/modprobe.d/v4l2loopback.conf
options v4l2loopback devices=1 video_nr=10 card_label="Virtual Camera" exclusive_caps=1
前者が起動時にモジュールを読み込み、後者がオプションを渡します。前者だけを書いて、オプションが消えたと悩む例がよくあります。
アプリなしで動作確認する
ffmpeg でループ再生の動画をデバイスに流し込みます。
ffmpeg -stream_loop -1 -re -i video.mp4 \
-f v4l2 -pix_fmt yuv420p /dev/video10
-re は実時間に合わせて流量を調整します(これがないと ffmpeg は可能な限り速く書き込み、結果は使い物になりません)。-stream_loop -1 は無限に繰り返し、yuv420p はWebカメラを利用する側が期待するピクセル形式です。ブラウザでWebカメラのテストページを開けば、動画が見えるはずです。
よくあるエラー
modprobe: ERROR: could not insert 'v4l2loopback': Required key not available
セキュアブートが未署名のモジュールを拒否しています。Machine Owner Key を登録してモジュールに署名するか、ファームウェアでセキュアブートを無効にしてください。署名済みのモジュールを配布しているディストリビューションなら、この問題自体が起きません。
モジュールはビルドされるのに /dev/video デバイスが現れない
modprobe の直後に dmesg | tail を確認してください。モジュールと稼働中カーネルのバージョン不一致がここに現れます。更新後に DKMS が再ビルドしていない典型的な兆候です。
カメラは存在するのにブラウザが認識しない
exclusive_caps=1 を付けてモジュールを読み込んでください。圧倒的に多い原因です。
Flatpak アプリからカメラが見えない
サンドボックスは許可するまでデバイスへのアクセスを遮断します。
flatpak override --user --device=all com.obsproject.Studio
これらをすべて省くには
以上は一度きりの作業ですが、動画をカメラとして再生できるようになるまでにターミナル操作と再起動が必要なことに変わりはありません。「OBS を使えばいい」という助言が、Windows より Linux で難しくなるのはこのためです。
CamLooper の .deb と .rpm はこれを代わりに行います。v4l2loopback-dkms を依存関係として宣言し、上で示した modules-load.d と modprobe.d のファイルを配置し、インストール中にモジュールを読み込みます。インストーラーが終わった時点でカメラが使え、再起動後も同様です。ターミナルも再起動も不要で、カーネル更新をまたいでも DKMS が動作を保ちます。