obs-v4l2sinkを使ってLinux上のOBS Studioで合成した映像をSkypeやZoomに流す

nogajun
nogajun

_

2021/4/13追記

LinuxでOBS Studioを使う方法を検索していて検索エンジンでたどり着いた方は、こちらをご覧ください。


先日、OBS Studioで合成したカメラの画像をSkypeやZoomに流すという記事を書きました。

その中で「obs-v4l2sinkがうまく動かなかった」と書きましたが、その原因がわかったので使い方を書きます。

obs-v4l2sinkのサイトはこちら。

v4l2loopbackのインストール

以前の記事と同じくv4l2loopbackは必要なのでインストールしてください。Debian/UbuntuではパッケージがあるのでaptでインストールするだけでOKです。

 $ sudo apt install v4l2loopback-dkms v4l2loopback-utils

v4l2loopbackを組み込む

v4l2loopbackはカーネルモジュールですが、自動的に組み込まれることはないので自分で組み込みます。ここで重要なオプションは「exclusive_caps=1」だけです。それ以外は適宜変更してください。

 $ sudo /usr/sbin/modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1

横道の話ですが、このコマンドはGithubのIssueあったものをそのまま使ってます。デバイス番号に大きな番号を振るとv4l2loopbackデバイスの見分けがつきやすく、カードラベルを付けるとデバイス名が分かりやすくなるので今度から自分も真似します。

うまく組み込みめて問題がないようなら、毎回組み込みは面倒なので /etc/modprobe.d/v4l2loopback.conf というファイルを作って以下を追記しておきます。

 options v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1

obs-v4l2sinkのインストール

これはビルド済みのdebパッケージobs-v4l2sink.deb(amd64用)をインストールして使います。

ここに1つ目の罠があります。このパッケージはOBSプラグインのある適切な場所(/usr/lib/x86_64-linux-gnu/obs-plugins)にプラグインをインストールしてくれません。これを正しい場所からシンボリックリンクを貼ってOBSに読み込ませます。

 $ cd /usr/lib/x86_64-linux-gnu/obs-plugins
 $ sudo ln -s /usr/lib/obs-plugins/v4l2sink.so .

OBS Studioの設定

OBS Studioの設定ですが、ここにも2つ目の罠があります。

OBS Studioの設定画面を開いて、[映像]にある「基本(キャンパス)解像度」をカメラの解像度と合わせてください。カメラがHD(1280x720)なのに、ここをフルHD(1920x1080)にしていると真っ暗なままで映らないので気をつけてください。

OBS設定

これを確認・変更できたら設定は終わりです。

Skypeに流す

OBS Studioでカメラや合成する画像などをセットしたら、OBS Studioのメニューの[ツール]に、[v4l2sink]があるので起動します。

v4l2sink起動

v4l2sinkプロパティ画面が開いたら、VideoPathのところにビデオデバイス /dev/video10 と入力し、Video Formatは、そのままにしてStartボタンを押せば仮想カメラにOBS Studioの映像が流れます。

Skypeの設定

Skype側では設定を開いて、「音声/ビデオ」の右上にあるビデオデバイスを「OBS Cam」に変更するとOBS Studioの映像が流れてきます。

ここで流れない場合は、Webカメラの解像度とOBS出力の解像度が合っていないことが原因だと思うので、下のようにv4l2-ctlに--list-formats-extオプションを付けてWebカメラの解像度を確認して、OBSの解像度を合わせてみてください。

 $ v4l2-ctl --list-formats-ext

まとめ

いやー、できてよかった。ffmpegも悪くはないのですが遅延がひどくてツラかったので、遅延なくできるのはありがたいです。自分に関係する話では、オンライン授業とかにも使えそうなので活用してみようかと思います。