Closed6

RTSP配信サーバーの構築

Soichi IkebeSoichi Ikebe

本記事について

Scrapの試用を兼ねて下記を転記したものです
RTSPサーバー構築方法 - 技術メモ

RTSPとは

https://ja.wikipedia.org/wiki/Real_Time_Streaming_Protocol

Real Time Streaming Protocol(リアルタイム・ストリーミング・プロトコル、略称:RTSP)は IETF において標準化されたリアルタイム性のあるデータの配布 (ストリーミング) を制御するためのプロトコルである。ストリーミングデータ自体の配信を行なうためのプロトコルではない。

ユースケース

  • 自宅のオンプレサーバーに構築し、DJ配信イベントなどに利用
  • 他メンバーの音声を受信し、VJ映像と混ぜてTwitchなどの動画サイトに配信するといった構成
Soichi IkebeSoichi Ikebe

サーバーの設定

  • 以下のOSSを利用する
  • 本記事では 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
Soichi IkebeSoichi Ikebe

配信側の設定

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

視聴側の設定

  • RTSPで受信する場合
    • VLCなどで以下のURLから受信する
      • rtsp://<server-ip>/<stream-key>
    • パフォーマンス
      • 視聴者数*ビットレート分の通信容量が発生するので、個人のオンプレサーバーで数十人規模の同時視聴を許す場合は工夫が必要になりそう。
        • CDN を使うのが良いかも?
          • [ライブストリーミングにおけるCDN利用]
  • (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>
        
    • LL-HLS (低遅延モード) がデフォルトで有効になっている。
      • 環境によっては不安定になるようなので、その場合はコンテナ起動時に以下の環境変数を設定して無効化する。
        • MTX_HLSVARIANT=mpegts
Soichi IkebeSoichi Ikebe

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を利用しないように指定することで問題なくルーティングできる (今回はそうしている)。
このスクラップは4日前にクローズされました