[UPDATE] AWS Elemental MediaTailorのChannel Assemblyでprogram rulesをサポートしました!

指定の番組だけ特定の視聴者には別のコンテンツを配信する、といったことが簡単に実現可能になるアップデートです。Program内で代替となるメディアを指定しておき、Playback URLにクエリ文字列で視聴者IDを付与してリクエストを行います。
2024.04.02

はじめに

清水です。AWS Media Servicesのアップデート情報をお届けするコーナーです。本エントリでお伝えするアップデート情報はこちら!AWS Elemental MediaTailorの仮想リニアライブストリームを作成できるChannel Assembly機能で、program rulesをサポートしました。(2024/03/19付でポストされたアップデート情報になります。)

Program rulesを利用することで、1つの仮想リニアライブストリーム用Channelにおいて特定の時間帯(例えば1つの番組の間)、特定のユーザには別のコンテンツを提供することが容易に実現できます。Channel側では新たに追加されたAudiencesという項目を設定し、またそのAudience向けのScheduleを組みます。リクエスト時にAudience IDを付与することで特定のユーザ(視聴者)にあったコンテンツが取得できるというぐあいです。詳細については以下のAWS for M&E Blogでも紹介されています。

本エントリでは、このMediaTailor Channel Assemblyのprogram rulesを実際に試してみたのでまとめたいと思います。

MediaTailor Channel Assembly用の映像ソースの準備

MediaTailor Channel Assemblyの使用にあたり、映像ソースならびにそれらを登録するMediaTailorのSource locationリソース、そしてMediaTailorのChannelリソースが必要です。まずはこれらを準備していきます。なお映像ソースはLiveソースとVODソースを準備することとしました。基本的には以下ブログエントリと同様の手順で行いますが、マネジメントコンソール画面の更新などもありそうなので新たにスクリーンショットなどについても掲載しておきます。詳細などは下記エントリもあわせてご確認ください。

Liveソースの準備

LiveソースはAWS Elemental MediaLiveのWorkflow Wizardを使って準備します。以下がWorkflow作成の概要です。

作成したWorkflowのMediaPackage HLS endpointをCloudFront経由でLiveソースとして使用します。以下の形式のURLですね。

  • https://dxxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxx/index.m3u8

このMediaPackageのHLS Endpoint、MediaTailorのLiveソースでEXT-X-PROGRAM-DATE-TIMEが必要になることから、1点設定を変更しておきます。Package settingsの項目から「Program date/time interval (sec)」を有効にし、値を6秒としておきました。(参考: パッケージャ設定のフィールド - AWS ElementalMediaPackage) v

VODソースの準備

VODソースについてはLiveソースと同じドメインで参照できるように準備しました。具体的にはMediaConvertでHLS素材を準備します。このときMediaLive Workflowの設定にあうようにSegment Durationやビットレートなどを調整しておきました。素材はS3に格納されていますが、MediaLive Workflowで作成されたCloudFrontにこのS3をオリジンとして追加、Behavior「/vod/*」でこのオリジンにアクセスできるように設定をしておきます。

これでVODソースについては以下URLでアクセスできる状態になりました。Filler slate用とProgram ruleで使用する2つのVODコンテンツを準しています。またCloudFrontドメイン名はLiveソースと同一です。

  • https://dxxxxxxxxxxxxx.cloudfront.net/vod/sample00.m3u8
  • https://dxxxxxxxxxxxxx.cloudfront.net/vod/sample10.m3u8

MediaTailor Source locationの作成

LiveならびにVODソースができたらMediaTailor Channel AssemblyのSource locationリソースを作成し、各ソースを追加します。[Create source location]ボタンから進み、適切なNameを入力します。Base URLはMediaLive Workflow Wizardで作成し、/vod用のオリジンとBehavior設定を追加したCloudFrontディストリビューションの情報を入力します。

VODソースの追加

続いてこのSource locationにLiveソースとVODソースを追加していきます。まずはVODソースです。[Add VOD source]ボタンから進みます。Nameを適切に入力し(vod-source-00としました)、Relative pathでVODコンテンツへのパス/vod/sample00.m3u8を設定します。

2つ目のVODコンテンツも登録します。Nameはvod-source-10としました。VODコンテンツへのパスは/vod/sample10.m3u8です。

2つのVODコンテンツがVOD sourcesとして追加できました。

Liveソースの追加

続いてLiveソースの追加です。"Live sources"のタブに進み、[Add live source]ボタンでLiveソースの追加に進みます。Nameを適切に入力(live-sourceとしました)、Relative pathでは/out/v1/xxxxxxxxxxxxxxxxxxxxxxx/index.m3u8を設定します。

Live sourcesとして追加ができました。

MediaTailor Channelの作成

Source locationリソースの準備ができたら、続いてはMediaTailor Channel AssemblyのChannelリソースを作成します。[Create channel]ボタンから進み、Nameを適切に入力します。TierはLive sourceを使用するので、BasicではなくStandardを選択します。Playback modeはTierでStandardを選択することで、自動的にLiner固定となります。Filler slateでは、先ほど作成したSource locationのVOD sourceの1つ(vod-source-00)を選択します。

続いて「Configure audiences」の画面に進みます。このAudiencesの設定が今回のアップデートprogram rulesのキモなのですが、後ほどChannel作成後に設定するとして、ここでは[Next]でそのまま先に進みます。

「Configure outputs」に進みます。Output detailsのManifest nameを入力例に従いindexとしました。その他はデフォルトの状態で進みます。

「Access control」の設定画面です。今回は検証目的なので「Attach a public policy」を選択します。使用用途にあわせて適切なpolicyを選択しましょう。

「Logging」の設定画面です。As Runログについては、検証目的ですので無効のまま進めました。こちらも用途にあわせて設定するようにしましょう。

最後に設定内容をReviewして、問題ないことを確認。[Create channel]します。

Channelが作成できました。

MediaTailorのProgram rulesで視聴者ごとにLiveとVODの配信を出し分けてみる

MediaTailor Channel AssemblyのSource locationならびにChannelの準備ができました。ここから今回のアップデート、Program rulesについての設定をしていきたいと思います。

Audienceの作成

MediaTailor Channel作成時にスキップしていたAudiencesを作成します。Channelの詳細画面から右上のActions > EditでChannelの編集画面に進みます。

Edit channelの画面に進みます。Channel作成時と同じ項目でStep 1〜Step 6までありますね。Step 1 Set channel detailsでは変更箇所はないのでそのまま右下[Next]ボタンでStep 2 Configure audiencesに進みます。Audiencesの項目で[Add]ボタンを押下しましょう。

Add audienceのダイアログが現れます。ここでAudienceのIDとなる文字列を入力します。英数字である必要があります。今回はvodaudienceとしました。

Audiencesを追加したら、[Next]でそのままStep 6 Review and editまで進みます。

変更内容を確認して、[Save channel]します。

Channelのupdateができました。"Audiences"タブで追加したAudienceを確認しておきます。

Program rulesを設定したProgramの追加

Audienceが作成できたら、続いてProgramの作成です。この際、「Audienceを指定しないデフォルトの視聴者」と、「Audienceを指定した特定の視聴者」向け、それぞれのProgramを指定することができます。後者の「Audienceを指定した特定の視聴者」向けのProgramはAlternate media(代替メディア)と呼ばれます。

"Schedule"タブの[Add program]ボタンから進みます。Step 1 Basic detailsの項目、Program detailsでNameを適切に入力します。Source typeではLiveを選択し、作成済みのSource locationのLiveソース(live-source)を設定します。

Step 2 Playback configurationです。Duration in millisecondsに最小値となる「600000」(=10分)を入力します。Transition typeはAbsolute固定です。Scheduled start timeを適切に設定します。そのほかの項目はデフォルトのまま、[Next]で進みます。

Step 3 Set alternate mediaの項目です。今回のアップデートのキモですね。[Add]ボタンでこのProgramに対して代替メディアを適用するAudienceを追加します。

Audience identifierの項目が現れます。先ほど作成したAudience、vodaudienceを選択します。

続いて、このAudience vodaudienceに対する代替メディア、Alternate mediaを指定します。LiveソースではなくVODソースとして登録したコンテンツのうち、Filler slateとは別のvod-source-10を指定しました。

Step 4 Review and createで内容を確認して[Add program]します。

Programが追加できました。Alternate mediaの欄で、Audience: vodaudienceに対して代替メディアとなるVODコンテンツが指定されていることが確認できます。

実際に視聴者ごとにコンテンツがわかれていることの確認

特定の視聴者向けにはAlternate mediaを設定したProgramが作成できました。実際にこのProgramで、視聴者ごとに配信されるコンテンツがわかれることを確認します。

Channel schedule

Liveソースの準備として、MediaLive側でMediaLive ChannelをStartし、MediaLive Inputに向けて映像を打ち上げます。続いてMediaTailor側のChannelをStartさせます。デフォルトの視聴者(Audience: Default)向けのプログラムについては、以下のようにLiveソースのコンテンツが始まるまではFiller stateが配信されれ、その後、指定の時刻になったらLiveソースlive-sourceが配信される、というChannel scheduleのProgramになっていますね。

続いて、Audience:の箇所でvodaudienceを選択します。特定の視聴者向け(Audience IDがvodaudience向け)のChannel scheduleが表示されます。特定の時間まではFiller slateが配信されます。その後LiveソースのProgramの時間になると、Liveソースlive-sourceではなくAlternate mediaで指定した代替となるVODソースvod-source-10が配信されます。

配信映像

続いて実際に配信される仮想ライブストリームの映像を確認します。動画PlayerはmacOS上のSafariを使用しました。再生用のURLはChannel詳細画面の"Outputs"タブで確認できます。Playback urlの項目ですね。

以下の形式になっています。

  • https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index.m3u8

特定の視聴者向けには、このPlayback URLにクエリ文字列aws.mediatailor.channel.audienceId=[Audience ID]を付与してアクセスするようにします。今回の検証での特定の視聴者向けURLは、[Audience ID]vodaudienceで置き換え以下となります。

  • https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index.m3u8?aws.mediatailor.channel.audienceId=vodaudience

以下、実際のライブストリームの映像です。まずはLiveソースProgramになる前の時間、デフォルト視聴者向け(左)、特定視聴者向け(右)、どちらも同じFiller slateの映像が流れます。

Liveソースを指定したProgramの時間になると、デフォルト視聴者向け(左)の映像はLiveソースのものに切り替わります。対して、特定視聴者向け(右)にはAlternate mediaで指定した代替となるVODソースが流れます。

視聴者ごと個別のChannelを作成すれば同等のことはできますが、同じ仮想ライブストリーム用のChannelで指定した時間(特定のProgram)のみ一部の視聴者に異なる映像を出し分けることを、簡単なPlayback URLの変更(クエリ文字列の付与)で実現していることがポイントですね。

マニフェストファイル

Program rulesを指定することで、Audienceごとに映像が出し分けられることが確認できました。この映像(配信コンテンツ)の出し分け、マニフェストファイルでも確認してみましょう。MediaTailor ChannelのPlayback URLに対してcurlコマンドでリクエストを行い、HLSのm3u8ファイルを参照、どのセグメントファイル(tsファイル)で構成されているかを確認してみます。なおLiveソースとVODソースともに2つのRenditionで構成されていますが、1つ目のRenditionのマニフェストファイルを参照することとします。

まずはLive Programになる前のデフォルトの視聴者(Audience: Default)のm3u8ファイルです。Filler slateであるvod-source-00のコンテンツ(/vod/sample00*)で映像が構成されています。

% curl -i "https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index.m3u8"

HTTP/1.1 200 OK
x-amzn-RequestId: d0xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx5e
Cache-Control: max-age=60
x-amzn-origin-server: AWS Elemental MediaTailor
Date: Sun, 31 Mar 2024 12:55:53 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 310
connection: keep-alive

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:CODECS="avc1.64001f,mp4a.40.2",AVERAGE-BANDWIDTH=3400930,RESOLUTION=1280x720,FRAME-RATE=29.97,BANDWIDTH=3635543
index/1.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4d401f,mp4a.40.2",AVERAGE-BANDWIDTH=1746546,RESOLUTION=854x480,FRAME-RATE=29.97,BANDWIDTH=1826285
index/2.m3u8

% curl -i "https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index/1.m3u8"
HTTP/1.1 200 OK
x-amzn-RequestId: 9fxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx40
Cache-Control: max-age=2
x-amzn-origin-server: AWS Elemental MediaTailor
Date: Sun, 31 Mar 2024 12:55:57 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 1622
connection: keep-alive

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:19
#EXT-X-DISCONTINUITY-SEQUENCE:4
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:54:45.575Z
#EXTINF:5.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00004.ts
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=NONE
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:54:50.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00001.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:54:56.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:02.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00003.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:08.575Z
#EXTINF:5.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00004.ts
#EXT-X-DISCONTINUITY
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:13.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00001.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:19.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:25.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00003.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:31.575Z
#EXTINF:5.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00004.ts
#EXT-X-DISCONTINUITY
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:36.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00001.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:42.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts

同じくLive Programになる前の特定の視聴者(Audience: vodaudience)のm3u8ファイルです。こちらもデフォルトの視聴者向けと同様、Filler slateであるvod-source-00のコンテンツ(/vod/sample00*)で映像が構成されています。

% curl -i "https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index.m3u8?aws.mediatailor.channel.audienceId=vodaudience"
HTTP/1.1 200 OK
x-amzn-RequestId: 7bxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxcf
Cache-Control: max-age=60
x-amzn-origin-server: AWS Elemental MediaTailor
Date: Sun, 31 Mar 2024 12:56:04 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 404
connection: keep-alive

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:CODECS="avc1.64001f,mp4a.40.2",AVERAGE-BANDWIDTH=3400930,RESOLUTION=1280x720,FRAME-RATE=29.97,BANDWIDTH=3635543
index/1.m3u8?aws.mediatailor.channel.audienceId=vodaudience
#EXT-X-STREAM-INF:CODECS="avc1.4d401f,mp4a.40.2",AVERAGE-BANDWIDTH=1746546,RESOLUTION=854x480,FRAME-RATE=29.97,BANDWIDTH=1826285
index/2.m3u8?aws.mediatailor.channel.audienceId=vodaudience

% curl -i "https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index/1.m3u8?aws.mediatailor.channel.audienceId=vodaudience"
HTTP/1.1 200 OK
x-amzn-RequestId: e0xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx55
Cache-Control: max-age=2
x-amzn-origin-server: AWS Elemental MediaTailor
Date: Sun, 31 Mar 2024 12:56:07 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 1601
connection: keep-alive

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:21
#EXT-X-DISCONTINUITY-SEQUENCE:5
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:54:56.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:02.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00003.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:08.575Z
#EXTINF:5.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00004.ts
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=NONE
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:13.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00001.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:19.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:25.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00003.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:31.575Z
#EXTINF:5.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00004.ts
#EXT-X-DISCONTINUITY
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:36.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00001.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:42.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:48.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00003.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:55:54.575Z
#EXTINF:5.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00004.ts

続いてLive Programになったタイミングでの、デフォルトの視聴者(Audience: Default)のm3u8ファイルです。/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index_1_248.ts?m=1711872861と、Liveソースとして指定したlive-sourceのコンテンツで映像が構成されていることがわかります。

% curl -i "https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index.m3u8"
HTTP/1.1 200 OK
x-amzn-RequestId: 5axxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxeb
Cache-Control: max-age=60
x-amzn-origin-server: AWS Elemental MediaTailor
Date: Sun, 31 Mar 2024 13:00:45 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 310
connection: keep-alive

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:CODECS="avc1.64001F,mp4a.40.2",AVERAGE-BANDWIDTH=3440795,RESOLUTION=1280x720,FRAME-RATE=29.97,BANDWIDTH=5389995
index/1.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D401F,mp4a.40.2",AVERAGE-BANDWIDTH=1790760,RESOLUTION=854x480,FRAME-RATE=29.97,BANDWIDTH=2751289
index/2.m3u8

% curl -i "https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index/1.m3u8"
HTTP/1.1 200 OK
x-amzn-RequestId: 4fxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx63
Cache-Control: max-age=2
x-amzn-origin-server: AWS Elemental MediaTailor
Date: Sun, 31 Mar 2024 13:00:47 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 1848
connection: keep-alive

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:69
#EXT-X-DISCONTINUITY-SEQUENCE:17
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:32.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:38.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00003.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:44.575Z
#EXTINF:5.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00004.ts
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=NONE
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:49.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00001.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:55.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts
#EXT-X-DISCONTINUITY
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:01.575Z
#EXTINF:6.006,
https://xxxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index_1_248.ts?m=1711872861
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:07.581Z
#EXTINF:6.006,
https://xxxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index_1_249.ts?m=1711872861
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:13.587Z
#EXTINF:6.006,
https://xxxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index_1_250.ts?m=1711872861
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:19.593Z
#EXTINF:6.006,
https://xxxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index_1_251.ts?m=1711872861
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:25.599Z
#EXTINF:6.006,
https://xxxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index_1_252.ts?m=1711872861
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:31.605Z
#EXTINF:6.006,
https://xxxxxxxxxxxxxx.cloudfront.net/out/v1/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/index_1_253.ts?m=1711872861

Live Programになったタイミングでの特定の視聴者(Audience: vodaudience)向けののm3u8ファイルです。Alternate mediaで指定したVODソースvod-source-01のコンテンツ(/vod/sample10*)になっていることが確認できますね!

% curl -i "https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index.m3u8?aws.mediatailor.channel.audienceId=vodaudience"
HTTP/1.1 200 OK
x-amzn-RequestId: 13xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxc2
Cache-Control: max-age=60
x-amzn-origin-server: AWS Elemental MediaTailor
Date: Sun, 31 Mar 2024 13:00:49 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 404
connection: keep-alive

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:CODECS="avc1.64001f,mp4a.40.2",AVERAGE-BANDWIDTH=3245287,RESOLUTION=1280x720,FRAME-RATE=29.97,BANDWIDTH=3747228
index/1.m3u8?aws.mediatailor.channel.audienceId=vodaudience
#EXT-X-STREAM-INF:CODECS="avc1.4d401f,mp4a.40.2",AVERAGE-BANDWIDTH=1705370,RESOLUTION=854x480,FRAME-RATE=29.97,BANDWIDTH=1895651
index/2.m3u8?aws.mediatailor.channel.audienceId=vodaudience

% curl -i "https://xxxxxx.xx.channel-assembly.mediatailor.ap-northeast-1.amazonaws.com/v1/channel/program-rules-channel/index/1.m3u8?aws.mediatailor.channel.audienceId=vodaudience"
HTTP/1.1 200 OK
x-amzn-RequestId: 0axxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx66
Cache-Control: max-age=2
x-amzn-origin-server: AWS Elemental MediaTailor
Date: Sun, 31 Mar 2024 13:00:51 GMT
Content-Type: application/vnd.apple.mpegurl
Content-Length: 1602
connection: keep-alive

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:70
#EXT-X-DISCONTINUITY-SEQUENCE:17
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:38.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00003.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:44.575Z
#EXTINF:5.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00004.ts
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=NONE
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:49.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00001.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T12:59:55.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample00_720p30_00002.ts
#EXT-X-DISCONTINUITY
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:01.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample10_720p30_00001.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:07.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample10_720p30_00002.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:13.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample10_720p30_00003.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:19.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample10_720p30_00004.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:25.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample10_720p30_00005.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:31.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample10_720p30_00006.ts
#EXT-X-PROGRAM-DATE-TIME:2024-03-31T13:00:37.575Z
#EXTINF:6.0,
https://xxxxxxxxxxxxxx.cloudfront.net/vod/sample10_720p30_00007.ts

まとめ

AWS Elemental MediaTailorの仮想ライブストリームが作成できるChannel Assemblyの新機能、Program rulesについて実際の動作を確認してみました。異なる視聴者に向けてコンテンツを出し分ける場合、これまでは別々の仮想ライブストリームChannelを準備する必要がありました。Program rulesを活用することで容易にコンテンツの出し分けが実現できます。Program追加時に特定視聴者向けの代替メディアを指定しておけば、Player側ではPlayback URLにクエリ文字列を付与するだけである点も手軽ですよね。AWS for M&Eの機能紹介のBlogではCloudFrontのGeolocation rulesと組み合わせた活用例が紹介されていますが、特定の地域の視聴者には別のコンテンツを配信する、といったことが非常に簡単に実現できそうです。なお同Blog内にも記載がありますが、出し分けの基準としてMediaTailor Channel Assembly側ではクリエ文字列のみとなっています。厳密にコンテンツ保護を行いたいといった場合はクエリ文字列の改ざん防止などを検討しましょう。今回は紹介BlogにならいLiveコンテンツをVODコンテンツで置き換えるかたちを確認しましたが、VODコンテンツ同士の置き換えやLiveコンテンツの出し分けといったこともできそうです。こちらも追って確認できればと思います。