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() |
| プレロールの読み込み(単一広告) | AdsManager.init() |
AdsManager.start() |
| プレロールの読み込み(VMAP/広告ルール) | AdsManager.init() |
AdsManager.init() |
| ミッドロールまたはポストロールの読み込み | ミッドロール挿入点の最初の広告の場合、広告の開始時間の 8 秒前。連続する広告の場合、前の広告の再生が開始されたとき。 | 広告の開始時間。 |
よくある質問
- メディアのプリロードでクリエイティブ全体が読み込まれますか?
- いいえ。通常、広告の再生が開始されたときにクリエイティブが完全に読み込まれることはありません。 プリロードは、広告の読み込みにかかる時間を最小限に抑えることで、ユーザー エクスペリエンスを向上させることを目的としています。オフラインでの広告配信をサポートすることを目的としたものではありません。
- メディアのプリロードを有効にするには、広告の VAST とメディアの両方を有効にする必要がありますか?
- いいえ。このプリロード設定に関係なく、SDK は常に広告の VAST をプリロードします。