MediaPackage v2のManifest filter optionsを試してみた

MediaPackage v2ではクエリ文字列によるマニフェスト操作をEndpoint側で設定してしまうFilter configurationという機能が追加されています。マニフェストファイルのフィルタリングで動作を確認してみました。
2024.01.31

はじめに

清水です。昨年2023年5月にリリースされたAWS Elemental MediaPackage v2でManifest filter optionsを試してみました。MediaPackage v2ではリリース当時からクエリ文字列によるManifest filteringには対応していたようなのですが、2023/10/31付のアップデートでFilter configurationという機能が追加されたようです。

MediaPackage v1と同様、MediaPackage v2でもPlayback URLに対してクエリ文字列を付与することでManifest filteringのほか、Startover window (Time-shifted viewing)やTime delay用のマニフェストファイルが得られます。ですがクエリ文字列の使用には、URLが複雑になることや視聴者によるURLの改ざんなどのリスクがあります。(わかりやすいクエリ文字列の場合、とりあえずその値を変更したりパメータを削除したりして動作を確認してみる、なんてことありますよね。)

MediaPackage v2ではFilter configurationを利用して、クエリ文字列での指定をEndpoint側で設定することができるようになったわけです。これを用いることで、同一のplayback URLで純粋なライブ配信からタイムシフト再生に変換する、といったことも可能になります。

本エントリでは、このMediaPackage v2のFilter configurationについて、Manifest filterの機能を実際に使ってみたのでまとめてみたいと思います。

Filter configurationの設定箇所を確認してみる

まずはMediaPackage v2のFilter configurationについて、その設定箇所と設定内容を確認してみましょう。

MediaPackage v2 Usr GuideDocument historyページを確認すると、AWS What's Newにポストされた前日の2023/10/30付でManifest filtersについての更新があったことが確認できます。

Document history for the MediaPackage User Guide - AWS Elemental MediaPackage

Manifest filtersのリンクから該当箇所に進んでみましょう。以下のページ、見出し的に言えば「Delivering live content > Working with endpoints > Creating an origin endpoint > Manifest fields」に遷移します。

Manifest fields - AWS Elemental MediaPackage

設定内容についてはこちらのUser Guideから確認ができますね。さらに、この見出しからMediaPackage v2マネジメントコンソールの設定箇所を確認してみましょう。任意のChannelの[Create endpoint]ボタンから進みます。Manifest definitionsの項目で[Add HLS manifest]ボタンを押下、Program date/time intervalの項目の下にFilter configurationの項目がありますね!

Enable filter configurationを有効にすると、実際に設定内容が現れます。

Low-latency HLS manifestsの項目でも同様に、Enable filter configurationを有効にすることで設定内容が現れます。

なお、MediaPackage v2リリース時のブログエントリを確認してみると、どちらの項目でもProgram date/time intervalの下にこのEnable filter configurationはありません。MediaPackage v2リリース後に追加された機能であることがわかります。

[速報] low-latency HLSにも対応したMediaPackage v2がリリースされました![NEW] | DevelopersIO

またAWS API Changesのサイトでも、2023/10/30付でFilterConfigurationに関するAPI変更があったことが確認できます。

Filter configurationのManifest filterを設定してみる

MediaPackageリソースの作成

Channel groupを作成、ついでChannelを作成します。今回は検証目的ですので、Channel polciyはアタッチしません。

Channel作成後、Endpointを作成します。Container typeはTS、Startover windowはデフォルトの900 (sec.)です。Segment settingsとEncryptionはデフォルト設定のまま、Endpoint policyについてはAttach a public policyを選択して進めます。(Endpoint policyは使用用途に合わせたpolicyを選択しましょう。今回は検証用途ですのでAttach a public policyを選択しています。)

Manifest definitionsの項目です。今回の検証はHLS manifestで行います。[Add HLS manifest]ボタンでHLS manifestを追加、Manifest nameとChild manifest nameを適切に設定します。Filter configurationでは、ひとまずEnable filter configurationの項目を無効にしたままEndpointを作成します。(無効にした状態であらかじめマニフェストファイルを確認し、そのあとEnable filter configurationの項目を有効にします。)

Origin endpoint作成後、Manifest settingsの項目を確認すると以下のような状態です。

MediaLiveのリソース作成

続いてMediaLiveのリソースも作成します。InputならびにChannelリソースを作成しましたが以下では作成のポイントのみまとめます。

Channel作成時のChannel templateでLive eventHLSをのほうを選択します。MediaPackageではない点に注意しましょう。MediaPackage v1をOutput先に指定する場合はMediaPackageを使用するのが良いかと思いますが、MediaPackage v2を利用する場合、現段階ではここでHLSを選択する必要がある認識です。

Channel classはSINGLE_PIPELINEにしています。MediaPackage v2のマネジメントコンソール、ChannelリソースのSettingsのタブで確認できるHLS ingest endpoint 1HLS group destination AのURLとして入力します。

HLS settingsの項目、CDN SettingsはAWS Elemental MediaLive User Guideの記載からHLS basic PUTを選択しました。

HLS outputsはさきほどChannel templateでLive event - HLSを選択したため、1080p30720p30480p30240p30の4つが設定されている状態です。

FilteringしていないHLS manifestを確認

MediaPackageならびにMediaLiveのリソースの準備ができたら、まずはFilteringしていないHLSマニフェストファイルを確認してみましょう。

MediaLiveのChannelをStartさせ、Streaming Softwareから映像を打ち上げます。MediaPackageのOrigin endpointを参照することで映像が視聴できることを確認しておきます。今回はManifest settingsのタブの[Preview]ボタンで遷移できるhls.js demoのページから映像を確認しました。

ライブストリーミングの視聴が問題ないことが確認できたら、HLS manifestのURLをcurlコマンドを叩いてマニフェストファイルを確認してみます。

以下の通り、MediaLiveで設定した解像度ごと4つのrenditionが含まれるマニフェストファイルが確認できます。

 % curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/empv2-filter-configuration-channel-group/empv2-filter-configuration-channel/empv2-filter-configuration-origin-endpoint/index.m3u8"
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:CODECS="avc1.640028,mp4a.40.2",AVERAGE-BANDWIDTH=5711200,RESOLUTION=1920x1080,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=5931200
variant_1.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.64001F,mp4a.40.2",AVERAGE-BANDWIDTH=3511200,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=3643198
variant_2.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D401E,mp4a.40.2",AVERAGE-BANDWIDTH=1790800,RESOLUTION=640x480,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=1856798
variant_3.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D400D,mp4a.40.2",AVERAGE-BANDWIDTH=965800,RESOLUTION=320x240,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=998798
variant_4.m3u8

クエリ文字列ででHLS manifestをFilterしてみる

FilteringしていないHLS manifestが確認できました。続いてMediaPackageの機能であるクエリ文字列によるマニフェストファイルのフィルタリングを確認してみます。

Playback URLに付与するクエリ文字列の書式はMediaPackage v2 User Guideの以下ページを確認しました。

?aws.manifestfilter=parameter1_name:value;parameter2_name:minValue-maxValueという形式で指定します。MediaPackage v1のときと同様ですね。指定できるクエリ文字列についてもざっと確認した限りMediaPackage v1と同様のようです。(適宜、MediaPackage v1のUser GuideのManifest filteringの項目も確認しておきましょう。)

クエリ文字列でvideo_bitrateパラメータを使ってフィルタリングしてみました。4つのrenditionのうちビットレートを基準に1080p30240pをフィルタリング、720p30480p30のみを残すかたちですね。クエリ文字列を指定することにより、意図したとおりにフィルタリングされたマニフェストファイルが得られていることが確認できます。

 % curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/empv2-filter-configuration-channel-group/empv2-filter-configuration-channel/empv2-filter-configuration-origin-endpoint/index.m3u8?aws.manifestfilter=video_bitrate:1000000-4000000"
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:CODECS="avc1.64001F,mp4a.40.2",AVERAGE-BANDWIDTH=3511200,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=3643198
variant_2.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D401E,mp4a.40.2",AVERAGE-BANDWIDTH=1790800,RESOLUTION=640x480,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=1856798
variant_3.m3u8

Filter configurationでManifest filterしてみる

MediaPackage v2でOrigin endpointのPlayback URLにクエリ文字列を付与することで、マニフェストファイルをフィルタリングできることが確認できました。このクエリ文字列によるフィルタリングの弱点としては、URLが長く複雑になってしまうこと、また視聴者によって勝手にパラメータが削除されてしまうことなどが考えられます。例えばビットレートの高いrenditionをクエリ文字列によるフィルタで視聴できないよう制限していても、視聴者がクエリ文字列の存在に気が付き、何らかの手段でクエリ文字列を削除してビットレートの高いrenditionを視聴してしまう、ということは考えられるかと思います。)

このクエリ文字列の弱点をカバーできるのが、Origin endpointのFilter configurationによるフィルタリングです。まずは実際に設定してみましょう。先ほど確認した設定箇所、Origin endpointの[Edit]ボタンから進みます。

HLS manifestsのFilter configurationでEnable filter configurationのチェックボックスを有効にしたら、そのまま出現する[Import from query string]ボタンを押下します。

先ほど付与したクエリ文字列、aws.manifestfilter=video_bitrate:1000000-4000000を入力して[Import]してみます。

Filter keyとFilter valueが設定されましたね。そのままOrigin endpointの設定を[Update]します。

Origin endpintのManifest settingsタブ、Filter configurationでManifest filterの設定ができました。

続いて、実際にこのFilter configurationによるManifest filterを設定した状態でマニフェストファイルを取得してみます。Playback URLにクエリ文字列を付けずにアクセスしてみましょう。本来(フィルタリングしていない状態)であれば4つのrenditionが存在しているはずですが、フィルタリングされた2つのrenditionのみが含まれたマニフェストファイルとなっています。

クエリ文字列を使用せずとも、Filter configurationの設定でマニフェストファイルフィルタリングが実現できました!

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/empv2-filter-configuration-channel-group/empv2-filter-configuration-channel/empv2-filter-configuration-origin-endpoint/index.m3u8"
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:CODECS="avc1.64001F,mp4a.40.2",AVERAGE-BANDWIDTH=3511200,RESOLUTION=1280x720,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=3643198
variant_2.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D401E,mp4a.40.2",AVERAGE-BANDWIDTH=1790800,RESOLUTION=640x480,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=1856798
variant_3.m3u8

なおこのFilter configurationによるManifest filterを設置した状態、フィルタに設定したものと同じkey(パラメータ)のクエリ文字列を付与してしまうとリクエストに失敗してしまいます、注意しましょう。

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/empv2-filter-configuration-channel-group/empv2-filter-configuration-channel/empv2-filter-configuration-origin-endpoint/index.m3u8?aws.manifestfilter=video_bitrate:1000000-4000000"
{"Message":"MediaPackage can't process your request because you queried egress path with duplicate videoBitrate on this manifest setting."}

% curl -i "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/empv2-filter-configuration-channel-group/empv2-filter-configuration-channel/empv2-filter-configuration-origin-endpoint/index.m3u8?aws.manifestfilter=video_bitrate:1000000-4000000"
HTTP/2 400
date: Wed, 31 Jan 2024 13:27:03 GMT
content-type: application/json
content-length: 139
x-amzn-requestid: 45xxxxb3-8xx4-4xx6-9xx1-14xxxxxxxxf3
access-control-allow-origin: *
x-amzn-errortype: ValidationException
access-control-expose-headers: x-amzn-requestid,x-amzn-errortype,x-amzn-mediapackage-last-sequence,x-amzn-mediapackage-last-updated,Content-Encoding,Date
access-control-allow-credentials: true

{"Message":"MediaPackage can't process your request because you queried egress path with duplicate videoBitrate on this manifest setting."}
% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/empv2-filter-configuration-channel-group/empv2-filter-configuration-channel/empv2-filter-configuration-origin-endpoint/index.m3u8?aws.manifestfilter=video_bitrate:0-1000000"
{"Message":"MediaPackage can't process your request because you queried egress path with duplicate videoBitrate on this manifest setting."}

% curl -i "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/empv2-filter-configuration-channel-group/empv2-filter-configuration-channel/empv2-filter-configuration-origin-endpoint/index.m3u8?aws.manifestfilter=video_bitrate:0-1000000"
HTTP/2 400
date: Wed, 31 Jan 2024 13:27:10 GMT
content-type: application/json
content-length: 139
x-amzn-requestid: d6xxxx10-0xxd-4xxf-9xx0-5bxxxxxxxx4f
access-control-allow-origin: *
x-amzn-errortype: ValidationException
access-control-expose-headers: x-amzn-requestid,x-amzn-errortype,x-amzn-mediapackage-last-sequence,x-amzn-mediapackage-last-updated,Content-Encoding,Date
access-control-allow-credentials: true

{"Message":"MediaPackage can't process your request because you queried egress path with duplicate videoBitrate on this manifest setting."}

異なるパラメータであればクエリ文字列を付与することは可能です。しかし、Filter configurationによるManifest filterと重複してフィルタリングされます。少し複雑になりそうですね。以下のようにOrigin endpointで指定しているvideo_bitrateでフィルタされ、さらにクエリ文字列で指定したvideo_heightでもフィルタされたマニフェストファイルが返る、という結果となりました。

% curl "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/empv2-filter-configuration-channel-group/empv2-filter-configuration-channel/empv2-filter-configuration-origin-endpoint/index.m3u8?aws.manifestfilter=video_height:1-500"
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:CODECS="avc1.4D401E,mp4a.40.2",AVERAGE-BANDWIDTH=1790800,RESOLUTION=640x480,VIDEO-RANGE=SDR,FRAME-RATE=30.0,BANDWIDTH=1856798
variant_3.m3u8

まとめ

AWS Elemental MediaPackage v2のFilter configurationによるManifest filteringについて確認してみました。クエリ文字列によるManifest filteringも便利ではあるのですが、本文中で述べたとおり弱点もあります。Origin endpoint側のFilter configurationを活用することでこの弱点を補うことができるかと思います。また例えばこれまでMediaPackage + CloudFrontといった構成で、クエリ文字列をCloudFront Functionsなどを使って調整していた、なんて場合にこのFilter configurationを使えばMediaPackage側だけで調整が可能になるかと思います。上手に使っていきたいなと思いました。そして本エントリでは確認していませんが、Filter configurationではStartover window (Time-shifted viewing)やTime delayのためのクエリ文字列を設定することも可能です、こちらについても追って確認してみたいと思います。