MediaPackage v2のManifest filter optionsを試してみた
はじめに
清水です。昨年2023年5月にリリースされたAWS Elemental MediaPackage v2でManifest filter optionsを試してみました。MediaPackage v2ではリリース当時からクエリ文字列によるManifest filteringには対応していたようなのですが、2023/10/31付のアップデートでFilter configurationという機能が追加されたようです。
- AWS Elemental MediaPackage expands manifest configuration options
- AWS Elemental MediaPackage がマニフェスト設定オプションを拡張
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 GuideのDocument 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 event
のHLS
をのほうを選択します。MediaPackage
ではない点に注意しましょう。MediaPackage v1をOutput先に指定する場合はMediaPackage
を使用するのが良いかと思いますが、MediaPackage v2を利用する場合、現段階ではここでHLS
を選択する必要がある認識です。
Channel classはSINGLE_PIPELINE
にしています。MediaPackage v2のマネジメントコンソール、ChannelリソースのSettingsのタブで確認できるHLS ingest endpoint 1
をHLS group destination A
のURLとして入力します。
HLS settingsの項目、CDN SettingsはAWS Elemental MediaLive User Guideの記載からHLS basic PUT
を選択しました。
HLS outputsはさきほどChannel templateでLive event - HLS
を選択したため、1080p30
、720p30
、480p30
、240p30
の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のうちビットレートを基準に1080p30
と240p
をフィルタリング、720p30
と480p30
のみを残すかたちですね。クエリ文字列を指定することにより、意図したとおりにフィルタリングされたマニフェストファイルが得られていることが確認できます。
% 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のためのクエリ文字列を設定することも可能です、こちらについても追って確認してみたいと思います。