メディアのプリロード

IMA SDK は、動画広告アセットのプリロードをサポートしています。 SDK 統合でこの機能を有効にすることで、広告とコンテンツ間をよりシームレスに移行できます。このガイドでは、IMA SDK を使ったメディア プリロードの実装に関する技術的な詳細について説明します。

前提条件

プリロードには、IMA Android SDK のバージョン 3.17.0 以降が必要です。

プリロードを有効にする

プリロードを有効にするには、AdsRenderingSettings.setEnablePreloading() を使用してプリロードを true に設定します。これは、onAdsManagerLoaded() コールバック内で行う必要があります。

@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
  ...
  AdsRenderingSettings adsRenderingSettings =
      ImaSdkFactory.getInstance().createAdsRenderingSettings();
  adsRenderingSettings.setEnablePreloading(true);
  mAdsManager.init(adsRenderingSettings);
}

カスタム VideoAdPlayer によるプリロードのサポート

Android BasicExample アプリで使用されている ExoPlayer-IMA 拡張機能をおすすめします。ExoPlayer-IMA 拡張機能を統合すると、プリロードがデフォルトで有効になり、組み込みのプリロード サポートが組み込まれます。

ExoPlayer-IMA 拡張機能を使用せずにプリロードを実装する場合は、setEnablePreloading() が呼び出された後に追加の変更が必要になります。動画プレーヤーで広告のプリロードをサポートするには、loadAd()playAd() からの呼び出しで渡される AdMediaInfo オブジェクトをトラッキングし、AdPlayerCallback の呼び出しに正しい AdMediaInfo を含める必要があります。前の AdMediaInfo が現在再生されている間に後続の AdMediaInfoloadAd() が発生する可能性があるため、AdMediaInfo オブジェクトを管理するためのデータ構造が必要になる場合があります。次の例は、アプリがプリロードをサポートするために行う必要がある変更の一部を示しています。

// enum for cases of PlayerState.
static enum PlayerState {
  IDLE,
  LOADED,
  PLAYING,
  PAUSED,
}

...

private final List<VideoAdPlayer.VideoAdPlayerCallback> callbacks;
private final ArrayList<AdMediaInfo> mediaInfos = new ArrayList<>();
private PlayerState playerState;
private boolean adCurrentlyLoaded;

...

@Override
public void playAd(AdMediaInfo adMediaInfo) {
  switch (playerState) {
    case LOADED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onPlay(adMediaInfo);
      }
      break;
    case PAUSED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onResume(adMediaInfo);
      }
      break;
    case PLAYING:
      // Intentionally and silently ignore since it is already playing from a prior media item,
      // note that onPlay is triggered by positionDiscontinuity.
      return;
    case IDLE:
      throw new IllegalStateException("Call to playAd when player state is not LOADED.");
  }
  playerState = PlayerState.PLAYING;
  player.setPlayWhenReady(true);
}

@Override
public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {
  if (adCurrentlyLoaded == true) {
    mediaInfos.add(adMediaInfo);
    return;
  }
  player.stop();
  player.seekTo(0);
  mediaInfos.clear();
  mediaInfos.add(adMediaInfo);
  player.setPlayWhenReady(false);
  player.loadMedia(adMediaInfo.getUrl());
  playerState = PlayerState.LOADED;
  adCurrentlyLoaded = true;
}

@Override
public void stopAd(AdMediaInfo adMediaInfo) {
  if (allAdsInBreakHavePlayed()) {
    if (isFinalAd(adMediaInfo)) {
      // handle clean up after all ads have played.
    } else {
      seekToNextItem(player);
    }
  } else {
    mediaInfos.remove(adMediaInfo);
  }
}

private boolean allAdsInBreakHavePlayed() {
  // Code to determine if all the ads in the current ad break have completed.
}

private boolean isFinalAd(AdMediaInfo adMediaInfo) {
  // Code to determine if this adMediaInfo is the final ad.
}

private void seekToNextItem(YourPlayerClass player) {
  // Code to seek your player to the next media item.
}

カスタム プリロードの実装のテスト

カスタム プリロードの実装では、次のエッジケースをテストして、正しいプリロードの設定を検証することをおすすめします。

  • 単一広告のプレロール
  • 3 連続配信広告のプレロール
  • 3 つの連続配信広告ミッドロール
  • 最初のミッドロールのプリロードが開始されてから再生が始まる前に、次のミッドロールまでシークする
  • ポストロール再生

タイミング

次の表は、プリロードが有効になっている場合に広告を読み込むタイミングの変更をまとめたものです。

イベント プリロードあり プリロードなし
リクエストされた広告 VAST AdsLoader.requestAds() AdsLoader.requestAds()
プレロールの読み込み(単一広告) AdsManager.init() AdsManager.start()
プレロールの読み込み(VMAP/広告ルール) AdsManager.init() AdsManager.init()
ミッドロールまたはポストロールの読み込み ミッドロール挿入点の最初の広告で、広告開始時間の 8 秒前。 連続する広告の場合、前の広告の再生が開始されたとき。 広告の開始時間。

よくある質問

メディアのプリロードでクリエイティブ全体が読み込まれますか?
いいえ。通常、広告の再生開始時にクリエイティブが完全には読み込まれません。 プリロードは、広告の読み込み時間を短縮することでユーザー エクスペリエンスを改善することを目的としています。オフラインでの広告配信は想定されていません。
広告の VAST とメディアで、メディアのプリロードを有効にする必要がありますか?
いいえ。このプリロード設定に関係なく、SDK は常に広告の VAST をプリロードします。