VMAPを使った動画コンテンツへの広告挿入方法


:::note warn
この記事は、[Supershipグループ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/supership)の7日目の記事になります。
:::


## はじめに
　こんにちは。プロダクト開発本部の中島です。私は新卒社員として入社し、配属され実務に入ってからの約5ヶ月、動画コンテンツ（媒体者が視聴者へ提供するエンターテインメント動画）の入稿管理システムの開発を行っています。その業務の中で学んだVMAPについて、この記事でまとめます。



## 動画コンテンツへの広告の挿入について
　現代の動画広告では、インストリーム広告(動画コンテンツ内広告)の挿入が一般的となっています。しかし、動画コンテンツの所有者が配信元を直接管理できない場合、意図したタイミングで広告を挿入することが困難です。この課題を解決するための広告挿入の標準規格として、VMAP（Video Multiple Ad Playlist）が策定されました。
　VMAPを利用することで、動画提供者はコンテンツ内で広告を挿入するポイントを定義でき、かつ種類や表示順まで詳細に管理できるようになります。


## VMAPとは？
　VMAP は、IAB（Interactive Advertising Bureau）が策定した広告管理のためのXMLベースの規格です。この規格は、複数の広告挿入ポイントやルールを記述するための標準フォーマットを提供し、広告管理を一元的に行えるよう設計されています。
 
## VMAPにできること
### 広告挿入ポイントの定義
　動画コンテンツ内で広告を挿入するタイミングを指定できます。これによって、テレビ放送と同じタイミングで、広告を流すことができます。指定できる箇所は以下の通りです。
- プレロール広告（動画開始前）
- ミッドロール広告（動画再生中の任意のタイミング）
- ポストロール広告（動画終了後）

### 動的な広告の配置
　動画コンテンツの種類や配信プラットフォームに応じて、適切な広告を動的に挿入する設定を記述できます。例えば以下のような広告の形式を選択することができます。
- リニア広告：動画コンテンツの中で全画面で再生される広告。広告再生中は動画コンテンツの再生は停止する
- ノンリニア広告：動画コンテンツの再生中にオーバーレイとして表示される広告。動画コンテンツの再生は停止されない
- ディスプレイ広告：動画プレイヤーの外部に表示される広告。動画コンテンツの再生は停止されない


## VMAPにできないこと
　VMAPは広告挿入の制御を行う規格であり、広告そのもの（クリエイティブデータやメディアファイル）を定義するものではありません。そのため、広告を再生するにはVASTなどの広告レスポンスをサポートする仕様との連携が必要となります。

### VASTとは？
　VAST（Video Ad Serving Template）は、広告の内容や形式を提供するためのフォーマットです。以下のようなデータを含みます。

- 動画広告のクリエイティブデータ（例: 動画ファイルのURL）
- 広告クリック時のリダイレクト先URL

> 補足情報
> VASTの詳細については、本記事では解説を省略します。より詳しく知りたい方は、[こちらの記事](https://qiita.com/miyay/items/b1ee6e01efc18afd7ff8)を参考にしてください。

## VMAPの基本構造

VMAPはXMLフォーマットで記述されており、以下のような基本要素で構成されています。
- AdBreak
    - 広告の挿入ポイントを定義します。
    - 主な属性
        - timeOffset：挿入のタイミングを定義(`start`,`end`,または`hh:mm:ss.mmm`で時間を指定)
        - breakType：広告の種類を定義 (`linear`,`display`など)
        - breakId：広告枠の一意の識別子
- AdSource
    - AdBreak内で使用される広告データを定義します。広告レスポンスや広告の参照元を記述します。
    - 主な属性
        - id：広告ソースの識別子
        - allowMultipleAds：１つのAdBreak内で複数の広告を許可するかを指定。よってBool値で定義
        - followRedirects：広告レスポンス内のリダイレクトをプレイヤーが追従するかどうかを指定。allowMultipleAdsと同じくBool値で定義
- AdTagURI
    - 広告レスポンスを提供するために外部広告サーバーへの参照をURI形式で定義する要素
    - 動画プレイヤーが広告を取得する際のエントリーポイントを提供
    - 主な属性
        - templateType
            - 広告レスポンステンプレートの形式を指定


以下は実際のVMAPの例となります。

```xml
<vmap:VMAP version="1.0" xmlns:vmap="http://www.iab.net/videosuite/vmap">
  <vmap:AdBreak timeOffset="start" breakType="linear" breakId="preroll">
    <vmap:AdSource id="preroll-ad" allowMultipleAds="true" followRedirects="true">
      <vmap:AdTagURI templateType="vast3"><![CDATA[ここで、広告レスポンスを参照するためのURIを記述]></vmap:AdTagURI>
    </vmap:AdSource>
  </vmap:AdBreak>
  <vmap:AdBreak timeOffset="00:16:32.000" breakType="linear" breakId="midroll-1">
    <vmap:AdSource id="midroll-1-ad" allowMultipleAds="true" followRedirects="true">
      <vmap:AdTagURI templateType="vast3"><![CDATA[ここで、広告レスポンスを参照するためのURIを記述]></vmap:AdTagURI>
    </vmap:AdSource>
  </vmap:AdBreak>
  <vmap:AdBreak timeOffset="00:28:11.000" breakType="linear" breakId="midroll-2">
    <vmap:AdSource id="midroll-2-ad" allowMultipleAds="true" followRedirects="true">
      <vmap:AdTagURI templateType="vast3"><![CDATA[ここで、広告レスポンスを参照するためのURIを記述]></vmap:AdTagURI>
    </vmap:AdSource>
  </vmap:AdBreak>
  <vmap:AdBreak timeOffset="end" breakType="linear" breakId="postroll">
    <vmap:AdSource id="postroll-ad" allowMultipleAds="true" followRedirects="true">
      <vmap:AdTagURI templateType="vast3"><![CDATA[ここで、広告レスポンスを参照するためのURIを記述]></vmap:AdTagURI>
    </vmap:AdSource>
  </vmap:AdBreak>
</vmap:VMAP>
```

　このVMAPではAdBreakが4つ記述されているため、4箇所の広告挿入ポイントがあります。timeOffsetが`start`となっている箇所は動画コンテンツの開始前に流れる広告で、`end`となっているのは動画コンテンツ終了後に流れる広告を指定しています。また、timeOffsetが`00:16:32.000`,`00:28:11.000`となっているものは、動画コンテンツが16分32秒と28分11秒のタイミングの広告挿入ポイントを定義しています。


## VMAPを用いた動画プレイヤーへの広告配信までの流れ


**1. 動画プレイヤーがVMAPリクエストを送信**
　動画プレイヤーは、広告サーバーにVMAPのリクエストを送信します。
　このリクエストには、広告を挿入する動画コンテンツの情報が含まれます。

**2. 広告サーバーがVMAPレスポンスを返却**
　広告サーバーは、VMAPを動画プレイヤーに返します。このVMAPは先ほど例を示したようなものとなっております。

**3. VMAPの解析**
　動画プレイヤーは、VMAPドキュメントを解析し、広告枠（AdBreak）と広告ソース（AdSource）を抽出します。
　これにより、広告挿入のタイミングとソースが特定されます。

**4. AdTagURIを参照してリクエストを送信**
　動画プレイヤーは、AdSource内に含まれるAdTagURIを使用して広告サーバーに広告取得リクエストを送信します。
　広告サーバーは、このリクエストに基づいてVASTのレスポンスを返します。

**5. VASTレスポンスの受信と広告の再生**
　動画プレイヤーは、VASTレスポンスを解析して広告を再生します。
　この広告は、リニア広告（動画全画面）、ノンリニア広告（バナーやオーバーレイ）、またはディスプレイ広告（動画プレイヤー外）として再生されます。


　先ほどVMAPの例として提示したものの場合だと、以下の図のようなフローになります。この図では、全て同じ広告サーバーにリクエストを投げていますが、別の広告サーバーから広告を取得することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924569/fb59e165-92f8-71c4-6269-3e8058fc3e72.png)




## 参考
[1] IAB Video Multiple Ad Playlist (VMAP) :https://iabtechlab.com/wp-content/uploads/2016/04/VMAP.pdf


## おわりに
　以上が動画コンテンツへの動画広告の挿入の仕組みとなります。
　VMAPによって、複数の広告挿入ポイントを一括で管理し、効率的な広告配信を実現できます。



:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::