預先載入媒體

選取平台: HTML5 Android

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 ExoPlayer 範例應用程式中的 ExoPlayer-IMA 擴充功能。整合後,ExoPlayer-IMA 擴充功能會預設啟用預先載入功能,並內建預先載入支援。

如果您在沒有 ExoPlayer-IMA 擴充功能的情況下實作預先載入,則呼叫 setEnablePreloading() 後必須進行額外變更。如要讓影片播放器支援預先載入廣告,必須追蹤從 loadAd()playAd() 傳遞的呼叫中的 AdMediaInfo 物件,並在 AdPlayerCallback 呼叫中加入正確的 AdMediaInfo。這可能需要資料結構來管理 AdMediaInfo 物件,因為後續的 AdMediaInfo 可能會在先前的 AdMediaInfo 正在播放時發生。loadAd()以下範例說明應用程式支援預先載入功能時,可能需要進行的部分變更:

// 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()
已載入片中或片尾廣告 廣告插播中的第 1 則廣告:廣告開始時間前 8 秒。 如果是連續廣告,則為前一個廣告開始播放時。 在廣告開始時間。

常見問題

媒體預先載入功能是否會載入完整廣告素材?
否,廣告開始播放時,廣告素材通常尚未完全載入。 預先載入功能旨在縮短廣告載入時間,進而提升使用者體驗。這項功能並非用於支援離線放送廣告。
廣告的 VAST 和媒體是否都需要啟用媒體預先載入功能?
不會,無論預先載入設定為何,SDK 一律會預先載入廣告的 VAST。