Raspberry Pi4B で RTMPサーバ x2

やりたいこと

屋外のカメラ映像を屋内の複数のPCで閲覧したい。
同時に、屋内のカメラ映像も同じように閲覧したい。
さらに同時に、NAS に保存されているローカル向けの情報映像や画像も閲覧できるようにしたい。
上記3点を一画面で見たい。

加えて、屋外のカメラ映像は遠隔地の複数のPCでも閲覧したい。
屋内のカメラ映像は遠隔地では見えなくて良い。

尚、カメラ映像は高画質・高解像度である必要はなく、フレームレートも 5fps もあれば十分。
(カメラのサブストリームでこれを実現し、メインストリームが吐き出す高画質・高解像度・高フレームレートな映像は、他のシステムで受けて録画等しておく)

たどり着いた構成

RTMP サーバ 1st で屋外カメラの映像を受ける。
そして、それを配信する。
配信先は遠隔地の PC。

屋内カメラの映像は RTSP で OBS が受ける。
その OBS は RTSP サーバ 1st から屋外カメラ映像の配信を受ける。
さらに NAS から映像や画像も取得する。
それらすべてを OBS でレイアウトし、映像を RTMP サーバ 2nd に提供する。

屋内のクライアント PC は RTMP サーバ 2nd から映像の配信を受ける。

面倒くさい構成かと思ったら、意外と簡単だった

やりたいことだけを網羅すると「どうやってやるねん…」と迷ったけど、やっぱり図に起こすってのは大事なもので、整理してみたらそれほど複雑にはならなかった。

幸い、高画質である必要がないので、Raspberry Pi4B で何とかなるんじゃなかろうか…

と、とりあえず、カメラ台数は屋外1、屋内1で試してみたら、特に問題なかった。

必要なもの

OBS で映像のレイアウトや NAS からの動画・静止画の取得を行う PC はまた別途とする。
(OBS の使い方や設定だけでそれなりの量になりそうなので)

ここでは Raspberry Pi4B を使った RTMP サーバの構築をメインに扱う。

ということで必要なものは…

Raspberry Pi4B(OS:Ubuntu 22.04)
Nginx
Nginx の RTMP モジュール

Nginx と RTMP モジュールのインストール

OS のインストールは割愛。
そして、Ubuntu じゃなくても問題ない。
Raspberry Pi なら Raspberry Pi OS を使うことが多いと思うけど、当然それでもOK。

で、Nginx と そのモジュールは下記のようにしてインストール。

$ sudo apt install nginx libnginx-mod-rtmp

…簡単ですね…

設定

今回は、Raspberry Pi4B 1台で RTMP サーバを2つ稼働させる。

まぁ、実際は Nginx が全てを賄ってて、RTMP はそのモジュールでしかないので、「RTMP サーバが2台分」というカウントも正確ではないのかもしれないけれど…

とにかく、そのための設定は以下の通り。

設定ファイル:/etc/nginx/nginx.conf

rtmp {
     server {
          listen 11935;
          chunk_size 4096;
          application first{
                  live on;
                  interleave on;
                  hls on;
                  hls_path /var/www/html/first;
                  hls_fragment 5s;
                  hls_type live;
          }
     }
     server {
          listen 21935;
          chunk_size 4096;
          application second {
                  live on;
                  interleave on;
                  hls on;
                  hls_path /var/www/html/second;
                  hls_fragment 5s;
                  hls_type live;
          }
     }
}

大事なのは「listen」と「application」と「hls_path」の3か所。
他の項目はどちらも同じでOK

「listen」
RTMPサーバとして、データの送受信を待ち受けるポートの設定。
通常は1935にするけど、今回は物理的な1台のハードウェアに2つのRTMPサーバを立ち上げるので、このポート番号もそれぞれ異なる番号に変えておく。
(上記例ではデフォルトのポート番号に1または2を付けただけという安易さだけど…)

「application」
データの受け渡しで使用するURL。
 rtmp://[RTMP Server Address]/first
 rtmp://[RTMP Server Address]/second
のようになる。

「hls_path」
配信用の映像データ(一時的なもの?)がなんか保存されるっぽい

といった感じで設定を終えたら

$ sudo systemctl restart nginx.service

Nginx の軌道に特にエラーがなければOK

屋外カメラから映像をRTMPサーバへ

カメラによっては RTMP の設定を持っているものもある。
その場合は、カメラのその機能が使えるので楽。

けど、ものによっては RTMP の設定を持っていないカメラもある。(そっちの方が多い?)

そんな時は RTSP でいったん映像を取得して、RTMP サーバにデータを投げるようにしてあげる必要がある。
USB 接続の Web カメラでも同じ。何らかの方法で映像データをRTMP サーバに投げる方法が必要。

その方法として、手っ取り早いのはOBS。

やはり Raspberry Pi 辺りで良いので OBS が稼働する端末を用意して、カメラの映像を OBS によって RTMP サーバに向けて投げてあげればよい。

また、ffmpeg でも可能。

ffmpeg -i "rtsp://[ログインID]:[ログインPASS]@[カメラIPアドレス]" _
       -vf fps=5 _
       -f flv rtmp://[RTMPサーバ]:[ポート番号]/[上で設定したapplication名]/[key]

といった感じで送信できる。
(実際には複数行ではなく1行で書く)

個人的には ffmpeg の方が好き。

屋内/屋外カメラの映像と NAS のデータ取得、それらの再配信は OBS で

まぁ、OBS を使っている人なら簡単かも

ここでは、映像ソースとしては全て「VLC ビデオソース」になり、それぞれ以下のような感じになる。

・屋外カメラ映像
  rtmp://[ RTMPサーバ ]:[ ポート番号 ]/[ 上で設定したapplication名 ]/[ key ]

・屋内カメラ映像
  rtsp://[ ログインID ]:[ ログインPASS ]@[ カメラIPアドレス ]

・NAS データ
  動画データではなく画像であれば「画像」または「画像スライドショー」を使う。

そして、OBS の設定が完了したら、RTMP サーバへ向けて「配信を開始」すれば OK

これで、屋内PCには屋内外両方のカメラ映像と NAS からの何らかのデータが一画面で配信できるようになった。

場合によってはオペレータ用OBSも Raspberry Pi4B に仕込んでもいいかも

とりあえず、ユーザー側の「何となく安心」感から Windows PC を別途用意して OBS 入れてるけど、レイアウト変更や文字表示、シーケンス処理なんかの変更が殆ど無いようであれば、RTMP サーバとしてる Raspberry Pi4B に OBS をインストールして運用しても問題ないかも。
場所取らないし。

追記
無理だった…Raspberry Pi4B では RTMP サーバやらせつつ、OBS で配信は厳しい。
配信のビットレートを1Mbps以下に落としてもかなり厳しい。
素直に、OBS は他のWindowsPCでやらせた方が無難。

この記事にコメントしてみる