メディアをプリロードする
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
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
の loadAd()
が発生する可能性があるため、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 つの連続配信広告のミッドロール
- 最初のミッドロールがプリロードを開始してから再生されるまでの間に、2 つ目のミッドロールにシークする
- ポストロール再生
タイミング
次の表に、プリロードが有効な場合の広告読み込みタイミングの変更点をまとめます。
イベント |
プリロードあり |
プリロードなし |
リクエストされた広告の VAST |
AdsLoader.requestAds() |
AdsLoader.requestAds() |
プレロールが読み込まれた(1 つの広告) |
AdsManager.init() |
AdsManager.start() |
プレロールが読み込まれた(VMAP/広告ルール) |
AdsManager.init() |
AdsManager.init() |
ミッドロールまたはポストロールが読み込まれた |
広告ブレークの最初の広告の場合は、広告開始時間の 8 秒前です。
連続する広告の場合は、前の広告の再生が開始されたとき。 |
広告の開始時間。 |
よくある質問
- メディアのプリロードでクリエイティブ全体が読み込まれますか?
- いいえ。通常、広告の再生が開始された時点でクリエイティブは完全に読み込まれていません。プリロードは、広告の読み込み時間を最小限に抑えることでユーザー エクスペリエンスを向上させることを目的としています。オフライン広告配信をサポートするものではありません。
- 広告の VAST とメディアの両方でメディアのプリロードを有効にする必要がありますか?
- いいえ。このプリロード設定に関係なく、SDK は常に広告の VAST をプリロードします。
特に記載のない限り、このページのコンテンツはクリエイティブ・コモンズの表示 4.0 ライセンスにより使用許諾されます。コードサンプルは Apache 2.0 ライセンスにより使用許諾されます。詳しくは、Google Developers サイトのポリシーをご覧ください。Java は Oracle および関連会社の登録商標です。
最終更新日 2025-08-31 UTC。
[null,null,["最終更新日 2025-08-31 UTC。"],[[["\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."]]