預先載入媒體
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
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
的 loadAd()
可能會在先前 AdMediaInfo
播放時發生,因此可能需要資料結構來管理 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() |
載入片中或片尾廣告 |
廣告插播中第 1 個廣告的廣告開始時間前 8 秒。
如果是連續廣告,則是在上一個廣告開始播放時。 |
廣告開始播放時。 |
常見問題
- 媒體預先載入功能是否會載入完整廣告素材?
- 否,廣告素材通常不會在廣告開始播放時就完全載入。預先載入功能旨在縮短廣告載入時間,進而改善使用者體驗。不支援離線廣告放送。
- 是否需要為廣告的 VAST 和媒體啟用媒體預先載入功能?
- 否,無論預先載入設定為何,SDK 一律會預先載入廣告的 VAST。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-08-31 (世界標準時間)。
[null,null,["上次更新時間:2025-08-31 (世界標準時間)。"],[[["\u003cp\u003eThe IMA SDK supports preloading video ad assets to create smoother transitions between ads and content, requiring version 3.17.0 or higher of the IMA Android SDK.\u003c/p\u003e\n"],["\u003cp\u003ePreloading is enabled using \u003ccode\u003eAdsRenderingSettings.setEnablePreloading(true)\u003c/code\u003e within the \u003ccode\u003eonAdsManagerLoaded()\u003c/code\u003e callback.\u003c/p\u003e\n"],["\u003cp\u003eWhile the ExoPlayer-IMA extension has built-in preloading, custom implementations require managing \u003ccode\u003eAdMediaInfo\u003c/code\u003e objects to ensure proper ad playback.\u003c/p\u003e\n"],["\u003cp\u003ePreloading primarily focuses on minimizing initial ad load times and does not guarantee full creative download or offline ad serving.\u003c/p\u003e\n"]]],[],null,["# Preload media\n\nThe IMA SDK supports preloading video ad assets.\nYou can enable this feature in your SDK integration\nto provide a more seamless transition between ads and content.\nThis guide goes over the technical details of implementing\nmedia preload with the IMA SDK.\n\nPrerequisite\n------------\n\nPreloading requires version 3.17.0 or higher of the IMA Android SDK.\n\nEnable preloading\n-----------------\n\nTo enable preloading, use [`AdsRenderingSettings.setEnablePreloading()`](/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/AdsRenderingSettings#setEnablePreloading(boolean)) to set preloading to true. This must be done within the `onAdsManagerLoaded()` callback:\n\n\u003cbr /\u003e\n\n @Override\n public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {\n ...\n AdsRenderingSettings adsRenderingSettings =\n ImaSdkFactory.getInstance().createAdsRenderingSettings();\n adsRenderingSettings.setEnablePreloading(true);\n mAdsManager.init(adsRenderingSettings);\n }\n\nSupporting preloading with a custom VideoAdPlayer\n-------------------------------------------------\n\nWe recommend the\n[ExoPlayer-IMA extension](//github.com/androidx/media/tree/release/libraries/exoplayer_ima)\nthat is used in the\n[Android ExoPlayer example app](//github.com/googleads/googleads-ima-android/tree/main/ExoPlayerExample).\nWhen integrated, the ExoPlayer-IMA extension has preloading enabled by default\nand includes built-in preloading support.\n\nIf you are implementing preloading without the ExoPlayer-IMA extension,\nadditional changes are required once `setEnablePreloading()` is called. In order\nfor a video player to support preloading ads, it must keep track of the\n`AdMediaInfo` objects which are passed in calls from `loadAd()` and `playAd()`,\nand include the correct `AdMediaInfo` on the `AdPlayerCallback` calls. This may\nrequire a data-structure to manage `AdMediaInfo` objects, given that `loadAd()`\nfor a subsequent `AdMediaInfo` may occur while a prior `AdMediaInfo` is\ncurrently playing back. The following example demonstrates some of the changes\nyou may need to make for your app to support preloading: \n\n // enum for cases of PlayerState.\n static enum PlayerState {\n IDLE,\n LOADED,\n PLAYING,\n PAUSED,\n }\n\n ...\n\n private final List\u003cVideoAdPlayer.VideoAdPlayerCallback\u003e callbacks;\n private final ArrayList\u003cAdMediaInfo\u003e mediaInfos = new ArrayList\u003c\u003e();\n private PlayerState playerState;\n private boolean adCurrentlyLoaded;\n\n ...\n\n @Override\n public void playAd(AdMediaInfo adMediaInfo) {\n switch (playerState) {\n case LOADED:\n for (VideoAdPlayerCallback callback : callbacks) {\n callback.onPlay(adMediaInfo);\n }\n break;\n case PAUSED:\n for (VideoAdPlayerCallback callback : callbacks) {\n callback.onResume(adMediaInfo);\n }\n break;\n case PLAYING:\n // Intentionally and silently ignore since it is already playing from a prior media item,\n // note that onPlay is triggered by positionDiscontinuity.\n return;\n case IDLE:\n throw new IllegalStateException(\"Call to playAd when player state is not LOADED.\");\n }\n playerState = PlayerState.PLAYING;\n player.setPlayWhenReady(true);\n }\n\n @Override\n public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {\n if (adCurrentlyLoaded == true) {\n mediaInfos.add(adMediaInfo);\n return;\n }\n player.stop();\n player.seekTo(0);\n mediaInfos.clear();\n mediaInfos.add(adMediaInfo);\n player.setPlayWhenReady(false);\n player.loadMedia(adMediaInfo.getUrl());\n playerState = PlayerState.LOADED;\n adCurrentlyLoaded = true;\n }\n\n @Override\n public void stopAd(AdMediaInfo adMediaInfo) {\n if (allAdsInBreakHavePlayed()) {\n if (isFinalAd(adMediaInfo)) {\n // handle clean up after all ads have played.\n } else {\n seekToNextItem(player);\n }\n } else {\n mediaInfos.remove(adMediaInfo);\n }\n }\n\n private boolean allAdsInBreakHavePlayed() {\n // Code to determine if all the ads in the current ad break have completed.\n }\n\n private boolean isFinalAd(AdMediaInfo adMediaInfo) {\n // Code to determine if this adMediaInfo is the final ad.\n }\n\n private void seekToNextItem(YourPlayerClass player) {\n // Code to seek your player to the next media item.\n }\n\n### Testing custom preloading implementations\n\nFor custom preloading implementations, testing the following edge-cases is\nrecommended to verify a correct preloading setup:\n\n- Single ad preroll\n- 3 ad pod preroll\n- 3 ad pod midroll\n- Seeking to a second midroll after the first midroll has begun preloading but before it has played\n- Postroll playback\n\nTiming\n------\n\nThe following table summarizes the changes in ad-load timing when preloading\nis enabled:\n\n| Event | With Preload | Without Preload |\n|---------------------------------|--------------------------------------------------------------------------------------------------------------------------|--------------------------|\n| Ad VAST requested | `AdsLoader.requestAds()` | `AdsLoader.requestAds()` |\n| Pre-roll loaded (single ad) | `AdsManager.init()` | `AdsManager.start()` |\n| Pre-roll loaded (VMAP/Ad rules) | `AdsManager.init()` | `AdsManager.init()` |\n| Mid-roll or post-roll loaded | For the 1st ad in an ad break, 8 seconds before ad start time. For consecutive ads, when the previous ad starts playing. | At ad start time. |\n\nFAQ\n---\n\nDoes media preloading load the full creative?\n: No, the creative is usually not fully loaded when ad playback begins.\n Preloading is intended for improving the user experience by minimizing the time\n it takes for the ad to load. It is not intended to support offline ad serving.\n\nDoes media preloading need to be enabled for the ad's VAST as well as media?\n: No, the SDK always preloads the ad's VAST, regardless of this preload\n setting."]]