RTSP配信サーバーの構築

本記事について
Scrapの試用を兼ねて下記を転記したものです
RTSPサーバー構築方法 - 技術メモ
RTSPとは
Real Time Streaming Protocol(リアルタイム・ストリーミング・プロトコル、略称:RTSP)は IETF において標準化されたリアルタイム性のあるデータの配布 (ストリーミング) を制御するためのプロトコルである。ストリーミングデータ自体の配信を行なうためのプロトコルではない。
ユースケース
- 自宅のオンプレサーバーに構築し、DJ配信イベントなどに利用
- 他メンバーの音声を受信し、VJ映像と混ぜてTwitchなどの動画サイトに配信するといった構成

サーバーの設定
- 以下のOSSを利用する
- https://github.com/bluenviron/mediamtx
- RTSPだけでなく、HLSやWebRTCにも対応している。
- 本記事では Docker コンテナ利用を前提として説明する。
- Dockerコンテナを実行するコマンド
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
- RTSP: 554

配信側の設定
- RTMPで配信する場合
- OBSなどで以下のURLに向けて配信する。
rtmp://<server-ip>/<stream-key>
- OBSなどで以下のURLに向けて配信する。
- RTSPで配信する場合
- OBSなどで以下のURLに向けて配信する。
rtsp://<server-ip>/<stream-key>
- OBSなどで以下のURLに向けて配信する。

視聴側の設定
- RTSPで受信する場合
- VLCなどで以下のURLから受信する
rtsp://<server-ip>/<stream-key>
- パフォーマンス
- 視聴者数*ビットレート分の通信容量が発生するので、個人のオンプレサーバーで数十人規模の同時視聴を許す場合は工夫が必要になりそう。
- CDN を使うのが良いかも?
- [ライブストリーミングにおけるCDN利用]
- CDN を使うのが良いかも?
- 視聴者数*ビットレート分の通信容量が発生するので、個人のオンプレサーバーで数十人規模の同時視聴を許す場合は工夫が必要になりそう。
- VLCなどで以下のURLから受信する
- (Optional) HLSで受信する場合
- ブラウザからは以下のURLで視聴できる。
http://<server-ip>:8888/<stream-key>
- VLCメディアプレーヤーなどで直接ストリームしたい場合は以下のURLを使用する。
http://<server-ip>:8888/<stream-key>/index.m3u8
- プレイヤーの実装
- iframe で HLS のプレイヤーをブラウザに埋め込むことができる。
<iframe src="http://<server-ip>:8888/mystream" scrolling="no"></iframe>
- iframe で HLS のプレイヤーをブラウザに埋め込むことができる。
- LL-HLS (低遅延モード) がデフォルトで有効になっている。
- 環境によっては不安定になるようなので、その場合はコンテナ起動時に以下の環境変数を設定して無効化する。
MTX_HLSVARIANT=mpegts
- 環境によっては不安定になるようなので、その場合はコンテナ起動時に以下の環境変数を設定して無効化する。
- ブラウザからは以下のURLで視聴できる。

Appendix
- UDPを利用したい場合
- UDPのストリームを利用したい場合は以下のコマンドでコンテナを実行する。
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
オプションとは?-
Dockerの--network=hostオプションは、コンテナがホストのネットワークスタックを共有するように指示するものです。つまり、ホストのネットワークインターフェイスを直接使用するため、コンテナ内のプロセスはホスト上のネットワークを使用することができます。このオプションを使用すると、コンテナ内のアプリケーションが、ホスト上の別のアプリケーションと同じネットワーク上にあるかのように動作することができます。つまり、コンテナ内のアプリケーションは、ネットワークポートを直接バインドすることができ、ホストのIPアドレスを使用することができます。ただし、このオプションを使用する場合、コンテナはホストのネットワークスタックを共有するため、セキュリティ上のリスクがあります。つまり、コンテナ内のプロセスは、ホスト上の他のプロセスと同じレベルのアクセス権を持つことになるため、注意が必要です。
- つまりセキュリティの観点ではこのオプションは指定しない方が良さそう。
- WAとして、UDPを利用しないように指定することで問題なくルーティングできる (今回はそうしている)。
-
- UDPのストリームを利用したい場合は以下のコマンドでコンテナを実行する。