AWS Elemental MediaTailorでライブ配信時にプリロール広告を挿入してみた

AWS Elemental MediaTailorを使ってライブ動画配信の際にプリロール広告(本編の再生前に流れる広告動画)を挿入してみました。AWSのチュートリアルを参考にし、CloudFrontとの連携についても確認しています。
2021.10.24

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

はじめに

清水です。動画のパーソナライズと収益化に利用できるAWS Elemental MediaTailor、以前(もう2年ほど前になりますが)AWSが公開しているチュートリアルを使ってVODの広告付き動画配信をやってみたことがあります。

この際はVODコンテンツに対する広告動画の挿入でした。本エントリではLiveコンテンツに対して広告挿入を行ってみます。Liveコンテンツへの広告挿入については、広告挿入のタイミングなどを制御するSCTEなどが必要になりますが、2019/09/11付のMediaTailorのアップデートで、このSCTEなしでプリロール広告(動画コンテンツ再生開始前に挿入される広告)をサポートしました。

本エントリでは、このMediaTailorのライブストリームのプリロールサポートを使い、ライブ配信時にプリロール広告挿入を試してみます。SCTEについては扱いません。また配信形式はHLSとしています。手順などはAWSの公開しているチュートリアル「aws-media-services-simple-live-workflow / README.md at master・aws-samples / aws-media-services-simple-live-workflow・GitHub」を参考にしています。(こちらのチュートリアルの内容もVODコンテンツ版ではなく、Liveコンテンツ版です。)ADサーバなどは可能な限り(特に実際に挿入して再生される広告動画)は検証用にコンテンツ含め準備しましたが、一部チュートリアルで利用しているものを同様に参照して使用しています。また手順などは冒頭で示したエントリと類似している部分もあるかと思いますが、AWSのLiveコンテンツ版チュートリアルを参考にしているため冒頭のVODコンテンツ版と比べっていくぶんシンプルになっているかなとも思います。

ライブ配信環境の準備

MediaLive Workflowを使った環境構築

まずはライブ配信の環境を準備します。AWS Elemental MediaLiveとAWS Elemental MediaPackageを使用しました。MediaLiveのWorkflow Wizardを使ってサクッと環境を作成します。詳細は下記エントリを参照ください。本エントリでは要点のみ抜粋します。

Workflow名「live-pre-roll」としてWorkflowを作成していきます。検証目的ですのでSINGLE_PIPELINEで進めます。

入力はRTMP (push)を選択しています。

OutputでMediaPackageを選択、MediaPackageのChannelは新規作成とします。Video renditionsはデフォルトの状態で進めました。

内容をレビューして[Create workflow resources]ボタンでWorkflowを作成します。表示されるダイアログのとおり、以下リソースが作成されます。ただし、後述しますがここで作成されるCloudFrontディストリビューションは使用しません。

映像を打ち上げてライブ配信の視聴確認

Workflow作成後、Create completeになったら、[Start workflow]ボタンでMeidaLiveのChannelを開始します。その後、実際に映像をMediaLiveに打ち上げ、動画Playerからライブ配信が問題なく視聴できることを確認しておきます。

ライブ動画配信はMediaPackageのHLS endpointを使ってHLS形式での視聴を確認していきます。MediaPackageのマネジメントコンソール、該当ChannelのHLS endpointで、 CloudFront URLではなくEndpoint URLのほうを確認しておきます。

CloudFront URLではこのMediaPackage Channelをオリジンに持つCloudFrontディストリビューションからの配信になります。MediaTailorを使わない構成ではこのCloudFrontディストリビューションを使用すればよいのですが、今回はMediaTailorをオリジンとしたCloudFrontディストリビューションを別途作成するため、こちらは使用しません。

ライブ動画配信の視聴に使用するMediaPackageのHLS Endpoint URLは「https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index.m3u8」となります。

ライブ配信の視聴には、ひとまずVideoJS HTTP Streamingを使用しています。(後述しますが、こちらのVideoJS HTTP Streamingのサイトの動画Playerでは広告挿入した動画の再生で問題が見られるようでした。そのため実際に広告を挿入した動画の再生は他のサイトのPlayerなどを使って確認しています。)先ほど確認したMediaPackageのHLS Endpoint URL、「https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index.m3u8」をVideo URLに入力、MimeType: application/x-mpegURLで[Load]を押して再生します。

広告を挿入していない段階のライブ動画配信が問題なく視聴できていることが確認できました。

MediaTailorを設定してプリロール広告挿入を確認

続いて、本題となるライブ動画にプリロール広告挿入を行うMediaTailorの設定を行っていきます。まずはCloudFrontを導入しない段階、MediaTailorのEndpointにアクセスしてプリロール広告が挿入されたライブ動画配信が視聴できることを確認していきます。

AWSのチュートリアル「aws-media-services-simple-live-workflow」の「5-MediaTailor」では、「1. Create an AWS Elemental MediaTailor Configuration」と「2. Test MediaTailor Playback」が該当する箇所となります。

事前にAD decision serverや挿入する広告動画などを準備しておきます。以下のようにしました。

  • Ad decision server
    • AWSのチュートリアルで使用しているAd decision serverを使用します。ドメインが「pubads.g.doubleclick.net」のものです。AWS本エントリ内ではユニークであるかと思われるパラメータはマスクしていますので、実際にお試しの際はAWSのチュートリアルをご参照ください
    • https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/xxxxxxxxx/external/ad_rule_samples&ciu_szs=300x250&ad_rule=1&impl=s&gdfp_req=1&env=vp&output=vmap&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&cmsid=xxx&vid=short_onecue&correlator=[avail.random]
  • Slate ad
    • 広告が短すぎる場合やトランスコードが完了しておらず利用できない場合などに、ここで指定するMP4がMeditaTailor側で挿入する広告になります(Inserting slate - AWS Elemental MediaTailor
    • S3バケットにMP4ファイルを準備しました。長さが17秒ほどの、街並みが映っている動画です
    • https://my-s3-bucket-2.s3.ap-northeast-1.amazonaws.com/slate_ad.mp4
  • Live preroll ad decision server
    • AWSのチュートリアルで扱っている「HLSPreRollVast.xml」を参考に自分でXMLファイルを作成、こちらをS3でホスティングしました
    • https://my-s3-bucket-2.s3-ap-northeast-1.amazonaws.com/live-pre-roll-vast.xml
    • XMLファイル内でプリロール広告となる動画を指定しています
      • この広告動画はMP4ファイルで、こちらもS3でホスティングしています。長さ15秒の海辺の映像です
      • https://my-s3-bucket-2.s3-ap-northeast-1.amazonaws.com/live-pre-roll-ad-15sec.mp4

Live preroll ad decision serverで指定する「live-pre-roll-vast.xml」の内容は下記となります。

live-pre-roll-vast.xml

<VAST version="3.0">
  <Ad sequence="1">
    <InLine>
      <AdSystem>2.0</AdSystem>
      <AdTitle>ad-1</AdTitle>
      <Impression></Impression>
      <Creatives>
        <Creative>
          <Linear>
            <Duration>00:00:15</Duration>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4" width="1280" height="720">
                <![CDATA[https://my-s3-bucket-2.s3-ap-northeast-1.amazonaws.com/live-pre-roll-ad-15sec.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

MediaTailorのConfiguration作成

広告動画などの準備ができたら、MediaTailorのConfigurationを作成していきます。MediaTailorのマネジメントコンソール、メニューのAd insertion > Configurationsの画面から[Create configuration]ボタンで進みます。

Required settingsの項目、Nameは「live-pre-roll」を入力しました。Content sourceとしては先ほどのMediaPackageのHLS endpoint「https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index.m3u8」のうち、マニフェストファイルのファイル名へのパス部分「/index.m3u8」を省いた「https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe」を入力します。

Ad decision serverは先ほど確認した「pubads.g.doubleclick.net」ドメインのURLを入力します。

Personalization detailsの項目を開き、Salte adに「https://my-s3-bucket-2.s3.ap-northeast-1.amazonaws.com/slate_ad.mp4」を、またLive pre-roll ad decision serverには「https://my-s3-bucket-2.s3-ap-northeast-1.amazonaws.com/live-pre-roll-vast.xml」を入力します。Live pre-roll maximum allowed durationはプリロール動画の尺とあわせて15秒としました。

その他の項目はデフォルトのまま、[Create configuration]ボタンでMediaTailorのConfigurationを作成します。

MediaTailorでプリロール広告動画が挿入されることの確認

MediaTailorのConfigurationが作成できたら、実際にライブ配信のプリロールに広告動画が挿入されるか確認してみます。この段階ではCloudFrontは経由せず、MediaTailorからの配信になります。

先ほどのMediaLiveのWorkflowをStartさせ、ライブ配信を開始します。Playback URLは先ほどの確認したMediaPackageのHLS Endpoint URLではなく、MediaTailor側のドメインになります。HLSでライブ視聴を行いますので、MediaTailorのConfigurationのPlayback endpoint prefixes、「HLS playback prefix」を確認します。

  • MediaTailor HLS playback prefix
    • https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/

このURL末尾に、マニフェストファイルの名称「index.m3u8」を付与します。MediaPackageのHLS Endpoint URLではこの「index.m3u8」がついていましたが、MediaTailorのConfiguration作成時、省略していた部分ですね。ここでマニフェストファイル名称が補われることになります。

  • MediaTailorでのプリロール広告動画ありのPlayback URL
    • https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/index.m3u8

実際にこのPlayback URLに動画Playerでアクセスして視聴を確認してみます。動画Playerに(VideoJS HTTP Streamingではなく)VideoJS HLSを使用した場合が以下になります。

再生開始後、まずはプリロール広告動画が再生されます。海辺の映像ですね。

15秒のプリロール広告動画が終わったら、ライブ配信動画の本編がはじまります。

意図したように、プリロールの広告動画が再生されたあと、本編のライブ配信がはじまる、という映像が視聴できました。なお、この1回目の再生のときのみ、広告動画が再生されなかったのですが、これは広告動画のトランスコード中なのかな、と推測しています。数十秒後に再度、再生を開始した場合は広告動画が挿入されました。トランスコード中であればスレートに指定した動画が流れるかとも思ったのですが、今回はそのような挙動にはなりませんでした。気になるところですが、今回はの目的はプリロール広告を挿入したライブ配信を行うところにあるので、ひとまずこれで進めてみたいと思います。

MediaTailorからの配信の際のマニフェストファイルの中身を確認

まずはMediaTailorからのプリロール広告を挿入したライブ配信が行えました。このライブ配信の際の、HLSマニフェストファイルの中身を確認しておきましょう。curlコマンドを使って、マニフェストファイルを参照してみます。

まずはトップレベルマニフェストファイルです。4つのビットレート等の異なる各マニフェストファイルから構成されていることがわかります。

% curl -i https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/index.m3u8
HTTP/2 200
date: Sat, 23 Oct 2021 11:28:01 GMT
content-type: application/vnd.apple.mpegurl
content-length: 1038
x-amzn-requestid: 31bd368d-f0b6-43ac-ae1a-2971513e9d8c
cache-control: max-age=1

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:CODECS="avc1.640020,mp4a.40.2",AVERAGE-BANDWIDTH=5641370,RESOLUTION=1280x720,FRAME-RATE=59.94,BANDWIDTH=8908697
../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.64001F,mp4a.40.2",AVERAGE-BANDWIDTH=3441370,RESOLUTION=1280x720,FRAME-RATE=29.97,BANDWIDTH=5390457
../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/1.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D401F,mp4a.40.2",AVERAGE-BANDWIDTH=1791335,RESOLUTION=854x480,FRAME-RATE=29.97,BANDWIDTH=2751746
../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/2.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D4015,mp4a.40.2",AVERAGE-BANDWIDTH=966318,RESOLUTION=426x240,FRAME-RATE=29.97,BANDWIDTH=1432393
../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/3.m3u8

続いて、各マニフェストファイルの中から、最もビットレート等が高い「0.m3u8」を参照してみます。

 % curl -i https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0.m3u8
HTTP/2 200
date: Sat, 23 Oct 2021 11:28:11 GMT
content-type: application/vnd.apple.mpegurl
content-length: 926
x-amzn-requestid: 735edae8-d1c2-437e-a952-5a57e5f62c6b
cache-control: max-age=1

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:496
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-DISCONTINUITY
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/496
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/497
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/498
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/499
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/500
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/501

こちらは動画ファイル(セグメントファイル)となっています。実際にこのうちの一つを確認してみます。

% curl -i https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/496
HTTP/2 301
date: Sat, 23 Oct 2021 11:28:21 GMT
content-type: application/json
content-length: 2
location: https://segments.mediatailor.ap-northeast-1.amazonaws.com/tm/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/pysaxxxxxxxxxxxxxxxxxxxxxxxxxxxx/asset_720_8_3_00001.ts
x-amzn-requestid: dc139f20-3cce-4afc-8727-d6629ad9f391

{}

301でのリダイレクトになっていますね。リダイレクト先に実際のtsファイルがあるようです。

% curl -I https://segments.mediatailor.ap-northeast-1.amazonaws.com/tm/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/pysaxxxxxxxxxxxxxxxxxxxxxxxxxxxx/asset_720_8_3_00001.ts
HTTP/1.1 200 OK
Content-Type: video/MP2T
Content-Length: 2742544
Connection: keep-alive
Date: Sat, 23 Oct 2021 11:28:31 GMT
Last-Modified: Sat, 23 Oct 2021 09:24:59 GMT
ETag: "2a48f961fe8608e807990ae11a104a08"
Accept-Ranges: bytes
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 fe549dee7599aed7ac454d03b42a94e8.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: NRT12-C3
X-Amz-Cf-Id: dBb4WjT7gXXcyY28gnTtzX5to6--q2B4FiWd5OiJliPfmb2apoF75g==

上記はヘッダ情報のみですが、実際にファイルの中身を確認してみると広告動画の一部であることがわかります。MediaTailorによって挿入される広告動画はリダイレクト先の「segments.mediatailor.ap-northeast-1.amazonaws.com」ドメインから配信されていることがわかりますね。ヘッダ情報から推測すると、S3でホスティングしているCloudFront環境かと思われます。

さて、もういちどマニフェストファイル「0.m3u8」を参照してみます。先ほどと内容が異なり、「./../../../segment/」ではじまるファイル群のあとに、MediaPackageでホスティングされているセグメントファイルが続いています。こちらのMediaPackageから配信される動画がライブ動画本編となります。一般のライブ動画配信のときとおなじように、マニフェストファイルにアクセスするタイミングでその内容を変えているのですが、ここにプリロール広告部分とライブ動画本編部分が含まれ、プリロール広告のあとに本編が続くようになっている、ということがわかります。

% curl -i https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0.m3u8
HTTP/2 200
date: Sat, 23 Oct 2021 11:28:35 GMT
content-type: application/vnd.apple.mpegurl
content-length: 1813
x-amzn-requestid: ee1a837c-48b8-434c-a290-366a4aff8539
cache-control: max-age=1

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:496
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-DISCONTINUITY
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/496
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/497
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/498
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/499
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/500
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/501
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/502
#EXTINF:1.001,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/1bf2xxxx-d5xx-4axx-b5xx-71d5xxxxxxxx/0/503
#EXT-X-DISCONTINUITY
#EXTINF:6.006,
https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_498.ts?m=1634897379
#EXTINF:6.006,
https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_499.ts?m=1634897379
#EXTINF:6.006,
https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_500.ts?m=1634897379
#EXTINF:6.006,
https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_501.ts?m=1634897379

CloudFrontを経由したプリロール広告挿入なライブ配信

MediaTailor単体でのプリロール広告挿入を行ったライブ動画配信の確認ができました。続いてCloudFrontを経由したプリロール広告挿入なライブ配信についても試してみたいと思います。こちらもAWSのチュートリアルを参考に、CloudFrontディストリビューションを作成していきます。AWSのチュートリアル「aws-media-services-simple-live-workflow」の「5-MediaTailor」では、「3. Integrate with Amazon CloudFront」以降が該当します。

CloudFront Distributionの作成と設定

Distributionの作成

CloudFront distributionの作成です。OriginにはMediaPackageとMediaTailorが含まれることになりますが、まずはMediaPackageのChannelをOriginとしてCloudFront distributionを作成します。Origin domainにはMediaPackageのHLS Endpoint URLのドメイン「38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com」を入力します。ProtocolはHTTPS onlyを選択、Nameはわかりやすいように「 MediaPackageOrigin 」としておきました。その他の項目はデフォルトで進めます。

Cache設定についてはDefault cache behaviorでLegacy cache settingsを選択、Query stringsで「All」を選択します。

Descriptionはわかりやすいように「CloudFront for MediaTailor "live-pre-roll".」と入力しておきました。[Create distribution]ボタンでdistributionを作成します。

Originの追加

CloudFront distributionはDeployingで作成中の状況ですが、続けて設定をしていきます。まずはOriginの追加です。Originタブの[Create origin]ボタンから進みます。

Originは、MediaTailor のHLS playback prefix「https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/」のドメイン「881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com」を入力します。 ProtocolはHTTPSを選択、Nameは「 MediaTailorOrigin 」としました。[Create origin]します。

もう一つoriginを作成します。ドメインは「segments.mediatailor.ap-northeast-1.amazonaws.com」、ProtocolでHTTPSを選択、Nameは「 MediaTailorAdOrigin 」とします。

最終的に、以下のように3つのオリジンが設定されている状態となります。

Behaviorの設定

続いてBehaviorの設定をしていきます。

1つ目、パスパターンとして「/out/v1/*」を設定します。こちらはMediaPackageのOriginを指定します。このパス「/out/v1/*」の場合はMediaPackageからのレスポンスを返す(つまりライブ動画本編を返す)具合ですね。

Cache設定についてはLegacy cache settingsを選択、Query stringsで「All」を選択します。

次は「/v1/*」のパスパターンです、こちらはMediaTailorのOrigin(MediaTailorOrigin)を設定します。

Cache設定ではこちらも、Legacy cache settingsを選択、Query stringで「All」選択します。

最後に、DefaultのBehavior(パスパターン Default (*))について、オリジンを変更します。Distribution作成時はMediaPackageOriginでしたが、MediaTailorAdOriginとします。

それぞれのBehaviorが設定できたら、パスパターンの優先順位(Precedence)とオリジンについて確認しておきます。以下のようになります。

MediaTailor側のCDN設定

CloudFront distributionの作成と設定ができたら、続いてMediaTailor ConfigurationのCDN設定を行います。該当Configurationの[Edit]ボタンから進み、Advanced settingsの項目で以下のように入力します。

  • CDN content segment prefix
    • https://d3dkxxxxxxxxxx.cloudfront.net/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe
  • CDN ad segment prefix
    • https://d3dkxxxxxxxxxx.cloudfront.net/

CDN content segment prefixの項目については、MediaPackageのHLS endpoint「https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index.m3u8」のうち、マニフェストファイルのファイル名へのパス部分「index.m3u8」を省いた「https://38fbxxxxxxxxxxxx.mediapackage.ap-northeast-1.amazonaws.com/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe」について、ドメイン部分を先ほどのCloudFrontのドメインに変更したものとなります。このCDN content segment prefixは、MediaTailorからマニフェストファイルを返す際、実際に配信されるライブ動画本編ののtsファイルを示す箇所となります。ここがCDN経由である必要があるため、CloudFrontドメインと書き換わるわけですね。Content sourceで設定した値からCDN経由のドメインにしたものとも言えるかと思います。CDN ad segment prefixについても同様に、広告動画のセグメントファイルの配信元がこのドメインからとなるわけです。

CloudFrontを経由した配信でMediaTailorによるプリロール広告動画が挿入されることの確認

CloudFrontならびにMediaTailorの設定が完了しました。実際にCloudFrontを経由してライブ動画配信にプリロール広告動画が挿入されるか確認してみます。

Playback URLは、先ほど確認したMediaTailor直接のプリロール広告動画ありのURLを参考にします。

  • MediaTailorでのプリロール広告動画ありのPlayback URL
    • https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/index.m3u8

ここでドメイン部分をCloudFrontのドメイン「d3dkxxxxxxxxxx.cloudfront.net」に置き換えます。

  • CloudFrontを経由したMediaTailorによるプリロール広告動画ありのPlayback URL
    • https://d3dkxxxxxxxxxx.cloudfront.net/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/index.m3u8

こちらもMediaTailor直接の場合と同様、動画Playerに(VideoJS HTTP Streamingではなく)VideoJS HLSを使って視聴を確認してみます。プリロール広告動画のあと、ライブ動画本編がはじまる、という意図した再生が行えることが確認できました。

なお、Playback URLについては注意しましょう。ドメイン部分をCloudFrontのものにすればすぐに意図したCloudFront経由のMediaTailorによるプリロール広告動画が挿入されたライブ動画配信が視聴できるとは限りません。例えば、私はうっかり以下のURLを再生して、プリロール広告動画が再生されず少し考えてしまいました。

  • 誤ったCloudFrontを経由したMediaTailorによるプリロール広告動画ありのPlayback URLの例
    • https://d3dkxxxxxxxxxx.cloudfront.net/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index.m3u8

こちらはMediaPackageのHLS Endpoint URLのドメイン部分をCloudFrontドメインに変更したものです。本編となるライブ動画配信自体は視聴できますが、MediaTailorによる広告挿入はされません。パスが「/out/v1/*」であり、リクエストはMediaPackageで処理されるからですね。

CloudFrontを経由した配信の際のマニフェストファイルの中身などを確認

本エントリの目的であったCloudFrontを経由したMediaTailorによるプリロール広告動画ありのライブ配信が行えました。このライブ配信の際のHLSマニフェストファイルの中身も確認しておきましょう。きちんとCloudFront経由になっているかの確認にもなりますね。

まずはPlayback URLとなるトップレベルのマニフェストファイルを確認します。こちらはパス「/v1/*」に該当するので、MediaTailorOriginからの配信になります。

% curl -i https://d3dkxxxxxxxxxx.cloudfront.net/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/index.m3u8
HTTP/2 200
content-type: application/vnd.apple.mpegurl
content-length: 1038
date: Sat, 23 Oct 2021 11:44:01 GMT
x-amzn-requestid: 12391cac-1f4b-48e8-8769-d191b7f749c6
cache-control: max-age=1
vary: Accept-Encoding
x-cache: Miss from cloudfront
via: 1.1 248bbd11acf15e0f529dcc8095268bb2.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX56-C1
x-amz-cf-id: OV0VO7p2j3bDG4HESUcAGmkrf4ZdLURpyy9_juunMTTKTyDhkL8e9Q==

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:CODECS="avc1.640020,mp4a.40.2",AVERAGE-BANDWIDTH=5641370,RESOLUTION=1280x720,FRAME-RATE=59.94,BANDWIDTH=8908697
../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.64001F,mp4a.40.2",AVERAGE-BANDWIDTH=3441370,RESOLUTION=1280x720,FRAME-RATE=29.97,BANDWIDTH=5390457
../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/1.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D401F,mp4a.40.2",AVERAGE-BANDWIDTH=1791335,RESOLUTION=854x480,FRAME-RATE=29.97,BANDWIDTH=2751746
../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/2.m3u8
#EXT-X-STREAM-INF:CODECS="avc1.4D4015,mp4a.40.2",AVERAGE-BANDWIDTH=966318,RESOLUTION=426x240,FRAME-RATE=29.97,BANDWIDTH=1432393
../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/3.m3u8

いずれも相対パスであるため、CloudFront経由でのアクセスになりますね。パスも「/v1/*」になる(../で階層をさかのぼっても結局は「/v1/*です)ので、MediaTailorOriginからの配信です。続いて、各ビットレートごとのマニフェストファイルのうち、「0.m3u8」について確認してみます。

% curl -i https://d3dkxxxxxxxxxx.cloudfront.net/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0.m3u8
HTTP/2 200
content-type: application/vnd.apple.mpegurl
content-length: 926
date: Sat, 23 Oct 2021 11:44:12 GMT
x-amzn-requestid: b0f8e4c6-ebf8-4ebf-85c9-d6847b6e2b67
cache-control: max-age=1
x-cache: Miss from cloudfront
via: 1.1 38a6baaee5ff94d60b782fe54dc18d8e.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX56-C1
x-amz-cf-id: bLPaCC6CvFp4RZQg8s7lvOV6J-ZqC3_O9Pcdv2JFqhnLvBY191gYcQ==

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:656
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-DISCONTINUITY
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/656
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/657
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/658
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/659
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/660
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/661

こちらも相対パスですね。実際は「/v1/segment」というパスになるのでこちらもMediaTailorOriginです。これらのアクセス先のレスポンスについても確認してみます。

% curl -i https://d3dkxxxxxxxxxx.cloudfront.net/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/656
HTTP/2 301
content-type: application/json
content-length: 2
location: https://d3dkxxxxxxxxxx.cloudfront.net/tm/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/pysaxxxxxxxxxxxxxxxxxxxxxxxxxxxx/asset_720_8_3_00001.ts
date: Sat, 23 Oct 2021 11:44:20 GMT
x-amzn-requestid: f9759f98-5e55-4835-820c-ececb2244a2f
x-cache: Miss from cloudfront
via: 1.1 13dd11c364254e5e89dc6e87a6da4ca9.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX56-C1
x-amz-cf-id: uiNYeKhC1-VZPdftWKEh5fx3OGb7Pldgs0U9puZUVFuN4xTVzchJJg==

{}

実際に広告挿入される動画ファイル(tsファイル)へのリダイレクトとなりますが、リダイレクト先はCloudFrontのドメインになっています。リダイレクト先のtsファイルのヘッダ情報を確認してみますが、事前にアクセスしていたことから、Cacheが効いていることが確認できます。

% curl -I https://d3dkxxxxxxxxxx.cloudfront.net/tm/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/pysaxxxxxxxxxxxxxxxxxxxxxxxxxxxx/asset_720_8_3_00001.ts
HTTP/2 200
content-type: video/MP2T
content-length: 2742544
date: Sat, 23 Oct 2021 11:39:58 GMT
last-modified: Sat, 23 Oct 2021 09:24:59 GMT
etag: "2a48f961fe8608e807990ae11a104a08"
accept-ranges: bytes
server: AmazonS3
via: 1.1 d51ceda436f155dcdc6b24ba6dcf73cd.cloudfront.net (CloudFront), 1.1 2cde3e5bff3900c343ae0419d5ed64cc.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT57-C4
x-cache: Hit from cloudfront
x-amz-cf-pop: KIX56-C1
x-amz-cf-id: A7G2wo8da4nMqsHz8HDYGXKES_UGR_B0AVf_bHgYzsENOVCg8HyN_g==
age: 273

挿入される広告の動画ファイルが確認できました。もういちど「0.m3u8」ファイルを取得してみます。「segment」のパスで始まる広告動画のあとに、CloudFrontドメインの動画ファイルが確認できます。こちらはパス「/out/v1」ではじまっており、MediaPackageOriginからの配信になります、広告部分ではなく動画本編の配信に該当しますね。

% curl -i https://d3dkxxxxxxxxxx.cloudfront.net/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/../../../manifest/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0.m3u8
HTTP/2 200
content-type: application/vnd.apple.mpegurl
content-length: 1818
date: Sat, 23 Oct 2021 11:44:43 GMT
x-amzn-requestid: a3392e04-ade8-402b-882a-30c5179da62e
cache-control: max-age=1
vary: Accept-Encoding
x-cache: Miss from cloudfront
via: 1.1 ccb7f0ec3c365e8f802280fe0b825291.cloudfront.net (CloudFront)
x-amz-cf-pop: KIX56-C1
x-amz-cf-id: JRCEZBNE_PwbOK1OuRYgb-edJlIm__HxqVBmK3ooVO-Qe7nkonkmAg==

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:7
#EXT-X-MEDIA-SEQUENCE:656
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-DISCONTINUITY
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/656
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/657
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/658
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/659
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/660
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/661
#EXTINF:2.002,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/662
#EXTINF:1.001,
../../../../segment/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/d1edxxxx-4dxx-44xx-b9xx-e6e7xxxxxxxx/0/663
#EXT-X-DISCONTINUITY
#EXTINF:6.006,
https://d3dkxxxxxxxxxx.cloudfront.net/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_658.ts?m=1634897379
#EXTINF:6.006,
https://d3dkxxxxxxxxxx.cloudfront.net/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_659.ts?m=1634897379
#EXTINF:6.006,
https://d3dkxxxxxxxxxx.cloudfront.net/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_660.ts?m=1634897379
#EXTINF:6.006,
https://d3dkxxxxxxxxxx.cloudfront.net/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_661.ts?m=1634897379
#EXTINF:6.006,
https://d3dkxxxxxxxxxx.cloudfront.net/out/v1/cd5axxxxxxxxxxxxxxxxxxxxxxxxxxxe/index_1_662.ts?m=1634897379

補足: VideoJS HTTP StreamingのサイトでMediaTailorからの広告動画が意図した再生にならない?

本文中でも少し述べましたが、私がHLS動画の視聴確認によく使うサイトVideoJS HTTP Streamingで今回のMediaTailorによる広告挿入された動画を再生しようとしたところ、広告部分とライブ動画本編が交互に再生されたり、広告部分がきちんと終わらないままライブ動画本編が再生されたり、といった意図しない結果となりました。これはライブ動画のほか、VODでのMediaTailorを使った広告挿入でも同様の現象でした。

VideoJS HTTP StreamingではなくVideoJS HLSや、macOS SafariのネイティブHLS再生(動画Playerを使わずにURLにm3u8のアドレスを直接入力)などでは問題なく再生できること、また以下のようにVideoJS HTTP Streamingを使う場合でも、VideoJS HTTP Streamingのサイトではなく、独自にhtmlファイルとしてホストすると問題なく意図した再生ができました。以前VODでのMediaTailorを使った広告挿入を行ったときは問題なくVideoJS HTTP Streamingのサイトで再生ができていたのですが。なにか一時的なエラー、不具合などがVideoJS HTTP Streamingのサイト上では発生してしまっているのかな、などと考えています。

VideoJS HTTP Streaming (videojs-http-streaming/VHS)を使って独自にhtmlファイルとして動画Playerページをホストする方法は、以下のブログエントリを参考にしました。

実際に動作を確認したhtmlが以下となります。こちらもS3でホストして確認を行いました。

live-pre-roll-videojs.html

<html>
  <head>
    <title>VHS de HLS</title>
    <link href="https://vjs.zencdn.net/7.15.4/video-js.css" rel="stylesheet">
  </head>
  <body>
    <video-js id=example-video width=1280 height=720
              class="vjs-default-skin" controls>
      <source
         src="https://881fxxxxxxxxxxxxxxxxxxxxxxxxxxxx.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75e6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/live-pre-roll/index.m3u8"
         type="application/x-mpegURL">
    </video-js>
    <script src="https://vjs.zencdn.net/7.15.4/video.js"></script>
    <script>
      var player = videojs('example-video');
    </script>
  </body>
</html>

おまけ: 今回の構成でライブ配信をしていないときの挙動

今回の構成、ライブ配信部分についてはMediaLive + MediaPackageとなっています。この構成の場合、ライブ配信を行っていない状態(MediaLiveをStopしている状態)でMediaPackageのEndpoint URLにアクセスして動画を再生しようとすると、ライブ配信をしていた時点の動画が1分ほど?再生される具合です。MediaPackageがこの状態で、CloudFrontを経由したMediaTailorのEndpointにアクセスし、どのような動画が再生されるか確認してみました。

再生をはじめると、以下のように左上に「dfp video by Google」の「Liner Inline」という表示とともに、真ん中の数字(秒数)がカウントダウンされる動画がはじまります。この動画の終了後、ライブ配信の残骸が再生される具合です。先ほどのライブ配信のプリロール広告動画(海辺の映像)は再生されませんでした。

今回挿入された広告動画はMediaTailorのAd decision serverで設定した「pubads.g.doubleclick.net」ドメインによるものです。実際のライブ配信の際にはこちらは流れず、Live preroll ad decision serverの内容が流れていました。ライブ配信のエンドポイントが対象でも、MediaTailor側でマニフェストファイルの内容などから実際にライブ配信を行っている状態なのか否かを判別し、広告内容を切り替えているのかな、などと想像しています。

まとめ

AWS Elemental MediaTailorを使ってライブ動画配信の際にプリロール広告動画を挿入してみました。広告まわりを扱い際に必要となるAd decision serverやVastなどはサンプルを流用したり、静的なものだったりします。またあくまでAWSチュートリアルを参考にしながらの検証目的での再生にはとどまりますが、ライブ配信本編の前に広告を入れるというのは達成できたかなと思います。以前VODコンテンツに対するMediaTailorによる広告挿入を行った際は、広告動画は挿入できつつもシークバーで飛ばされてしまうかも(おそらく動画Player側で制御などが必要?)、などと思っていましたが、ライブ動画についてはシーク自体はできなさそうですね。(DVR、タイムシフト再生の場合はどうなるんだろう、、。)

以前行ったVODコンテンツに対してCloudFrontを経由したMediaTailorによる広告付き動画配信でもVODコンテンツのホスティングにMediaPackage(こちらはVOD Packaging)を使用していことから、同様のやり方でできるのかなとも考えていました。しかし実は、VODコンテンツの際にはいろいろと試行錯誤してあのやり方におさまったという背景がありました。(AWSチュートリアルではVODコンテンツをS3でホストしており、MediaPackageでのホスティングでパスの扱いに苦労した記憶があります。けっきょくCloudFront側でOrigin pathを使って「/out」を処理するとか。)今回、当初はVODコンテンツのやり方を踏襲してやろうと思っていたのですが、途中でAWSチュートリアルのライブ配信版(aws-media-services-simple-live-workflow / README.md at master・aws-samples / aws-media-services-simple-live-workflow・GitHub)を見つけ、こちらをベースに検証を進めていきました。(結果、非常にスムーズに検証が行えました。)