【初心者】AWS Elemental MediaLive + MediaPackage を使ってみる（PCからのライブ配信）

# 目的
-  [「3日間で使い捨て！イベント用有料ライブ配信サービスの構築」](https://speakerdeck.com/miu_crescent/3ri-jian-deshi-ishe-te-ibentoyong-you-liao-raibupei-xin-sabisufalsegou-zhu)　（HTB三浦さんによる、商用ライブ配信環境を1カ月で作った話）を見てすごいなと思い、配信の部分だけでもどんなものか勉強したくなったため。

# やったこと
- PCのWEBカメラの動画を動画配信ソフト(OBS Studio）を使ってAWS Elemental MediaLive に送信する。
- AWS Elemental MediaLive から AWS Elemental MediaPackage へデータを連携し、MediaPackageからライブ動画を配信する。
- PC(Edge)、Android(Edge)、iPhone(Safari)でライブ動画を閲覧する。
- 何も設定をいじってない状態で、どのくらい配信時の遅延が発生するのか確認する。

# 構成図

![media01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/8485494a-5488-0a46-6e13-19568e7af1d1.png)


# 作業手順
- Developers.IOのブログ「 [OBSとAWS Elemental MediaLiveでライブ配信をしてみた](https://dev.classmethod.jp/cloud/aws/live-aws-elemental-medialive-with-obs/) 」にほとんど網羅されているが、気になった点等含め自分なりに整理する。 

## AWS Elemental MediaPackage の設定
- Channelを作成する。InputTypeは、2020/1現在、「Apple HLS」固定になっている。今回はCloudFrontは作成しない。

![media02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/acdf53fd-22fd-83a5-db3e-9b6a0dfda08d.png)

- Endpoint (動画を閲覧するためのEdgeやSafari等のPlayerの接続先)を追加する。2020/1現在、「Apple HLS」「DASH-ISO」「Microsoft Smooth」「Common Media Application Format(CMAF)」が選択可能。今回は「Apple HLS」と「DASH-ISO」のEndpointを作成しておく。

![media04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/9c0271e6-7e66-d683-afc6-3ae3555af1cb.png)

- Endpointを追加すると、接続用のURLが作成される。

![media05a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c70f6d27-4f9c-95c7-97f4-6ed40b446208.png)


## AWS Elemental MediaLive の設定
- 「入力セキュリティグループ」を作成する。ライブ動画の送信元として許可するIPアドレスを設定する。

![media06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/fbeb47cb-25db-d8f3-4f09-101657630b7b.png)

- 「入力」を作成する。入力タイプとして今回はRTMP(プッシュ)を指定する。（配信ソフトOBS Studioの出力方式とあわせる）

![media07a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/23773e21-a73a-0ee9-21ef-cb4c8e992188.png)

- 前段で設定しておいた「入力セキュリティグループ」を指定する。

![media08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/3d9e1026-70f6-2c58-4728-d0f451539702.png)

- 「アプリケーション名」と「インスタンス」を設定する。それぞれが配信ソフト（OBS Studio）で送信先URLを指定する際の「パス」と「ストリームキー」に該当する。

![media09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/64fff3ae-649b-a0aa-0666-664778c4ad94.png)

- 「チャネル」を作成する。まずIAM Roleを設定する。「テンプレートからRoleを作成する」と、「MediaLiveAccessRole」という名前のRoleが作成されるので、それを設定する。

![media10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/aab922fd-0c25-60d5-ce69-9f1427fd5a79.png)


- 「チャネルテンプレート」で、「HTTP live streaming - MediaPackage」を選択する。（MediaPackageに送信するため、これを選択）

![media11a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/de0e150f-474d-0841-55d5-0712b159c430.png)

- 「入力をアタッチ」を行う。前段の手順で作成した「入力」を選択して設定する。

![media12a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d09c2aba-7091-1ece-b3f3-094b480263c5.png)

- 「出力グループ」の「MediaPackage group」を選択し、前段の手順で作成したMediaPackage の channel ID を入力する。これにより、MediaLiveとMediaPackageの紐づけが行われる。

![media13a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/7d1c515d-bfa2-2bb9-529c-e9de1f2cf9fc.png)

- 「チャネルの作成」を実行すると、「検証エラー: captionDescription[0].captionSelectorName」が発生する。このエラーで検索すると、[AWS Developer Forum](https://forums.aws.amazon.com/thread.jspa?threadID=296197) のQAにて、WebVTTの出力を削除すべきとあるため、「出力10: WebVTT」を削除する。これによりチャネル作成が成功する。

![media14a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d50c5eba-d4ed-72b9-5124-fcc7f41e7243.png)

## OBS Studioの設定
- 「[OBS Studioの詳しい使い方・設定方法](https://vip-jikkyo.net/how-to-use-obs-studio)」を見て、OBSの設定を行う。

### 配信内容の設定
- PCのWebカメラと、デジタル時計（配信遅延測定のため）を左右に並べて表示させる。デジタル時計は「[おてがる！JavaScriptでシンプルなデジタル時計をつくってみよう(Webフォント使用/サイズ自動調整)](https://qiita.com/ukk0/items/07d69c83be1112f10c29)」の記事内にある、[時刻表示のサンプルページ](http://ukkz.github.io/jsClock-simple/) を表示させる。

![media15a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/169ae03d-5ef1-a616-1d16-437549f8172d.png)


### データ送信先の設定
- 「設定」-「配信」の画面にて、「カスタム」を選択し、サーバ(URL)とストリームキーを入力する。MediaLiveを設定した際の「アプリケーション名」までの値を「サーバ」に、「インスタンス」の値を「ストリームキー」に設定する。

![media16a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/b44ca9d4-b6c7-84bc-6cf1-bb9837b2db57.png)

## PC/スマホでの閲覧
- 作成した MediaLive の チャネルを選択し、「開始」を実行する。これによりRTMPでのデータ受信ができるようになる。

![media17a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/04b9222d-a832-2665-e972-3dbb9e951fa3.png)


- 配信ソフト(OBS)で、「配信開始」を押す。問題なければRTMPでのデータ送信が開始される。（画面割愛）

- MediaPackageで作成した、HLSの接続URLにPCのEdgeでアクセスする(EdgeはHLSの再生に対応しているため、Edgeを利用）。左がPCのローカルの配信ソフト(OBS Studio)の表示、右がEdgeでAWS経由で配信されてきた動画の表示となる。配信されてから受信できるまで、このタイミングでは約38秒遅延が発生している。（現在時刻 19:41:38 時点で、クライアントに配信されているのは 19:41:00 時点の映像）


![media19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/008603e7-c1eb-f62a-0fa7-f076b795ab47.png)

- 同様にスマホ(AndroidのEdge, iPhoneのSafari)でHLSのエンドポイントにアクセスして動画の表示が可能。（画面割愛）

- EdgeはMPEG-DASHの再生もサポートしているため、左のEdgeはHLS、右のEdgeはMPEG-DASHのエンドポイントに同時に接続。このタイミングではHLSは約17秒、MPEG-DASHは約54秒の遅延が発生している。

![media20a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/7b1d5eb1-cf63-b6d4-ddce-6766d2d5966a.png)

# 所感
・単純に配信するだけであれば簡単なので、会社で勉強会の模様を別のオフィスに配信するとかに活かしてみたい。
・遅延を小さくするとかは奥が深そうなので、別の構成や設定も試してみたい。