【やってみた】AWS Elemental MediaLiveとAWS Elemental MediaStoreでライブ配信してみた #reinvent

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。re:Invent2017はじまってすぐに発表されたAWS Media Services、その魅力の1つはフルマネージドサービスでライブ配信ができることではないかと思います。AWS Media Servicesを使ったライブ配信の構成として、AWS Elemental MediaLiveとAWS Elemental MediaPackageを使用してライブ配信を行ってみましたが、re:Invent2017のブレイクアウトセッション「CTD202 - Learn How AWS is Enabling the World's Most Advanced Media Workflows」や、「CTD204 - NEW LAUNCH! Hear how the Pac-12 is using AWS Elemental MediaStore and explore video workflows with MediaLive and MediaPackage」ではこの構成の他、AWS Elemental MediaPackageの代わりにAWS Elemental MediaStoreを使用したライブ配信の構成も紹介されていました。今回はこのAWS Elemental MediaLiveとAWS Elemental MediaStoreの構成でライブ配信を行ってみたのでまとめてみます。

やってみた

まずはAWS Elemental MediaStoreの準備をします。マネージメントコンソールの画面に従いコンテナ(Container)を作成しましょう。コンテナ名を入力して[Create container]ボタンで進めます。

画面が遷移するとコンテナ作成中となりますね。

数分すると作成が完了します。コンテナ名をクリックして詳細画面へ進みましょう。

MediaStoreではコンテナ毎にアクセス権限のポリシーを設定できるようです。今回はライブ配信が目的ですので、MediaStoreのユーザーガイド「Example Resource-based Policy: Public Read Access over HTTPS」を参考に以下のポリシーを記載しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadOverHttps",
            "Action": ["mediastore:GetObject", "mediastore:DescribeObject"],
            "Principal": "*",
            "Effect": "Allow",
            "Resource" : "arn:aws:mediastore:[リージョン]:[AWSアカウントID]:container/[コンテナ名]/*",
            "Condition": {
                "Bool": { "aws:SecureTransport": "true" }
            }
        }
    ]
}

またInfo欄のData endpointの項目について、MediaLive側の設定で使用するのでのURLをメモしておきます。「https://[14桁の英数字].data.mediastore.us-west-2.amazonaws.com」という形式のものですね。

MediaLiveでは出力先を2ヶ所指定しますので、同様の手順でもう一つのコンテナも作成しておきます。

続いてMediaLive側の設定を進めます。InputsについてはMediaLive+MediaPackageの構成のときと同様、Input typeは「RTMP (push)」としました。またInput security group、Input destinationsを適切に設定します。

MediaLiveのChannelの作成です、「Live event」のテンプレートを選択しました。Channel nameを入力してIAM roleはデフォルトで作成されるMediaLiveAccessRoleを選択します。(MediaLiveからMediaStoreへのアクセスに適切な権限を有する必要があります。)

続いて左側のOutput groups(1) 表記の下の1. HD (HLS)の文字部分のリンクをクリックして、Output groupsの設定を行います。HLS Group destination Aの項目に先ほどメモした1つ目のMediaStoreコンテナのData endpointを入力します。ここでポイントは、「https://[14桁の英数字].data.mediastore.us-west-2.amazonaws.com」という形式ですが、先頭のhttps://をmediastoressl://として入力する必要があります。また末尾に/path/basenameという形式でpathとbasenameを指定します。(/では終了できません。また.com/とbasenameを指定しないこともできませんでした。)「mediastoressl://[14桁の英数字].data.mediastore.us-west-2.amazonaws.com/path/basename」という形式になりますね。今回はMediaLiveのInputと形式を併せて「mediastoressl://[14桁の英数字].data.mediastore.us-west-2.amazonaws.com/live/myStream」としました。

MediaLiveのChannelが作成されたら、ChannelをStartします。また配信エンコーダにMediaLiveのInputsのEndpointの情報の入力して配信を開始しましょう。配信を開始するとすぐに、MediaStoreのコンテナ内にファイルが格納されていきます。Management Consoleから格納されていく様子を確認するには、各コンテナのItems欄を参照します。まずはpathに該当するフォルダができていますね。

このフォルダ名(Itemsの箇所のリンク文字列)をクリックしてフォルダ内を確認します。MediaLiveからマニフェストファイル(拡張子.m3u8)とセグメントファイル(拡張子.ts)が出力され、格納されていることがわかります。この中からmyStream.m3u8(basename.m3u8)を探しましょう。必要に応じて右上の<や>でページをスクロールしてください。

mystream.m3u8(basename.m3u8)のファイル名のリンク文字列(Itemsのリンク文字列)をクリックすると、詳細ページに遷移します。Object Nameとして表示されているURLがM3U8プレイリストファイルへのアドレスになりますので、ここにSafariやiOSなどHLS対応のブラウザ、プレイヤーでアクセスすることでライブ配信が視聴できます。今回はMac OS上のSafariからアクセスしてライブ配信を確認してみました。

まとめ

AWS Elemental MediaLiveとAWS Elemental MediaStoreを使ってライブ配信を行ってみました。MediaPackageを使用した場合ではMediaLiveの出力をMediaPackageで受け、MediaPackageで再度パッケージング(必要に応じてDRMやAd、ABRなどの処理)を行うかと思います。対してMediaStoreを使用する場合ではMediaLiveからの出力をMediaStoreで受け、ファイルにそのままアクセスさせるという具合ですね。MediaStore側ではMediaLiveの設定に応じてセグメントファイル(.ts)も保存できるので、単純なライブ配信での視聴のみではなくライブ配信を行った動画をアーカイブしたい、加工したい、という場合に活用できるのではないかと考えます。用途やシステムなどに応じてMediaLiveの出力先のMediaPackage、MediaStoreを使い分けていきたいですね。