AWS Elemental MediaPackageでマニフェストフィルタリングをしてみた

AWS Elemental MediaPackageでEndpoint URLにクエリ文字列を付与することでビデオビットレート、ビデオコーデック、オーディオコーデック、オーディオ言語をトップレベルマニフェストレベルでフィルタすることができます。
2020.05.31

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

はじめに

清水です。動画配信におけるジャストインタイムパッケージングサービスであるAWS Elemental MediaPackageでクエリ文字列ベースのマニフェストフィルタリングをやってみたのでまとめてみます。(2020/04/08にポストされたアップデート内容の1つですね。)

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ベースでのビデオビットレートのフィルタ(着信ストリームのフィルタ)との違いも抑えて使用しましょう。