AWS MediaLive + MediaPackageを使ってライブ配信

目的

2017/11 にリリースされた AWS メディアサービスを使って、ラクして動画配信したい。 できる限り遅延は無い方向で! まずざっくりとした使い方を把握して、どの程度、細かく設定できるのか知りたい! ( 実際のスマホでの確認までではなく、PC 上でエンコードされたライブが見えるところまでが今回のゴール )

作りたいシステム構成

ライブカメラ -> Wirecast -> RTMP(ないし RTSP) -> エンコーダー -> CDN -> ユーザ

CDN 使うと大規模に安く配信できるので使いたい。が、当然できる限り遅延は少なくしたい。

感想

あとマルチビットレートの設定が最初から入っているのとか、冗長化を初めから考慮されてる設定は素敵。 2017/12/04 時点では、MediaPackage で選択可能な配信フォーマットは HLS のみでした。Mpeg-DASH とか必要な場合は、対応待ちです。

ただ、UI というか画面遷移が迷うところが多いし、一通り設定が完了しないと、 カメラからのデータを送れないしで、挫けそうになりました。この辺は時間が解決してくれるよ!という気持ちで。

背景

EC2 で wowza や AdobeMediaServer 立てて運用するのはもちろんありだし、カスタマイズ性はこちらの方が高そうではある(インスタンスプランも選択できるし) が、運用コストはかかるのでありできれば減らしたい。

AWS メディアサービスって?(複数サービスの集合でした)

参考 クラウドベースの映像処理、保存、収益化 classmethod 様

2017/12 現在、MediaConvert、MediaLive、MediaPackage、MediaStore、MediaTailor という 5 つのサービスで構成されています。 このうち、自分に必要そうな『MediaLive』『MediaPackage』のみを使ってみました。 VOD、および他動画解析サービスなどと連携する場合は S3 に保存する MediaStore も併せて使う必要があるかもしれません。

設定方法

MediaLive について

(先に MediaPackage から設定する必要があります ) 当初、名前に Live ってあるし、MediaLive だけで完結できるか?と思いきやできず… なんか、CDN から見えるはずのオリジンサーバに該当する設定が無くね? どこで作るの? と見つからなかった。 MediaLive は「カメラから入ってきたデータをエンコードして Push する」という機能までなので、 それを「CDN などから Pull するための機能は『MediaPackage』が担当する」という事に気づかなかった。ので先に MediaPackage の設定から行う必要があります。

MediaPackage

CDN などから参照されるものは「チャンネル」と呼ばれます。これを冗長化のために 2 つ作成します。

下記のように進めます( 私は近場のシンガポールを選択しましたが、お好みで )

  • 右上のリージョンの選択で[ シンガポール ]を選択
  • 左上の[ サービス ]から[ MediaPackage ]->[ Create ] チャンネルの詳細, Channel details で
  • ID 任意
  • Input type は[ Apple HLS ]、そのまま [ Create ]をクリック

これを 2 つ作成してください。

MediaLive

ビデオからの入力を受けるため、まず

  • [ Input security groups ] <= CIDR でアクセス制限できる
  • [ Input ] カメラからクラウド側に送る設定。 RTP, RTMP(push), RTMP(pull), HLS でインプットできる。私は RTMP(push)で RTMP 用エンドポイントを作成 が必要です。

Input security groups

[ MediaLive ]->[ Input security groups ]->[ Create input security group ] テキストフィールドの中に CIDR で許可するカメラ側の IP アドレスを記載します。 回線冗長化などで、複数 IP アドレスを許可する時はカンマか改行で分けます。[ Create ]でアクセス制限を作成。

Input

[ MediaLive ]->[ Input ]->[ Create input ]

  • Input name 任意

  • Input type RTP, RTMP(push), RTMP(pull), HLS が選択可能

  • Input security group [ Use existing ]->プルダウンメニューから先程作成した Input security group を選択

  • Input destinations これはクラウド側の RTMP 受け側の冗長化のための設定です。 Destination A -> a Destination B -> b としました(このクラウド側の RTMP エンドポイントの設定は後ほど Wirecast の設定で使います)

Channels( エンコード設定 )

[ MediaLive ]->[ Channels ]->[ Create a Channel ]

  • Channel name 任意

  • IAM role (ここでは、最初、必要な IAM role が無い場合は作成するウィザードを起動可能だった記憶が…) IAM role を作成すると[ MediaLiveAccessRole ]という rome が作成され、プルダウンメニューから選択可能になります。

  • Channel template いくつか選択可能。ただ自分でチャンネルを作成すると、プルダウンメニューにそれが現れ、それを元に作成できます。 余談ですが、これテンプレートから選択すると、上の IAM role の設定内容、チャンネル名がクリアされちゃいます。私は Live を選択しました。 この点、直感的でないので、UI 変わるんじゃないかなー、と。 ので、テンプレートから選択したら、チャンネル名と IAM ロールの設定を直す必要があります。

  • Attach input 先程作成した、input 設定をプルダウンメニューから選択。

  • Input setting これはそのままにしました。

( 左側のメニュー )[ Output group ] 出力全体にかかる設定

出力全体にかかる HD( HLS )をクリックします。 配信動画のエンコーディング設定です。

  • HLS Group destination A
  • HLS Group destination B

最初、ここで凄く悩みました。 これですが、MediaLive で RTMP(push)を選択した時に、更に「どこへ push するか」の設定です。 Akamai はこの RTMP(push)をダイレクトに受けられるようですが、弊社できれば CloudFront 使いたい事情が… このため、私の環境では MediaPackage が必要になりました。

MediaPackage で作成した 2 つのチャンネルがここで生きてきます。 MediaPackage のページを開き、 それぞれのチャンネルの[ URL ]をコピペして、この[ HLS Group destination {A,B} ] にそれぞれ入力します。

[ HLS Settings ]
  • CDN Settings ->[ Hls basic put ]
[ HLS Outputs ]マルチビットレートでの動画配信の設定で重要ですが、後述します

私の環境では 60 フレームの配信テストは不要だと思ったので[ _720p60 ]は[ x ]のリンクから削除しました。

[ Manifest and Segments ] m3u8 ファイルの設定
  • Mode TS ファイルにつけられるインデックスを再利用するか

  • vod インデックスを再利用しない

  • live インデックスを再利用する これ、インデックス再利用した時には TTL の設定が重要になったりするやつ? 最初は検証という事で vod を選択、

  • Segment Length デフォルト 6 -> 1 秒に変更。低遅延を狙う。

  • Num Segments .m3u8 ファイル内のセグメントの個数の設定。デフォルト 10 -> 5 個。これも低遅延。 ただ、実際には、このパラメータを変更しても.m3u8 内のセグメント個数が減らず、LivePackage 側の設定変更が必要でした.

  • Keep Segments 説明を見ると [ Mode ]が[ live ]である時に効果があるパラメータ、らしい。live の時にはセグメントごとにつけられるインデックスが再利用されるが、何個まで保持するか、という設定らしい

m3u8 関連の設定は、上記程度で終わり。

[ HLS Outputs ]マルチビットレートの設定

左側のメニューに現れる[ Output 1 ][ output 2 ][ Output 3 ]などのリンクをクリック。 低遅延を狙いたいので[ GOP Structure ]->[ GOP Size ] を 60 -> 30 に変更しました。 ( これは私の考えが間違ってたら指摘いただきたいのですが )キーフレームが短い方が早く配信がスタートするような。 RTMP 送信側のキーフレームも併せて短くする必要がありますが。

[ Create ]で Channel を作成します

でも、まだクラウド側の配信設備がスタートした訳じゃないので注意

配信スタート

チャンネル設定が済んでいる状態で[ MediaLive ]->[ Channels ]->作成したチャンネルのラジオボタンをクリック->[ Start ] ではじめてスタートします。

これ最初、気が付かなくて「あれー、wirecast で設定しても、クラウド側に繋がらないよ。 というかクラウド側に telnet クラウド側 IP アドレス 1935 してもポート空いてない… これ、何? ファイアウォール? とかで数時間消えたので、皆さんお気をつけください。

ちなみにクラウド側の RTMP の IP アドレスは[ MediaLive ]->[ Inputs ]->[ Endpoints ]で確認できます。 この設定は Wirecast でも必要になります。

チャンネルをスタートすると、[ Details ]->[ Inputs ]に、紐づく[ Inputs ]へのリンクがありますのでクリック。 [ Inputs ]の画面に遷移します。[ Endpoints ]でクラウド側の RTMP のエンドポイントが分かりました。

これを Wirecast に設定し、カメラからのデータを送り込んでみましょう!

一応、 カメラ -> Wirecast -> MediaLive -> MediaPackage の接続ができたハズです!

カメラからのデータを見てみる

[ MediaPackage ]->作成したチャンネル->[ Endpoints ]に移動します。 [ Play ]をクリック。PC 上で動画の確認ができましたでしょうか?

User
CloudFront
ALB
EC2
RDS