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 社の最新のスマホアプリです。
下記から入手可能です。

https://www.haivision.com/products/player-set-top-boxes/haivision-play-pro/

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 を最小設定値 １００ms で設定します。

![スクリーンショット 2021-03-17 9.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/be4f82e1-dade-f02f-8bf9-5d2544675003.png)

### Source

![スクリーンショット 2021-03-17 14.30.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/cef9f973-8ab4-6d20-a368-cb0fd023b359.png)

### Create Flow - Output

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

![スクリーンショット 2021-03-17 9.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/3d4c0a89-b507-a6f6-625d-17ef27f0b51c.png)

### Output

![スクリーンショット 2021-03-17 14.30.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/04b38fa1-7317-aefc-59bf-42827a6da82a.png)

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 で視聴します。

![Image from iOS (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/b9d87778-edac-93cd-6e6f-76284012ad66.png)

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

```
ffplay srt://｛MediaConnect Flow IP｝:8000
```

# 視聴

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


![Image from iOS (36).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/e8a425a4-8e45-13c8-da31-8a27aefa837f.png)


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

そして、おそらく 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 設定値での増加分は合計で ２００ｍｓ なので、その他の部分で結構時間がかかっていると思われます。~~

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