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から新しい接続を作成して、以下のような感じで入力します。

Name欄は適当に好きな名前。URL欄には「rtmp://192.168.1.2:1935/live/hoge」のようなURLを入れます。認証は使わないのでLoginとかPasswordは空のまま。

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とかで使ってみてください。