RTSPサーバー構築方法
RTSPとは
Real Time Streaming Protocol(リアルタイム・ストリーミング・プロトコル、略称:RTSP)は IETF において標準化されたリアルタイム性のあるデータの配布 (ストリーミング) を制御するためのプロトコルである。ストリーミングデータ自体の配信を行なうためのプロトコルではない。
1. サーバーの設定
以下のOSSを利用する
RTSPだけでなく、HLSやWebRTCにも対応している。
本記事では Docker コンテナ利用を前提として説明する。
Dockerコンテナを実行するコマンド
code:bash
docker run --detach --restart always --name mediamtx \
-e MTX_RTSPTRANSPORTS=tcp \
-e MTX_WEBRTCADDITIONALHOSTS=192.168.X.X \
-p 554:8554 \
-p 1935:1935 \
-p 8888:8888 \
-p 8889:8889 \
-p 8890:8890/udp \
-p 8189:8189/udp \
bluenviron/mediamtx
MTX_WEBRTCADDITIONALHOSTS にはローカルサーバーのIPアドレスを設定する。
上記では各プロトコルが以下のポートでListenされるので、利用するプロトコルのポートを開放しておく。
RTSP: 554
MediaMTX のデフォルトポートは 8554 だが、Well Known Port は 554 なので敢えてこちらにマッピングしている。
8554 のままで運用する場合、受信側でポート番号を指定する必要がある。
RTMP: 1935
HLS: 8888
WebRTC: 8889
2. 配信側の設定
RTMPで配信する場合
OBSなどで以下のURLに向けて配信する。
rtmp://<server-ip>/<stream-key>
RTSPで配信する場合
OBSなどで以下のURLに向けて配信する。
rtsp://<server-ip>/<stream-key>
3. 視聴側の設定
RTSPで受信する場合
VLCなどで以下のURLから受信する
rtsp://<server-ip>/<stream-key>
パフォーマンス
視聴者数*ビットレート分の通信容量が発生するので、個人のオンプレサーバーで数十人規模の同時視聴を許す場合は工夫が必要になりそう。
CDN を使うのが良いかも?
(Optional) HLSで受信する場合
ブラウザからは以下のURLで視聴できる。
http://<server-ip>:8888/<stream-key>
VLCメディアプレーヤーなどで直接ストリームしたい場合は以下のURLを使用する。
http://<server-ip>:8888/<stream-key>/index.m3u8
プレイヤーの実装
iframe で HLS のプレイヤーをブラウザに埋め込むことができる。
code:html
LL-HLS (低遅延モード) がデフォルトで有効になっている。
環境によっては不安定になるようなので、その場合はコンテナ起動時に以下の環境変数を設定して無効化する。
MTX_HLSVARIANT=mpegts
Appendix
UDPを利用したい場合
UDPのストリームを利用したい場合は以下のコマンドでコンテナを実行する。
code:bash
docker run --rm -it --network=host bluenviron/mediamtx
--network=host オプションを指定する理由について、公式ドキュメントでは以下のように説明されている。
The --network=host flag is mandatory since Docker can change the source port of UDP packets for routing reasons, and this doesn't allow the server to find out the author of the packets. This issue can be avoided by disabling the UDP transport protocol
そもそも --network=host オプションとは?
code:chatgpt
Dockerの--network=hostオプションは、コンテナがホストのネットワークスタックを共有するように指示するものです。つまり、ホストのネットワークインターフェイスを直接使用するため、コンテナ内のプロセスはホスト上のネットワークを使用することができます。このオプションを使用すると、コンテナ内のアプリケーションが、ホスト上の別のアプリケーションと同じネットワーク上にあるかのように動作することができます。つまり、コンテナ内のアプリケーションは、ネットワークポートを直接バインドすることができ、ホストのIPアドレスを使用することができます。ただし、このオプションを使用する場合、コンテナはホストのネットワークスタックを共有するため、セキュリティ上のリスクがあります。つまり、コンテナ内のプロセスは、ホスト上の他のプロセスと同じレベルのアクセス権を持つことになるため、注意が必要です。
つまりセキュリティの観点ではこのオプションは指定しない方が良さそう。
WAとして、UDPを利用しないように指定することで問題なくルーティングできる (今回はそうしている)。
参考記事