どうも動画といえば僕です。Rhiannonです。
前回、前々回と動画ファイル自体についての記事を書きましたが、今回はVMAPについて解説しようと思います。
VMAPって聞いた事あるけど仕様書が英語だし読むの大変だと思っていた方の理解の一助になれば幸いです。
VMAPとはなんぞや?
VMAPとはVideo Multiple Ad Playlistの略で、IABが規定したXMLフォーマットです。
どんなことができる仕組みなのかざっくり言うと、
コンテンツホルダーが「動画のこの位置にこの広告入れるぞ!」と決められる仕組み
です。
動画ホルダーがプレイヤーをコントロールできるとは限りません。 (シンジケーションしていたり、いろんなプレイヤーに配信していて設定が大変だったり・・・)
そうなると、コンテンツホルダーからすると、意図しない位置に広告が設定されてしまうといった可能性があります。 そういったことがないようにコンテンツホルダーが広告配信についてもコントロールできるようにした仕組みがVMAPというわけです。
例えばテレビ番組配信の場合、VMAPに対応しているプレイヤーであれば地上波のCMと同じタイミングで広告を差し込めるよう、TV局側がアドサーバーで設定することができるようになります。
どんな時に使うのか?
動画コンテンツに広告を設定する際には以下の2つの作業が必要になります。
- 広告の構成を決定
- 配信する広告の決定
前者を担うのがVMAPで、広告を挿入するAd Break(広告が配信されるポイント)の数・位置・各Ad Breakに挿入される広告数などを規定します。
後者についてはVASTが担っていますが、VASTについての説明は他の記事をご参照ください。 【動画広告】VASTって何?
VMAPはあくまで、コンテンツに含まれる広告在庫の構成を規定しているものであって、それ単体で広告配信できる仕組みというわけではありません。(まさにプレイリストですね)
VMAPは以下のような場合に利用が推奨されます。
- アドサーバーがコンテンツの広告在庫を全てを持っている場合。
- アドサーバーがコンテンツの広告在庫の構成(Ad Breakの数や位置、各Ad Breakでの広告数や、広告主や第三者への割り当て)をコントロール出来る場合。
- アドサーバーがコンテンツの広告在庫の構成をコントロールできないが、在庫への広告配信の仕方(各Ad Breakでの広告数や、広告主や第三者への割り当て)を規定できる場合。
どんな仕様なのか?
VMAPは以下のような形式のXMLとなっています。
[xml] <vmap:VMAP xmlns:vmap="http://www.iab.net/videosuite/vmap" version="1.0"> <vmap:AdBreak> .... </vmap:AdBreak> </vmap:VMAP> [/xml]
<VMAP>にはバージョンを特定するための属性が含まれており、現在バージョンは1.0となっています。
以下より<VMAP>の中身について解説します。
<AdBreak>
[caption id="attachment_2854" align="aligncenter" width="300"] Ad Breakの例(YouTubeより)[/caption]
Ad Breakとは画像の例のように広告を挿入するポイントに相当するものです。
<VMAP>は0個以上の<AdBreak>という子要素を含んでおり、各<AdBreak>には複数の広告を含むことができます。
<AdBreak>には以下のような属性が含まれています。
timeOffset
Ad Breakのタイミングに相当する属性。指定は必須。
以下の4つの方法で表現される。
指定方法 | 説明 |
---|---|
time | hh:mm:ssもしくはhh:mm:ss:mmmで表記する。値はコンテンツの先頭からの時間を示す。 |
percentage | 0-100%で表記する。コンテンツ長が不明な場合に使用する。 |
start/end | startではプリロール、endではポストロールを指定することができる。 |
position | #1のように番号を表記する。ライブコンテンツなどに使用される。 |
breakType
広告がlinear・nonlinear・displayのいずれかであるかを特定する属性。指定は必須。
2つ以上のタイプを指定する場合は、コンマで区切る。(スペースは含めない)
breakId
Ad Breakを特定するための属性。オプションで指定可能。
repeatAfter
等間隔でAd Breakを配信するための属性。オプションで指定可能。
hh:mm:ssもしくはhh:mm:ss:mmmの形式で表記され、この値の時間が経過した際に、<AdBreak>を再生する。
また、<Ad Break>は以下の要素を持っています。
<AdSource>
Ad Breakで表示される広告を指定する。
インラインでレスポンスが記載されている(VMAP内に直接VASTレスポンスなどが記載されている)もしくは、他システムへの参照先が記載されている。
<TrackingEvents>
VMAP特有のイベントをトラッキングするためのURI
<Extensions>
VMAPでサポートされていない情報を送る事ができる。
<AdSource>
各 <AdBreak>は0 or1つの<AdSource>を持っており、次のような属性が含まれます。
id
<AdSource>の識別するための属性。オプションで指定可能。
allowMultipleAds
VASTのAd Podのような複数広告をAd Break中で配信することを許容するかをtrue/falseで指定する属性。オプションで指定可能。特に指定がなかった場合、プレイヤーは複数広告の配信を許容する。
非VASTのAd Podであった場合、プレイヤーは配信を無視することができる。
followRedirects
広告レスポンスでリダイレクトを許容するかをtrue/falseで指定する属性。オプションで指定可能。特に指定がない場合、プレイヤーは許容するかを選択することができる。
[xml highlight="3"] <vmap:VMAP xmlns:vmap="http://www.iab.net/videosuite/vmap" version="1.0"> <vmap:AdBreak breakType="linear" timeOffset="start"> <vmap:AdSource allowMultipleAds="true" followRedirects="true"> .... </vmap:AdSource> <vmap:TrackingEvents> .... </vmap:TrackingEvents> </vmap:AdBreak> </vmap:VMAP> [/xml]
<AdSource>が存在する場合は、以下の要素によって広告のソースが指定されます。
<VASTAdData>
VMAPのレスポンス中にVAST広告のレスポンスが埋め込まれていることを示す。
VASTレスポンスはCDATAブロックを含まない形で含まれる。
<AdTagURI>
他システムの広告レスポンスを参照するURIを示す。
URIはCDATAブロックを含む必要がある。
<CustomAdData>
任意の文字列を非VAST広告レスポンスとして設定する。
文字列はCDATAブロックを含む必要がある。
プレイヤーがAdSourceへ設定されている広告レスポンスの形式を特定するため、<AdTagURI>と<CustomAdData>ではtemplateTypeが利用されます。
templateTypeでは
- vast
- vast1
- vast2
- vast3
- その他(独自のテンプレート)
のいずれかを指定します。
<TrackingEvents>
<AdBreak>内には<TrackingEvents>があり、Ad Breakのstartとend及び、Ad Break内で発生したエラーのトラッキングに利用されます。
<TrackingEvents>にはVMAPで利用される次の3つのイベントのトラッキングURIが含まれています。
- breakStart
- breakEnd
- error
トラッキングイベントは以下のように<Tracking>内のevent属性によって指定されます。
[xml highlight="2"] <vmap:TrackingEvents> <vmap:Tracking event="breakStart"> <![CDATA[ http://adserver.com/breakstart.gif ]> </vmap:Tracking> </vmap:TrackingEvents> [/xml]
再生中に該当のイベントが発生した場合、プレイヤーは<Tracking>のトラッキングURIへリクエストを送る必要があります。
この際、複数の<Tracking>が同じイベントに含まれる場合は、全てのURIへとリクエストを送る必要があります。
また、Ad Breakにトラッキングイベントがあるのにもかかわらず、Ad Sourceが含まれていない場合、トラッキングイベントは有効のままとなり、該当のイベントが発生した際にリクエストを送ります。
XML構成まとめ
VMAPのXML構成は以下のようになります。
親要素 | 子要素 | 孫要素 | 属性 | 値 | 必要性 | 説明 |
---|---|---|---|---|---|---|
AdBreak | 必須 | 広告の挿入ポイント | ||||
timeOffset | String | 必須 | AdBreakの再生タイミング | |||
breakType | String | 必須 | 表示する広告のタイプ | |||
breakId | String | オプション | AdBreakのID | |||
AdSource | ない場合もある | 配信する広告のソース | ||||
id | オプション | AdSourceのID | ||||
allowMultipleAds | true/false | オプション | 複数広告を許容するかどうか | |||
followRedirects | true/false | オプション | リダイレクトを許容するかどうか | |||
VASTAdData | VAST3.0ドキュメント | オプション | VAST3.0広告のレスポンス。CDATAは含まずない | |||
CustomAdData | String | オプション | 非VAST3.0広告のレスポンス。CDATA内に記述 | |||
templateType | 必須 | vast1/vast2/任意からレスポンスの形式を記載 | ||||
AdTagURI | URI | オプション | 広告のURI | |||
templateType | 必須 | vast1/vast2/任意からレスポンスの形式を記載 | ||||
Tracking Events | ない場合もある | |||||
Tracking | URI | オプション | トラッキングURI | |||
Event | 必須 | breakStart/breakEnd/errorが指定される | ||||
Extensions | オプション | |||||
Extension | オプション | VMAPでサポートされていない情報 | ||||
type | String | 必須 | Extensionの形式。URIが推奨。 | |||
Extensions | オプション | |||||
Extension | オプション | VMAPでサポートされていない情報 | ||||
type | String | 必須 | Extensionの形式。URIが推奨。 |
必須とされている項目が少ないため、アドサーバー側は最小のものを備えてVMAPの配信を始められます。一方VMAPを解釈するプレイヤーとしては、オプションへの対応や、含まれない場合のある要素への対応の必要がありますね。
エラー処理
エラーイベントはエラーが起きた時に必ず呼ぶもので、VMAPでは2つのカテゴリーに分けられます。
VMAP実行エラー
レスポンスペイロードの取得やセカンダリアドサーバーの呼び出しやVMAPのパースと言ったVMAPの実行中に起きたエラー
広告レスポンス実行エラー
個々の広告レスポンスが実行されている際に発生したエラー
どちらのタイプのエラーが発生しても、実行されている<AdBreak>に紐づくエラートラッキングイベントが呼ばれます。
プレイヤーでマクロが提供されているのであれば、プレイヤーは適切なエラーコードとエラーメッセージへと変換を行い、プレイヤーが独自で実装しているエラーメッセージや、特殊文字は適切に%エンコードされなくてはなりません。
VAST広告の広告レスポンス実行エラーについては、プレイヤーがVASTのものと同様のエラーコードをレポートし、非VAST広告の実行エラーの場合はプレイヤーが非VAST広告独自のエラーコードもしくは、900(Undifined error)をレポートします。
広告レスポンス実行エラーが発生した場合、プレイヤーはできるだけ多くのレスポンスを実行するべきです。
例えば、Ad Podの広告の1つで再生を妨げるようなエラーが発生した場合、プレイヤーはPod全体の広告表示を中止するよりも、次の広告へと進むよう試みるべきである。
以下はエラーコードの一覧表です。プレイヤーは以下より該当するものを選択します。
エラーコード | 詳細 |
---|---|
900 | Undifined error |
1000 | VMAP schema error |
1001 | VMAP version of response not supported |
1002 | VMAP parsing error |
1003 | AdBlock type not supported |
1004 | General ad response dosument error |
1005 | Ad response template type not supported |
1006 | Ad response document extraction or parsing error |
1007 | Ad response document retrieval timeout |
1008 | Ad response document retrieval error(e.g., HTTP server responded with error code) |
No Ad Breakのレスポンス
Ad BreakのないVMAPレスポンスは、ルートとなるVMAP要素のみをレスポンスに含みます。
[xml] <vmap:VMAP xmlns:vmap="http://www.iab.net/videosuite/vmap" version="1.0"> .... </vmap:VMAP> [/xml]
Extensions
各<AdBreak>はオプションで<Extensions>を持つことができ、<Extensions>は任意のXMLデータをラップした<Extension>を持つことができます。
ただ、Extensionのサポートは必須ではないため、プレイヤーが解釈できない場合はExtensionについては無視されることもあります。
ソリューションの対応
アドサーバー
VMAP1.0の順守のため、アドサーバーとしては下記のようなことが必要となります。
- VMAP1.0の形式を遵守する
- VMAPのクロスオリジン対応(Access-Control-Allow-Originヘッダ対応など)
プレイヤー
VMAP1.0の順守のために、プレイヤーとしてはVMAPの仕様書で記載されていることに準拠し、合わせて次の例外と特記事項に対応する必要がある。
- プレイヤーはVAST3.0に準拠している必要があるが、その他のレスポンス形式をサポートしている必要はない。
- プレイヤーはVAST3.0のAd Podに準拠している必要がある。
- プレイヤーはできる限り3種のVMAPのAd Break(リニア、ノンリニア、ディスプレイ)とそれに合わせたVAST3.0フォーマットへの準拠をサポートしなくてはならない。ただ、プレイヤーの技術的要因でノンリニア広告がサポートできないような場合、ノンリニアのAd BreakをサポートしていないままでもプレイヤーはVMAPに準拠していると考える。
まとめ
少し構成がごちゃっとしましたが、VMAPについて仕様書になるべく沿う形で解説しました。
広告のコントロールをコンテンツホルダー側でできるという点に加え、コンテンツに対してVMAPを1つ設定するだけで済むのでプレイヤーでの設定の手間も減るかと思います。
また、VMAPはAd Podにも対応しているためAd Breakの中で複数の広告を配信する段積み配信や競合と同一のAd Break内では配信させないと言った競合排除もアドサーバーで制御可能になり、より広告の制御を緻密に行うことができます。
TVerやGYAO!のような広告モデルの動画配信やChromecast, FireTVなどの普及により、今後VMAPの需要はさらに高まっていくのではないでしょうか。