広告の挿入

ExoPlayer は、クライアントサイドとサーバーサイドの両方の広告挿入に使用できます。

クライアントサイド広告挿入

クライアントサイドの広告挿入では、プレーヤーは、メディアの読み込みを コンテンツの再生と広告の遷移時に異なる URL を使用します。情報 XML、VAST、または VMAP 広告タグ。これには、動画の再生開始からの 実際の広告メディア URI とメタデータ(広告が スキップ可能

クライアントサイドの広告挿入に ExoPlayer の AdsMediaSource を使用する場合、プレーヤーは 再生する広告に関する情報を指定します。これには、さまざまなメリットがあります。

  • プレーヤーは、API を使用して広告に関連するメタデータと機能を公開できます。
  • ExoPlayer UI コンポーネントでは、自動的に広告の位置にマーカーを表示できます。 広告が再生中かどうかによって動作が変わります。
  • 内部的には、プレーヤーは次の遷移でも一貫したバッファを維持できる 広告とコンテンツが必要です。

この設定では、プレーヤーが広告とコンテンツの切り替えを行います。 アプリが複数の異なる Pod や IP アドレス 広告およびコンテンツのバックグラウンド/フォアグラウンド プレーヤー。

クライアントサイドの広告挿入で使用するコンテンツ動画と広告タグを準備する場合、 同期サンプル(キーフレーム)に配置することをおすすめします。 追加する必要があります。これにより、プレーヤーはコンテンツの再生をシームレスに再開できます。

宣言型広告のサポート

広告タグ URI は、MediaItem の作成時に指定できます。

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

広告タグを指定するメディア アイテムでプレーヤーのサポートを有効にするには、以下を行う必要があります。 で構成された DefaultMediaSourceFactory をビルドして挿入する プレーヤーの作成時に AdsLoader.ProviderAdViewProvider を追加します。

Kotlin

val mediaSourceFactory: MediaSource.Factory =
  DefaultMediaSourceFactory(context).setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

Java

MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

内部的には、DefaultMediaSourceFactory はコンテンツ メディアソースを AdsMediaSourceAdsMediaSource は、AdsLoaderAdsLoader.Provider を指定し、それを使用してメディア アイテムの広告で定義された広告を挿入します できます。

ExoPlayer の PlayerViewAdViewProvider を実装します。ExoPlayer IMA 以下で説明するように、使いやすい AdsLoader が用意されています。

広告を含むプレイリスト

複数のメディア アイテムを含むプレイリストを再生する場合、デフォルトの動作は メディア ID ごとに 1 回、広告タグをリクエストして広告の再生状態を保存する コンテンツ URI と広告タグ URI の組み合わせです。つまり、ユーザーには 異なるメディア ID またはコンテンツ URI を持つ広告を含むすべてのメディア アイテム。これには、 広告タグの URI が一致しますメディア アイテムが繰り返される場合、ユーザーには 対応する広告が 1 回だけ表示される(広告の再生状態には、広告が 最初の一致ではスキップされます)。

この動作は、不透明な広告 ID を渡すことでカスタマイズできます。 特定のメディア アイテムの広告再生状態を、オブジェクトに基づいて あります。以下の例では、広告の再生状態が広告タグにリンクされています。 メディア ID と広告タグ URI の組み合わせではなく、URI のみを使用します。 広告タグ URI が広告 ID として渡されます。広告が読み込まれると ユーザーが再生中、2 番目のアイテムには広告が表示されません。 最初から最後までお楽しみください。

Kotlin

// Build the media items, passing the same ads identifier for both items,
// which means they share ad playback state so ads play only once.
val firstItem =
  MediaItem.Builder()
    .setUri(firstVideoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
    .build()
val secondItem =
  MediaItem.Builder()
    .setUri(secondVideoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
    .build()
player.addMediaItem(firstItem)
player.addMediaItem(secondItem)

Java

// Build the media items, passing the same ads identifier for both items,
// which means they share ad playback state so ads play only once.
MediaItem firstItem =
    new MediaItem.Builder()
        .setUri(firstVideoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
        .build();
MediaItem secondItem =
    new MediaItem.Builder()
        .setUri(secondVideoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
        .build();
player.addMediaItem(firstItem);
player.addMediaItem(secondItem);

ExoPlayer IMA ライブラリ

ExoPlayer IMA ライブラリには ImaAdsLoader が用意されており、 クライアントサイドの広告挿入をアプリに統合できます。Kubernetes の機能をラップ クライアントサイド IMA SDK: VAST/VMAP 広告の挿入をサポート対象 バックグラウンド処理の方法など、ライブラリの使用方法の説明 再生を再開する方法については、README をご覧ください。

このデモ アプリケーションでは、IMA ライブラリを使用しており、いくつかのサンプルをご用意しています。 サンプルリストの VAST/VMAP 広告タグ。

UI に関する考慮事項

PlayerView は、広告の再生中はトランスポート コントロールを非表示にします。 デフォルトですが、アプリは次の呼び出しによって setControllerHideDuringAds。IMA SDK では、動画アセットの上に追加のビューが 広告の再生中のプレーヤー([詳細] リンクやスキップボタンなど) 。

IMA SDK は、アプリが提供したビューで広告が不明瞭になっているかどうかをレポートする場合があります。 プレーヤーの上にレンダリングされます。ビューをオーバーレイする必要があるアプリ: 再生を制御するための必須メソッドを IMA SDK に登録し、 視認性の計算から除外される場合があります。PlayerView を次の目的で使用する場合 そのコントロール オーバーレイが自動的に登録されます。AdViewProviderアプリ カスタム プレーヤー UI を使用するアプリは、オーバーレイ ビューを AdViewProvider.getAdOverlayInfos

オーバーレイ ビューの詳細については、このモジュールの IMA SDK の Open Measurement

コンパニオン広告

一部の広告タグには、「スロット」に表示可能な追加のコンパニオン広告が含まれています。で 表示されます。これらのスロットは ImaAdsLoader.Builder.setCompanionAdSlots(slots)。詳細については、次をご覧ください: コンパニオン広告を追加する

単独の広告

IMA SDK はメディア コンテンツに広告を挿入するためのものであり、再生用ではない 単体の広告も掲載できます単独の広告は再生できません。 ご覧ください代わりに Google Mobile Ads SDK を使用することをおすすめします。 おすすめします

第三者広告 SDK を使用する

サードパーティの広告 SDK を使用して広告を読み込む必要がある場合は、 ExoPlayer の統合がすでに提供されています。そうでない場合は、カスタムの 第三者広告 SDK をラップする AdsLoader を使用することをおすすめします。 これは、上記の AdsMediaSource のメリットをもたらすためです。 ImaAdsLoader は実装例として機能します。

または、ExoPlayer のプレイリスト サポートを使用してシーケンスを構築することもできます。 広告とコンテンツ クリップ:

Kotlin

// A pre-roll ad.
val preRollAd = MediaItem.fromUri(preRollAdUri)
// The start of the content.
val contentStart =
  MediaItem.Builder()
    .setUri(contentUri)
    .setClippingConfiguration(ClippingConfiguration.Builder().setEndPositionMs(120000).build())
    .build()
// A mid-roll ad.
val midRollAd = MediaItem.fromUri(midRollAdUri)
// The rest of the content
val contentEnd =
  MediaItem.Builder()
    .setUri(contentUri)
    .setClippingConfiguration(ClippingConfiguration.Builder().setStartPositionMs(120000).build())
    .build()

// Build the playlist.
player.addMediaItem(preRollAd)
player.addMediaItem(contentStart)
player.addMediaItem(midRollAd)
player.addMediaItem(contentEnd)

Java

// A pre-roll ad.
MediaItem preRollAd = MediaItem.fromUri(preRollAdUri);
// The start of the content.
MediaItem contentStart =
    new MediaItem.Builder()
        .setUri(contentUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder().setEndPositionMs(120_000).build())
        .build();
// A mid-roll ad.
MediaItem midRollAd = MediaItem.fromUri(midRollAdUri);
// The rest of the content
MediaItem contentEnd =
    new MediaItem.Builder()
        .setUri(contentUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder().setStartPositionMs(120_000).build())
        .build();

// Build the playlist.
player.addMediaItem(preRollAd);
player.addMediaItem(contentStart);
player.addMediaItem(midRollAd);
player.addMediaItem(contentEnd);

サーバーサイドの広告挿入

サーバーサイドの広告挿入(ダイナミック広告挿入(DAI)とも呼ばれます)では、 メディア ストリームには広告とコンテンツの両方が含まれます。DASH マニフェストでは両方を指定可能 コンテンツと広告セグメントを別々の期間に分けることもできます。HLS については、Apple の 再生リストへの広告の組み込みに関するドキュメントをご覧ください。

サーバーサイドの広告挿入を使用する場合、クライアント側でメディアの解決が必要になる場合がある 合成されたストリームを取得するために動的に URL を割り当てると、広告オーバーレイを表示する必要がある場合があります。 または、広告 SDK または広告サーバーにイベントを報告する必要がある場合があります。

ExoPlayer の DefaultMediaSourceFactory は、これらすべてのタスクを ssai:// スキームを使用した URI のサーバーサイドの広告挿入 MediaSource:

Kotlin

val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(
      DefaultMediaSourceFactory(context).setServerSideAdInsertionMediaSourceFactory(ssaiFactory)
    )
    .build()

Java

Player player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context)
                .setServerSideAdInsertionMediaSourceFactory(ssaiFactory))
        .build();

ExoPlayer IMA ライブラリ

ExoPlayer IMA ライブラリImaServerSideAdInsertionMediaSource を提供します。 これにより、IMA のサーバーサイドの挿入広告ストリームを 。この API は Android 向け IMA DAI SDK の機能をラップしており、 は、提供された広告メタデータをプレーヤーに統合します。たとえば、これにより Player.isPlayingAd() などのメソッドを使用し、コンテンツと広告の切り替えをリッスンします。 再生済みの広告のスキップなどの広告再生ロジックをプレーヤーが処理できるようにします。

このクラスを使用するには、 ImaServerSideAdInsertionMediaSource.AdsLoader および ImaServerSideAdInsertionMediaSource.Factory を実行し、プレーヤーに接続します。

Kotlin

// MediaSource.Factory to load the actual media stream.
val defaultMediaSourceFactory = DefaultMediaSourceFactory(context)
// AdsLoader that can be reused for multiple playbacks.
val adsLoader =
  ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(context, adViewProvider).build()
// MediaSource.Factory to create the ad sources for the current player.
val adsMediaSourceFactory =
  ImaServerSideAdInsertionMediaSource.Factory(adsLoader, defaultMediaSourceFactory)
// Configure DefaultMediaSourceFactory to create both IMA DAI sources and
// regular media sources. If you just play IMA DAI streams, you can also use
// adsMediaSourceFactory directly.
defaultMediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory)
// Set the MediaSource.Factory on the Player.
val player = ExoPlayer.Builder(context).setMediaSourceFactory(defaultMediaSourceFactory).build()
// Set the player on the AdsLoader
adsLoader.setPlayer(player)

Java

// MediaSource.Factory to load the actual media stream.
DefaultMediaSourceFactory defaultMediaSourceFactory = new DefaultMediaSourceFactory(context);
// AdsLoader that can be reused for multiple playbacks.
ImaServerSideAdInsertionMediaSource.AdsLoader adsLoader =
    new ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(context, adViewProvider).build();
// MediaSource.Factory to create the ad sources for the current player.
ImaServerSideAdInsertionMediaSource.Factory adsMediaSourceFactory =
    new ImaServerSideAdInsertionMediaSource.Factory(adsLoader, defaultMediaSourceFactory);
// Configure DefaultMediaSourceFactory to create both IMA DAI sources and
// regular media sources. If you just play IMA DAI streams, you can also use
// adsMediaSourceFactory directly.
defaultMediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory);
// Set the MediaSource.Factory on the Player.
Player player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(defaultMediaSourceFactory).build();
// Set the player on the AdsLoader
adsLoader.setPlayer(player);

URL を作成して、IMA アセットキー、またはコンテンツ ソース ID と動画 ID を読み込みます。 ImaServerSideAdInsertionUriBuilder の場合:

Kotlin

val ssaiUri =
  ImaServerSideAdInsertionUriBuilder()
    .setAssetKey(assetKey)
    .setFormat(C.CONTENT_TYPE_HLS)
    .build()
player.setMediaItem(MediaItem.fromUri(ssaiUri))

Java

Uri ssaiUri =
    new ImaServerSideAdInsertionUriBuilder()
        .setAssetKey(assetKey)
        .setFormat(C.CONTENT_TYPE_HLS)
        .build();
player.setMediaItem(MediaItem.fromUri(ssaiUri));

最後に、不要になった広告ローダを解除します。

Kotlin

adsLoader.release()

Java

adsLoader.release();

UI に関する考慮事項

クライアントサイドの広告挿入に関する UI の考慮事項が以下に適用されます。 サーバーサイドの広告挿入にも対応しています。

コンパニオン広告

一部の広告タグには、「スロット」に表示可能な追加のコンパニオン広告が含まれています。で 表示されます。これらのスロットは ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setCompanionAdSlots(slots)。 詳しくは、コンパニオン広告を追加するをご覧ください。

第三者広告 SDK を使用する

サードパーティの広告 SDK を使用して広告を読み込む必要がある場合は、 ExoPlayer の統合がすでに提供されています。そうでない場合は、 ssai:// スキームで URI を受け入れるカスタム MediaSource を提供する ImaServerSideAdInsertionMediaSource と同様です。

広告構造を作成する実際のロジックは、 目的 ServerSideAdInsertionMediaSource、ストリーム MediaSource をラップします。 広告を表す AdPlaybackState をユーザーが設定および更新できるようにします。 提供します。

多くの場合、サーバーサイドで挿入される広告ストリームには、プレーヤーに通知する時間指定イベントが含まれています。 広告メタデータについて詳しくは、サポートされている形式をご覧ください。 時間指定メタデータ形式が ExoPlayer でサポートされている。カスタム広告 SDK MediaSource 実装では、次のコマンドを使用して、プレーヤーからの時間指定されたメタデータ イベントをリッスンできます。 Player.Listener.onMetadata