AWS Elemental MediaPackageでマニフェストフィルタリングをしてみた
はじめに
清水です。動画配信におけるジャストインタイムパッケージングサービスであるAWS Elemental MediaPackageでクエリ文字列ベースのマニフェストフィルタリングをやってみたのでまとめてみます。(2020/04/08にポストされたアップデート内容の1つですね。)
- Support for Manifest Filtering and Other Improvements Now Available with AWS Elemental MediaPackage
- AWS Elemental MediaPackage でマニフェストフィルタリングとその他の改善が利用可能に
- AWS Developer Forums: Support for Manifest Filtering and Other Improvements Now Available with AWS Elemental MediaPackage
AWS Elemental MediaPackageにはこれまでも、Endpoint設定のFilter incoming stream(着信ストリームのフィルタ)でビデオの最小/最大ビットレートを指定することができました。(含めるストリームのフィールド - AWS Elemental MediaPackage)今回のアップデートであるマニフェストフィルタリング機能では、フィルタリング条件にビデオビットレートのほか、ビデオのコーデック、オーディオのビットレート、そしてオーディオの言語を指定することができます。またフィルタリングもEndpointのURLにクエリ文字列を付与するかたちなので、着信ストリームのフィルタよりも柔軟に設定できるかと思います。例えばビデオのビットレートやコーデックにより再生可能/不可能なデバイスがある場合、一方のデバイスはフィルタなし、もう一方のデバイスはマニフェストフィルタをつけて再生させる、などが考えられます。対して、クエリ文字列なのでURLがわかってしまうとマニフェストフィルタを解除してのリクエストも容易にできてしまうかと思います。一部プレミアムユーザには高画質、一般ユーザには通常画質で再生させるためにビットレートを指定したい、というような場合はURLがわかりにくくなる、Endpoint別の着信ストリームのフィルタで実現するのが良さそうかと思いました。
AWS Elemental MediaPackageでマニフェストフィルタリングをしてみた
では実際に、AWS Elemental MediaPackageでURLベースのマニフェストフィルタリングをやってみます。今回はMediaLive+MediaPackageの構成でライブ配信の環境を構築、このMediaPackageに対してマニフェストフィルタリングをしてみます。
AWS Elemental MediaPackageのChannelとEndpointの作成
まずはMediaPackageのChannelならびにEndpointを作成しましょう。基本的には通常時と同じリソースの作成手順です。MediaPackageのマネジメントコンソール画面、LiveのChannels一覧ページから[Create]ボタンでChannel作成ページに進みます。
IDと必要に応じてDescriptionを入力、Input typeはデフォルトのApple HLSのままです。今回は動作検証のためCloudFrontディストリビューションはなしで進めます。[Create]でChannelを作成しましょう。
Channelが作成できました!続いてEndpiontsの[Add endpoints]からEndpointの作成に進みます。
IDと必要に応じてDescriptionを入力します。Packager settingsにて配信タイプはApple HLSとし、その他の項目は今回はデフォルトのままとしました。[Save]を押してEndpointの追加します。
Endpointが作成できました。
なお、Streams to includeの項目で設定できる「Filter incoming streams」の項目が冒頭で述べたEndpointベースのビットレートフィルタリング機能ですね。ユーザガイドには、URLベースのマニフェストフィルタリングとは併用しないようがよい旨が記載されています。今回はデフォルト設定、「Include all incoming streams」で進めました。
AWS Elemental MediaLiveのInputとChannelを作成
動作確認のためのAWS Elemental MediaLiveのリソースも作成します。作成のポイントとして、Channel作成時のChannel templateとして「Live event - MediaPackage」を選択しました。
Output groupsでのMediaPackageの設定で、先ほど作成したMediaPackageのChannel IDを入力します。また選択したChannel templateの設定で、1080p30、720p30、480p30、240p30の4つのABRが設定されていることを確認しましょう。
Channelを作成したらスタートさせ、ライブエンコーダから映像を打ち上げてライブ配信を開始します。
ライブ配信中の通常のマニフェストファイルを確認
ライブ配信を開始し、MediaPackageのEndpoint URLから実際に映像が視聴できるか、例えばVideoJS HTTP Streamingなどを使って確認します。このときURLはMediaPackageのマネジメントコンソール、EndpointのURL欄で確認できる、以下の形式のものですね。
- https://15bcXXXXXXXXXXXX.mediapackage.ap-northeast-1.amazonaws.com/out/v1/5310XXXXXXXXXXXXXXXXXXXXXXXXXXXX/index.m3u8
ライブ配信の視聴が問題ないことが確認できたら、実際にこのHLSマニフェストファイルの中身を確認してみましょう。トップレベルマニフェストは以下のようになりました。
$ curl "https://15bcXXXXXXXXXXXX.mediapackage.ap-northeast-1.amazonaws.com/out/v1/5310XXXXXXXXXXXXXXXXXXXXXXXXXXXX/index.m3u8" #EXTM3U #EXT-X-VERSION:3 #EXT-X-INDEPENDENT-SEGMENTS #EXT-X-STREAM-INF:BANDWIDTH=8969100,AVERAGE-BANDWIDTH=5711380,RESOLUTION=1920x1080,FRAME-RATE=30.000,CODECS="avc1.640028,mp4a.40.2" index_1.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=5449100,AVERAGE-BANDWIDTH=3511380,RESOLUTION=1280x720,FRAME-RATE=30.000,CODECS="avc1.64001F,mp4a.40.2" index_2.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2752917,AVERAGE-BANDWIDTH=1791150,RESOLUTION=640x480,FRAME-RATE=30.000,CODECS="avc1.4D401E,mp4a.40.2" index_3.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1432904,AVERAGE-BANDWIDTH=966133,RESOLUTION=320x240,FRAME-RATE=30.000,CODECS="avc1.4D400D,mp4a.40.2" index_4.m3u8
マニフェストフィルタリングをしてみる
では実際にMediaPackageのマニフェストフィルタリングをしてみましょう。今回はビデオビットレートの最大最小を指定してみます。MediaLiveのChannel template「Live event - MediaPackage」では、ビデオのそれぞれのビットレートが以下のように設定されていました。
- 1080p30(1920x1080)
- 5000000bps(5Mbps)
- 720p30(1280x720)
- 3000000bps(3Mbps)
- 480p30(640x480)
- 1500000bps(1.5Mbps)
- 240p30(320x240)
- 750000bps(750kbps)
ここから、最小ビットレートを1000000bps(1Mbps)、最大ビットレートを4000000bps(4Mbps)としてみましょう。4つのABRのうち2つが残るはずですね。
マニフェストフィルタリングは、Endpoint URLにクエリ文字列を以下の形式で付与すること実現できます。(詳細はユーザーガイドを参照ください。)
?aws.manifestfilter=parameter1_name:value;parameter2_name:minValue-maxValue
最小ビットレートを1000000bps、最大ビットレートを4000000bpsであれば、?aws.manifestfilter=video_bitrate:1000000-4000000
をクエリ文字列としてEndpoint URLに付与することになります。実際に付与して結果のトップレベルマニフェストファイルを確認してみましょう。
$ curl "https://15bcXXXXXXXXXXXX.mediapackage.ap-northeast-1.amazonaws.com/out/v1/5310XXXXXXXXXXXXXXXXXXXXXXXXXXXX/index.m3u8?aws.manifestfilter=video_bitrate:1000000-4000000" #EXTM3U #EXT-X-VERSION:3 #EXT-X-INDEPENDENT-SEGMENTS #EXT-X-STREAM-INF:BANDWIDTH=5449100,AVERAGE-BANDWIDTH=3511380,RESOLUTION=1280x720,FRAME-RATE=30.000,CODECS="avc1.64001F,mp4a.40.2" index_2.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2752917,AVERAGE-BANDWIDTH=1791150,RESOLUTION=640x480,FRAME-RATE=30.000,CODECS="avc1.4D401E,mp4a.40.2" index_3.m3u8
マニフェストフィルタリングでビットレートの最大最小指定ができました!
もう一つ、ビデオのコーデック指定についも確認してみます。MediaLiveのChannel template「Live event - MediaPackage」では、いずれのABRでもH.264のコーデック利用でした。クエリ文字列にコーデックとしてH.264を指定する?aws.manifestfilter=video_codec:h264
を指定すると、そのまま4つABRが返ます。
$ curl "https://15bcXXXXXXXXXXXX.mediapackage.ap-northeast-1.amazonaws.com/out/v1/5310XXXXXXXXXXXXXXXXXXXXXXXXXXXX/index.m3u8?aws.manifestfilter=video_codec:h264" #EXTM3U #EXT-X-VERSION:3 #EXT-X-INDEPENDENT-SEGMENTS #EXT-X-STREAM-INF:BANDWIDTH=8969100,AVERAGE-BANDWIDTH=5711380,RESOLUTION=1920x1080,FRAME-RATE=30.000,CODECS="avc1.640028,mp4a.40.2" index_1.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=5449100,AVERAGE-BANDWIDTH=3511380,RESOLUTION=1280x720,FRAME-RATE=30.000,CODECS="avc1.64001F,mp4a.40.2" index_2.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=2752917,AVERAGE-BANDWIDTH=1791150,RESOLUTION=640x480,FRAME-RATE=30.000,CODECS="avc1.4D401E,mp4a.40.2" index_3.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1432904,AVERAGE-BANDWIDTH=966133,RESOLUTION=320x240,FRAME-RATE=30.000,CODECS="avc1.4D400D,mp4a.40.2" index_4.m3u8
では、クエリ文字列にH.265を指定してみましょう。H.265指定のABRは存在していないので、404
が返ってきました。
$ curl "https://15bcXXXXXXXXXXXX.mediapackage.ap-northeast-1.amazonaws.com/out/v1/5310XXXXXXXXXXXXXXXXXXXXXXXXXXXX/index.m3u8?aws.manifestfilter=video_codec:h265" <h1>error 404</h1> $ curl -I "https://15bcXXXXXXXXXXXX.mediapackage.ap-northeast-1.amazonaws.com/out/v1/5310XXXXXXXXXXXXXXXXXXXXXXXXXXXX/index.m3u8?aws.manifestfilter=video_codec:h265" HTTP/2 404 date: Sat, 30 May 2020 17:59:08 GMT content-type: text/html; charset=iso-8859-1 server: nginx/1.16.1 x-mediapackage-request-id: ac92XXXXXXXXXXXXXXXXXXXXXXXXXXXX
まとめ
AWS Elemental MediaPackageのマニフェストフィルタリング機能を試してみました。Endpoint URLのクエリ文字列で容易にビデオビットレート、ビデオコーデック、オーディオビットレート、そしてオーディオの言語をフィルタリングすることができます。デバイスごとにビットレートを指定する、などがより簡単にできるのではないでしょうか。Endpointベースでのビデオビットレートのフィルタ(着信ストリームのフィルタ)との違いも抑えて使用しましょう。