AWS Elemental MediaTailorで事前にトランスコードされた広告動画の挿入をサポートしました [Bring-Your-Own-Ads]

AWS Elemental MediaTailorで事前にトランスコードされた広告動画の挿入をサポートしました [Bring-Your-Own-Ads]

Clock Icon2025.03.31

はじめに

清水です。AWSのリニアチャネルアセンブリとパーソナライズされた広告挿入サービスであるAWS Elemental MediaTailorのAd insertion(広告挿入)機能で、事前にトランスコードされた広告動画が利用可能になるアップデートがありました。2025/01/30付けでWhat's New at AWSにポストされています。

Bring-Your-Own-Ads (BYOA)と称されるこの機能を使うことで、VASTレスポンスを使用した広告挿入を行う際、あらかじめHLSやDASH形式にトランスコードした広告動画を利用できるようになります。MediaTailor Ad insertionの機能として、ADサーバのレスポンスに記載されているMP4形式の広告動画を動的にトランスコードします。そしてHLSやDASH形式の広告動画がが準備され、本編動画の配信形式と同様の形式で広告として挿入することが特徴でした。この動的なトランスコード自体は便利な機能ではあるのですが、場合によっては動的なトランスコードに時間がかかり、一部の(トランスコード中に広告を再生しようとした)視聴者には広告が挿入されない、といったことがありました。

今回のアップデート内容、BYOAではあらかじめ広告用の動画はHLSないしDASH形式に変換、事前のトランスコードをしておきます。VASTレスポンスには変換後のURL(例えばHLSならm3u8のマニフェストファイル)が記載されることとなり、これをMediaTailorが広告挿入後のマニフェストとして提供することで、事前トランスコード済みの広告動画が再生されるというわけです。これで、トランスコード中なので広告が挿入されない、といった事象を回避できるわけですね。

本エントリでは、実際のこのMediaTailor Ad insertionのBYOA機能を試してみたのでまとめてみたいと思います。VOD動画へのプリロール(preroll)広告挿入というかたちで検証を行いました。ADサーバはS3に配置したXMLファイルで静的なVASTレスポンスを行うことで実現しています。事前にトランスコードした広告動画はHLS形式のみを準備しました。また本番環境ではCloudFrontなどCDN連携が必須ですが、今回はあくまで動作検証ということでMediaTailor単体での確認のみ行っています。

なお、検証に使用する動画コンテンツやホスティングもととなるS3などは以下ブログエントリで用いたものを流用しています。適宜、本ブログエントリ内で「以前のブログエントリ」というかたちで出現しています。あわせてご確認ください。

MediaTailor Ad insertionでBYOAするための広告動画を準備

さっそくMediaTailorのBYOA機能の設定などを確認したいところですが、まずはBYOAするための広告動画などの準備からはじめます。冒頭で述べた通り、BYOAのために事前に挿入する広告動画をトランスコードする必要があります。

AWS Elemental MediaTailor User Guideの以下ページを参照しながら進めていきます。

VOD動画コンテンツやMP4広告動画の確認

広告挿入の対象となるVOD動画コンテンツ、ならびに変換前の広告動画については、以前のブログエントリで準備したものをそのまま使用します。以下、確認としてまとめておきます。詳細は以前のブログエントリをご確認ください。

VOD動画コンテンツ用S3バケット(content-source-xxxxxxxx)にはHLS形式のVOD動画コンテンツを格納しています。東京リージョンのS3バケットを使用しており、パブリックアクセス可能な状態としています。またCORSについても設定済みです。以下の再生URLでVOD動画コンテンツが視聴可能な状況です。

  • VOD動画コンテンツ(ストリーム再生URL)
    • https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01.m3u8

変換前の広告用動画については、広告決定サーバ用S3バケット(ad-decision-xxxxxxxx)に格納しています。こちらのS3バケットについてもパブリックアクセス可能な状態です。CORSについては(現段階では)設定していませんが、後ほど設定を行います。以下のURLで広告動画にアクセス可能な状態です。

  • 広告用動画
    • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4

なお、xxxxxxxx部分は実際にはランダムな英数小文字を設定しています。

HLS形式の広告動画の準備

すでに作成済みのS3バケットやVOD動画コンテンツ、MP4広告動画について確認しました。続いて、MP4形式である広告動画をHLS形式に事前トランスコードします。

このMP4形式からHLS形式への変換についてはAWS Elemental MediaConvertを使用します。こちらは、以前のブログエントリの動画本編のコンテンツを準備した手順にならって作成していきます。以前のブログエントリ内、「準備」の「動画コンテンツの準備」をご確認ください。

以下、ポイントのみまとめます。System Templatesを複製して少し編集したCustom template、Custom-Ott_Hls_Ts_Avc_Aac_720p_360pの画面で(Create job)ボタンを押下、Jobを設定していきます。

by01

Inputsで入力ファイルとして、広告に用いるS3バケット内のMP4形式の動画を指定します。

by02

Output gruopsで出力先の設定も行います。今回は広告用となる動画コンテンツならびに静的VASTファイルを広告決定サーバ用S3バケットad-decision-xxxxxxxx)まとめていますので、HLS形式に変換した広告動画もこのS3バケットに出力するよう設定しました。以下のようにパス/ads/hls/を付与して指定します。

  • s3://ad-decision-xxxxxxxx/ads/hls/

by03

(なお後述しますが、この広告動画ホスティング先にはCORS設定が必要です。今回はS3バケットのCORS設定を行いました。例えば静的VASTファイルはCORS設定をせずにホスティングしたい、といった場合はS3バケットをわける、他のホスティング手法を用いるなどを検討しましょう。)

Job settings内のAWS integrationにあるIAMロールの設定を忘れずに行い、[Create]ボタンでJobを作成します。MediaConvertのJobがCompleteしたら、変換されたHLS形式の動画ファイルを確認しておきましょう。S3バケット内に以下のように作成されていますね。

by04

参照しているUser Guideの「Ad manifest requirements」の項目を満たしているかも確認しておきましょう。

親マニフェスト(parent manifest)が子マニフェスト(child manifests)と同じディレクトリにあること(サブディレクトリを用いる構成になっていないこと)を確認しておきます。また実際にマニフェストファイルを確認し、絶対URLではなく相対URLとなっていることも抑えておきましょう。

% curl https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls/ad-kichijoji-station-s1-15.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=1555033,AVERAGE-BANDWIDTH=1372426,CODECS="avc1.4d401f,mp4a.40.5",RESOLUTION=640x360,FRAME-RATE=29.970
ad-kichijoji-station-s1-15_360p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=6106560,AVERAGE-BANDWIDTH=5321019,CODECS="avc1.640028,mp4a.40.5",RESOLUTION=1280x720,FRAME-RATE=29.970
ad-kichijoji-station-s1-15_720p.m3u8

% curl https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls/ad-kichijoji-station-s1-15_360p.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:3,
ad-kichijoji-station-s1-15_360p_00001.ts
#EXTINF:3,
ad-kichijoji-station-s1-15_360p_00002.ts
#EXTINF:3,
ad-kichijoji-station-s1-15_360p_00003.ts
#EXTINF:3,
ad-kichijoji-station-s1-15_360p_00004.ts
#EXTINF:4,
ad-kichijoji-station-s1-15_360p_00005.ts
#EXT-X-ENDLIST

% curl https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls/ad-kichijoji-station-s1-15_720p.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:3,
ad-kichijoji-station-s1-15_720p_00001.ts
#EXTINF:3,
ad-kichijoji-station-s1-15_720p_00002.ts
#EXTINF:3,
ad-kichijoji-station-s1-15_720p_00003.ts
#EXTINF:3,
ad-kichijoji-station-s1-15_720p_00004.ts
#EXTINF:4,
ad-kichijoji-station-s1-15_720p_00005.ts
#EXT-X-ENDLIST

HLS広告動画用static VASTの準備

続いてMediaConvertで変換したHLS形式の広告動画を指定するstatic VASTを準備します。こちらもMediaTailor User Guideを参考に進めていきます。

以前のブログエントリで作成したstatic VASTstatic-vast-demo.xmlをベースにします。以下の内容でした。

static-vast-demo.xml
<VAST version="3.0">
  <Ad>
    <InLine>
      <AdSystem>2.0</AdSystem>
      <AdTitle>ad-1</AdTitle>
      <Impression/>
      <Creatives>
        <Creative>
          <Linear>
            <Duration>00:00:15</Duration>
            <MediaFiles>
              <MediaFile delivery="progressive" type="video/mp4" width="1280" height="720">
                <![CDATA[https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/ad-kichijoji-station-s1-15.mp4]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

Preconditioned ads requirements」の「MediaFiles requirements」、「Example VAST response」を参考にします。例には1つのVAST内にMP4、DASH、そしてHLSの3種合計4つが列挙されていますが、今回は動作検証としてHLS1つのみを記載することとします。

MediaFile要素のdelivery属性にはstreamingを、またtype属性にはapplication/x-mpegURLを指定します。CDATAにはHLSの親マニフェストへのURLを記載します。width属性やheight属性、bitrate属性についてはABR設定で一意に定まらないので、空欄で動作を確認してみます。以下のようなVASTとなります。ファイル名はhls-only-static-vast-demo.xmlとしました。

hls-only-static-vast-demo.xml
<VAST version="3.0">
  <Ad>
    <InLine>
      <AdSystem>2.0</AdSystem>
      <AdTitle>ad-1</AdTitle>
      <Impression/>
      <Creatives>
        <Creative>
          <Linear>
            <Duration>00:00:15</Duration>
            <MediaFiles>
              <MediaFile delivery="streaming" type="application/x-mpegURL" >
                <![CDATA[https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls/ad-kichijoji-station-s1-15.m3u8]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

広告決定サーバ用S3バケットのパス/ads配下にアップロード、以下のURLでアクセスできることを確認しておきます。

  • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls-only-static-vast-demo.xml
% curl -i https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls-only-static-vast-demo.xml
HTTP/1.1 200 OK
x-amz-id-2: tlxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxteu9s=
x-amz-request-id: KBxxxxxxxxxxxx4T
Date: Mon, 31 Mar 2025 10:29:07 GMT
Last-Modified: Mon, 31 Mar 2025 10:28:46 GMT
ETag: "53xxxxxxxxxxxxxxxxxxxxxxxx528c5b"
x-amz-server-side-encryption: AES256
Accept-Ranges: bytes
Content-Type: text/xml
Content-Length: 593
Server: AmazonS3

<VAST version="3.0">
  <Ad>
    <InLine>
      <AdSystem>2.0</AdSystem>
      <AdTitle>ad-1</AdTitle>
      <Impression/>
      <Creatives>
        <Creative>
          <Linear>
            <Duration>00:00:15</Duration>
            <MediaFiles>
              <MediaFile delivery="streaming" type="application/x-mpegURL" >
                <![CDATA[https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls/ad-kichijoji-station-s1-15.m3u8]]>
              </MediaFile>
            </MediaFiles>
          </Linear>
        </Creative>
      </Creatives>
    </InLine>
  </Ad>
</VAST>

広告決定サーバ用S3バケットにCORSを設定

以前のブログエントリで動画コンテンツ用S3バケット(content-source-xxxxxxxx)ならびに広告決定サーバ用S3バケット(ad-decision-xxxxxxxx)を作成した際、動画コンテンツ用S3バケットにはCORSを設定していました。広告決定サーバ用S3バケットからはHLS形式の配信はなく、CORS設定が不要だったためですね。

今回は広告決定サーバ用S3バケットから広告動画となるHLS形式の動画ファイルを配信するかたちです。MediaTailor User Guideには記載がありませんでしたが、動作検証を行った結果、このHLS形式の広告動画を配信するS3バケットにはCORS設定が必要でした。

広告決定サーバ用S3バケットad-decision-xxxxxxxxにCORSの設定を実施しておきます。

マネジメントコンソールからのS3バケットの詳細ページに進み、PermissionsタブのCross-origin resource sharing (CORS)の項目を確認します。変更前は設定内、空欄の状態でした。

by08

以下のJSONの内容で設定します。(いったんはすべてのドメイン・Webサイト上の動画プレイヤーから動画の再生が可能になる設定としました。本番環境などで特定のドメインのみに限定する場合はAllowedOriginsの値を適切に指定しましょう。)

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

by09

準備完了

以上でMediaTailor Ad insertionでVOD動画にpreroll広告をBYOAで挿入する際の、動画コンテンツ、事前変換済みの広告動画、そして静的VASTの準備ができました。改めて準備した内容のURLを確認しておきます。

  • VOD動画コンテンツ(ストリーム再生URL)
    • https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01.m3u8
  • 事前にHLS形式に変換済みの広告用動画
    • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls/ad-kichijoji-station-s1-15.m3u8
  • 広告決定サーバ(static VAST)
    • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls-only-static-vast-demo.xml

MediaTailorリソースを作成してBYOAな広告動画挿入を確認

動画コンテンツや事前変換済みの広告動画、そして静的VASTの準備ができたので、続いてはいよいよBYOAなMediaTailorリソースを作成していきます。

BYOAを設定したConfigureの作成

MediaTailorのマネジメントコンソール、Ad insertionのConfigurations一覧画面から(Create configuration)ボタンで進みます。Required settingsの項目をまずは設定していきましょう。以下のように設定しました。

  • Name
    • precondition-ads-vod-preroll
  • Content source
    • https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com
  • Ad decision server
    • https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls-only-static-vast-demo.xml

by05

続いてAd conditioningの項目を展開します。Streaming media file conditioningの設定、デフォルトではTranscodeとなっていますが、これをNoneに変更します。

by06

以上で(Create configuration)ボタンを押下、Configurationリソースを作成します。(なお、今回はMediaTailor単体での動作検証のみ行うため、CDNまわりの設定は行いません。)

Configurationが作成できました。Playback endpoint prefixesで HLS playback prefixを確認しておきます。

by07

BYOAな広告動画の挿入を確認

Configurationが作成できたので、実際に広告付き動画の再生URLを参照して、BYOAな広告が挿入された動画を視聴してみます。

広告付き動画の再生URLの確認のため、まずはHLS playback prefixを参照します。

  • https://46xxxxxxxxxxxxxxxxxxxxxxxxxxxx53.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-vod-preroll/

これに続けて、VODコンテンツのパスを追加することで広告付き動画の再生URLとなりますね。VODコンテンツは動画コンテンツ用S3バケット(content-source-xxxxxxxx)内、/vod/content01.m3u8が親マニフェストになるよう設定していました。このパスを追加し、以下が最終的な広告付き動画の再生URLになります。

  • https://46xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx53.mediatailor.ap-northeast-1.amazonaws.com/v1/master/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-vod-preroll/vod/content01.m3u8

視聴確認はhls.js demoのサイトで行いました。URL欄に上記URLを入力して、[Apply]ボタンを押下します。

by10

まずはプレロールとなる広告動画(吉祥寺駅南口の映像)が流れ、続いて本編動画(桜の咲く井の頭公園の映像)が流れました。今回、
静的VASTレスポンス(hls-only-static-vast-demo.xml)には、事前変換済みのHLS形式のマニフェストURLしか記載
していませんので、BYOAな広告動画が再生できているということになります。

by11

by12

なお、事前トランスコードを行わない場合、初回アクセス時にはまだ広告動画のトランスコードが行われておらず、広告動画が挿入されない、というケースが発生しました。これは例えば、以前のブログエントリ執筆時にも発生していたことです。

今回、BYOAで事前にトランスコードを行った広告動画を使用した場合は、この現象は発生せず、初回アクセス時に広告動画が挿入されました。

変換済みの広告動画ホスティング先でもCORS設定が必要

動作検証の過程で、HLS形式に変換した広告動画を格納、ホスティングする広告決定サーバ用S3バケット(ad-decision-xxxxxxxx)にもCORSを設定しました

この広告動画ホスティング先のCORS設定ですが、検証当初、User Guideを確認した限りではパブリックアクセス可能である点のみの記載しか見つけられず、CORS設定は行わずに動作確認を進めていました。

しかし、実際にhls.js demoで視聴確認をしてみると、Playerに表示される総再生時間は本編+広告分の尺になっているにもかかわらず、広告動画が再生されない、という事象となりました。また、再生を試みると、いきなり16秒経過ぐらいのタイミングから再生がはじまる(広告動画の尺が15秒なので、そっくりとプリロール広告が省略されてしまう)という現象が起きました。

hls.js demoページの動画Player下部、Errorの項目を確認すると、何やらError while loading fragmentというエラーが出現しています。

またGoogle Chromeブラウザのデベロッパーツールで確認すると、見慣れた?Access-Control-Allow-Originがない、というCORSエラーが発生していることがわかります。(なかなか大量のエラーだったため、corsでフィルタを行いました。

by13

これらから変換済みの広告動画ホスティング先でもCORS設定が必要、ということに気がつくことができたのですが、この詳細についてアクセスするファイルから確認してみます。

子マニフェストファイルでは、以下のようにセグメントファイルにアクセスしていますね。

% curl https://1exxxxxxxxxxxxxxxxxxxxxxxxxxxx94.mediatailor.ap-northeast-1.amazonaws.com/v1/manifest/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-test-1/61xxxxxxxxxxxxxxxxxxxxxxxxxxxx8a7e89/1.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-DISCONTINUITY
#EXTINF:3.0,
../../../../segment/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-test-1/61xxxxxxxxxxxxxxxxxxxxxxxxxxxx8a7e89/1/0
#EXTINF:3.0,
../../../../segment/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-test-1/61xxxxxxxxxxxxxxxxxxxxxxxxxxxx8a7e89/1/1
#EXTINF:3.0,
../../../../segment/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-test-1/61xxxxxxxxxxxxxxxxxxxxxxxxxxxx8a7e89/1/2
#EXTINF:3.0,
../../../../segment/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-test-1/61xxxxxxxxxxxxxxxxxxxxxxxxxxxx8a7e89/1/3
#EXTINF:4.0,
../../../../segment/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-test-1/61xxxxxxxxxxxxxxxxxxxxxxxxxxxx8a7e89/1/4
#EXT-X-DISCONTINUITY
#EXTINF:3.0,
https://content-source-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/vod/content01_720p_00001.ts
<以下省略>

ここで、segmentのパスが含まれる各セグメントの詳細をみてみましょう。リダイレクトを用いて、VASTで設定されている広告動画のマニフェスト、HLSに変換済みの広告動画のホスティング先にアクセスしている、というかたちです。(なおこのsegmentのパスが含まれるURL、curl-Iオプションでアクセスを試みると404を返します。動作確認の際には注意したいポイントですね。)

% curl -i https://1exxxxxxxxxxxxxxxxxxxxxxxxxxxx94.mediatailor.ap-northeast-1.amazonaws.com/v1/segment/75xxxxxxxxxxxxxxxxxxxxxxxxxxxxa8e7e9c4bf/precondition-ads-test-1/61xxxxxxxxxxxxxxxxxxxxxxxxxxxx8a7e89/1/0
HTTP/2 301
date: Mon, 31 Mar 2025 09:49:05 GMT
content-type: application/json
content-length: 2
location: https://ad-decision-xxxxxxxx.s3.ap-northeast-1.amazonaws.com/ads/hls/ad-kichijoji-station-s1-15_720p_00001.ts
x-amzn-requestid: b7xxxxxxxxxxxxxxxxxxxxxxxxxxxx3d6232

{}

結果として動画Player側で、HLSのホスティング先にセグメントファイルを取得するかたちになるためCORS設定が必要となる、と理解しています。

まとめ

AWS Elemental MediaTailor Ad insertionのBring Your Own Ads (BYOA)機能を試してみました。以前検証したVOD動画に対するプリロール広告挿入をベースに、HLS形式で事前にトランスコードしたBYOAな広告動画を準備します。S3バケットでホスティングしているstatic VASTレスポンス用のXMLファイルにHLS形式に変換後の広告動画のマニフェストURLを記載します。MediaTailor側では、Configurationリソース作成時にAd conditioningの項目でタンスコードをしない設定を行います。広告動画のホスティング先でCORS設定が必要となる点にも注意しましょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.