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

nogajun
nogajun

_


彼女とSkypeで話をしていたとき「宛先はこちら!」とテレビで合成されたテロップを指をさすような冗談をやったのだけれど、本当にできないかと思って調べたらできたのでメモ。

原理としては簡単でカメラの出力をOBSを入れて、OBSの出力を仮想カメラデバイスとしてSkypeに渡せば実現できます。出力をSkypeに渡す方法ですが、LinuxでカメラはVideo4Linux(v4l)で扱っています。そのv4lの仮想デバイスを作るカーネルモジュール「v4l2loopback」を使えばカメラとして見えるので、これを使って渡します。流れとしてはこんな感じです。

 元の接続:
 [カメラ]-- /dev/video(カメラ) -->[Skype]

 今回作る接続
 [カメラ]-- /dev/video(カメラ) -->[OBS Studio]--> ffmpeg --> /dev/video(v4l2loopback) -->[Skype]

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プラグインを使うと、きちんと送信できるはずですが、うまくビルドできなかったので、こういう手段となりました。改善したいなぁ…。