2020-03-15
_ ffmpegを使ってLinux上のOBS Studioで合成した映像をSkypeやZoomに流す
2020/4/13追記
記録として残していますが、OBS Studioでの合成はffmpegを使うと遅延がひどいので、こちらのobs-v4l2sinkを使ったほうがよいでしょう。
- obs-v4l2sinkを使ってLinux上のOBS Studioで合成した映像をSkypeやZoomに流す: - Days of Speed(2020-04-13): http://www.nofuture.tv/diary/20200413.html
彼女とSkypeで話をしていたとき「宛先はこちら!」とテレビで合成されたテロップを指をさすような冗談をやったのだけれど、本当にできないかと思って調べたらできたのでメモ。
原理としては簡単でカメラの出力をOBSを入れて、OBSの出力を仮想カメラデバイスとしてSkypeに渡せば実現できます。出力をSkypeに渡す方法ですが、LinuxでカメラはVideo4Linux(v4l)で扱っています。そのv4lの仮想デバイスを作るカーネルモジュール「v4l2loopback」を使えばカメラとして見えるので、これを使って渡します。流れとしてはこんな感じです。
元の接続: [カメラ]-- /dev/video(カメラ) -->[Skype] 今回作る接続 [カメラ]-- /dev/video(カメラ) -->[OBS Studio]--> ffmpeg --> /dev/video(v4l2loopback) -->[Skype]
- 参考: Question / Help - OBS to v4l2loopback | OBS Forums: https://obsproject.com/forum/threads/obs-to-v4l2loopback.62677/
v4l2loopbackのインストール
仮想カメラデバイスを作るv4l2loopbackですが、Debianパッケージになっているのでaptでサクっとインストールできます。
$ sudo apt install v4l2loopback-dkms v4l2loopback-utils
インストールをしたらmodprobeでカーネルに組み込みます
$ sudo /usr/sbin/modprobe v4l2loopback
lsmodで組み込まれたか確認します。
$ lsmod | grep v4l v4l2loopback 45056 0 videobuf2_v4l2 28672 1 uvcvideo videobuf2_common 57344 2 videobuf2_v4l2,uvcvideo videodev 249856 5 videobuf2_v4l2,v4l2loopback,uvcvideo,videobuf2_common mc 57344 5 videodev,snd_usb_audio,videobuf2_v4l2,uvcvideo,videobuf2_common
ちゃんとありますね。/devにあるビデオデバイスを見ると、自分の環境ではvideo2デバイスが追加されました。 ビデオデバイスの番号については環境によって違うので、それぞれで確認しておいてください。
$ ls -la /dev/video* crwxrwx---+ 1 root video 81, 0 3月 15 09:04 /dev/video0 crwxrwx---+ 1 root video 81, 1 3月 15 09:04 /dev/video1 crwxrwx---+ 1 root video 81, 2 3月 15 11:29 /dev/video2
OBS Studioの設定
OBS Studioの設定は、OBS Studioを起動してメニューの[ファイル]→[設定]を開き、設定画面にある「配信」と「出力を」以下のように設定すればOKです。配信のサーバー設定は必須ですが、出力の設定は、x264であればそのままでもいいですし設定を変更しても大丈夫です。
- 配信
- サービス: カスタム
- サーバー: rtmp://127.0.0.1:5050/
- 出力
- 出力モード: 詳細
- エンコーダー: x264
- チューン: zerolatency
仮想OBS配信サーバーを作る
v4l2loopbackでSkypeに流す出力の口とカメラを受けて出力するOBS Studioの設定はできましたが、OBS Studioから直接仮想ビデオデバイスに出力できないのでffmpegを使って配信出力を仮想ビデオデバイスに流せるようにします。
といっても、この1行を後ろで実行しておくだけです。
$ ffmpeg -re -listen 1 -i rtmp://127.0.0.1:5050/ -c:v rawvideo -an -pix_fmt yuyv422 -f v4l2 /dev/video2
Skypeに流してみる
Skypeに映像を流す準備ですが、通常使っているカメラを仮想ビデオデバイスに変更をすればOKです。変更方法は設定から「音声/ビデオ」の右上にあるビデオデバイスを「Dummy Video Device」に変更します。
これで準備が整ったのでOBS Studioの「配信開始」ボタンを押してからSkypeで通話をすれば、Skypeにいろいろ合成した映像を流すことができます。
まとめ
これで流せるようになってよかったよかった…。
といいたいのですが実は欠点があります。間にffmpegを挟んでいるせいだと思いますが、実際の映像から1,2秒ほど遅れがあります。これは実用的じゃない…。
「obs-v4l2sink」という仮想ビデオデバイスに直接映像を流すOBSプラグインを使うと、きちんと送信できるはずですが、うまくビルドできなかったので、こういう手段となりました。改善したいなぁ…。