IMA SDK 支援預先載入影片廣告素材資源。您可以在 SDK 整合中啟用此功能,讓廣告和內容之間更順暢。本指南將詳細介紹使用 IMA SDK 導入媒體預先載入的技術詳情。
修課條件
預先載入功能需要 3.17.0 以上版本的 IMA Android SDK。
啟用預先載入功能
如要啟用預先載入功能,請使用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
物件,因為針對後續的 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。