AWS Elemental MediaConnect が SRT に対応したよ!


2021/4/1 記事修正

AWS Elemental MediaConnect でいつの間にか SRT (Secure Reliable Transport)をサポートするようになってました。

SRT とは?

Secure Reliable Transport は Haivision 社によって独自に開発された、オープンソースの技術で、UDP プロトコルを利用しつつ TCP と同様の信頼性の高い伝送を実現しています。
低遅延を維持しながら、パケットロスやエラー回復、訂正機能を持つ動画伝送用のプロトコルです。

要は、Zixi や RIST (Reliable Internet Stream Transport) といった、QoS を考慮した動画伝送用プロトコルのひとつです。

【出典】
https://en.wikipedia.org/wiki/Secure_Reliable_Transport
https://www.haivision.com/products/srt-secure-reliable-transport/

AWS Elemental MediaConnect ではこれまで下記プロトコルをサポートしてましたが、あらたにここに SRT listner が加わりました。

  • RTP/RTP-FEC
  • Zixi
  • RIST
  • SRT listener (<= New!!)

listener と銘打ってあるように、今回サポートされたのは SRT Listener Mode のみで Caller は対応していません。

それでは早速触ってみます。

構成

Action CAM - HDMI -> Jetson Nano (GStreamer) - SRT -> MediaConnect -> iPhone (Haivision Play Pro)

アクションカムをカメラとして、HDMI で Jetson Nano に入力し、GStreamer で SRT を生成し MediaConnect に流し込みます。

Player は iPhone にインストールした元祖 Haivision 社が提供している Play Pro という無料アプリで視聴します。

Jetson Nano

今回、手元にあった Jetson Nano + GStreamer という組み合わせにしましたが、SRT が送信できるものであれば何でもよいです。
(Jetson やラズパイは GStreamer を動かすまでが結構めんどいです)

有名所では他に下記のものが対応しています。

  • ffmpeg
  • VLC
  • OBS

Haivision Play Pro

Haivision 社の最新のスマホアプリです。
下記から入手可能です。

Android については Android 9 以降が対象で、Android 8 以前は前バージョンの Haivision Play が利用できます。

Player についてはその他、下記でも視聴できます。

  • ffplay
  • VLC

MediaConnect

まずは暗号化 (passphrase) 無しで Flow を作成します。 passphrase 無しの場合は簡単です。

Create Flow - Source

Flow を作成します。 Source で SRT listener を選択し、ポートとか White List とか設定します。
とりあえず遅延最短設定で試したいので、Minimum latency を最小設定値 100ms で設定します。

Source

Create Flow - Output

Source を設定すると Flow が作成されます。
続いて同 Flow に Output を設定します。
同様に SRT listener を選択し、ポートとか White List とか設定します。
こちらも Minimum latency を 100ms で設定します。

Output

MediaConnect の設定はこれだけ。
5分もかかりませんね。

配信

それでは早速流してみましょう。

Encoder

Jetson Nano

下記 GStreamer コマンドを実行します。

gst-launch-1.0 -v -e v4l2src device=/dev/video0 ! videorate ! 'video/x-raw, width=(int)1920, height=(int)1080, framerate=30/1' ! nvvidconv ! 'video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, framerate=30/1' ! omxh264enc bitrate=8000000  ! video/x-h264 ! h264parse ! queue ! mpegtsmux alignment=7 ! srtclientsink uri=srt://{MediaConnect Flow IP}:6000 latency=100

Player

iPhone

Haivision Play Pro で視聴します。

参考までに ffplay でも視聴可能です。

ffplay srt://{MediaConnect Flow IP}:8000

視聴

分かりやすいようにブラウザで時計を表示してそれを Haivison Play Pro で視聴しました。

当たり前ですが、問題なく視聴できます。

そして、おそらく MediaConnect における遅延最小設定で 1018ms でした。

まとめ

自分の周りでも SRT 案件が増えてきており、これまで対応できるソリューションが少なく、おのずと選択肢が限られていた為、MediaConnect のサポートがきて嬉しい限りです。

その中でいくつか気になった点を挙げます。

暗号化 (passphrase) も可能

ストリーム暗号化も可能です。
ただ、平文で passpharase を入力するのではなく、MediaConnect の他の暗号化と同様に、AWS Secrets Manager で Secret を作成、 IAMポリシー、ロールを作成してからそれらの ARN を指定する、といったちょっと手間がかかる方法です。

ひとつの Output に、ひとつの Player しか接続できない

MediaConnect の Output は Listener として動作しますが、これに接続できる Player (Caller) は一つだけのようです。

上記のように仮に srt://{MediaConnect Flow IP}:8000 に Player が接続していると、後から来た Player は視聴できません。

もし複数の Player で視聴する場合は、Player の数だけ Output を作成する必要があります。

SRT Caller Mode

今回サポートされたのは Listener Mode のみなので、MediaConnect Flow から他に対して Push 的に送りつける機能は現状ありません。

例えば、Wowza も SRT をサポートしていますが、Ingest は Listener Mode しか対応していないので、MediaConnect から Wowza に SRT を送ることはできません。

遅延

【追記】 2021/3/31 に遅延問題は修正されました。

上で示したように、Source と Output の latency をそれぞれ最小設定値 100ms とし、Encoder および Player 側でも 100ms とした場合でも、自分のテスト環境では約 4.5 秒の遅延が発生しました。

単純に latency 設定値での増加分は合計で 200ms なので、その他の部分で結構時間がかかっていると思われます。

ちなみに Encoder と Player が同設定で Haivision SRT Gateway を使った場合、遅延は最短で1秒を切ります。