RTMPとffmpegでスマホをLinuxの無線ウェブカメラにしてみる
RTMPで色々遊んでみたくなったので、スマホで撮った映像をRTMPで送信出来るLarix Broadcasterというアプリを使って無線ウェブカメラ的なものを作ってみました。
手軽にざっくり遊べますが、遅延が凄いのでウェブ会議とかするのはしんどそうです。 遅延を追加しても良い配信用途とかそんな感じになるかも。
dockerでRTMPサーバを立てる
まずはRTMPを受信するためのサーバを作ります。
今回は単純に中継するだけなので、tiangolo/nginx-rtmpというDockerイメージを使わせて頂きます。 使い方はめちゃめちゃ簡単で、以下のように普通にコンテナを起動するだけ。
$ docker run --rm -p 1935:1935 tiangolo/nginx-rtmp
起動ログとかは出ませんが、何も無ければ動いているはず。
スマホから映像を送る
映像の送信にはLarix Broadcasterというアプリを使いました。 Android版とiOS版の両方があります。
アプリを起動したら画面右にある歯車マークから Settings を開いて、 Connections を選択します。。 New connectionから新しい接続を作成して、以下のような感じで入力します。
URLのアドレスは接続したいPCのアドレスを入れてください。
/hoge
の部分は複数繋ぐ時の識別子で、好きな名前を設定出来ます。
出来たらSAVEして、最初の画面まで戻ります。 最後に赤い丸の撮影ボタンを押したら送信が始まります。
mplayerで確認
Dockerのコンソールにステータスが出たりもせずよく分からないので、まずは一旦MPlayerを使って確認をします。 コマンドは以下のような感じ。
$ mplayer rtmp://localhost:1935/live/hoge
上手くいっていれば、スマホからのライブ映像が画面に表示されるはずです。
仮想ウェブカメラを準備する
とりあえずリモートカメラは出来ましたが、このままだとウェブカメラとしては使えません。 なので、Linux上でのウェブカメラの規格であるv4l2の形式に変換する必要があります。
映像をウェブカメラとして認識してもらうために、以前Pythonで仮想ウェブカメラを作って遊んだときにも使ったv4l2loopbackをインストールします。 aptとかyumで適当に入れてください。
インストール出来たら、以下のコマンドでカーネルモジュールを読み込みます。
$ sudo modprobe v4l2loopback exclusive_caps=1 video_nr=100
これを実行すると、/etc/video100
が追加されているはずです。
video_nr
で渡している番号が100
の部分になっているので、分かりやすい番号を付けてください。
ffmpegでv4l2に変換
仮想カメラが出来たので、そこにRTMPサーバから映像を流し込みます。
今回は手っ取り早く、ffmpegを使って変換を行なうことにします。 コマンドは以下のような感じ。
$ ffmpeg -i rtmp://localhost:1935/live/hoge -f v4l2 /dev/video100
これでnginx-rtmpが受信したRTMP形式の動画が、v4l2形式になって/dev/video100
に流れているはずです。
mplayerでもう一回確認
上手く出来ているか確認するために、もう一度MPlayerで動作確認をします。
今度は/dev/video100
から開くので、以下のような感じ。
$ mplayer tv:// -tv device=/dev/video100
やや面倒臭いのですが、普通にmplayer /dev/video100
とかしても再生出来ません。
なので、上記のような渡し方をする必要があります。
これで映像が表示されれば、ウェブカメラとして使えるようになっているはずです。 あとは適当にZoomとかTeamsとかで使ってみてください。