IMA SDK поддерживает предварительную загрузку видеорекламы. Вы можете включить эту функцию в интеграции SDK, чтобы обеспечить более плавный переход между рекламой и контентом. В этом руководстве рассматриваются технические детали реализации предварительной загрузки медиаконтента с помощью IMA SDK.
Предпосылки
Для предварительной загрузки требуется версия IMA Android SDK 3.17.0 или выше.
Включить предварительную загрузку
Чтобы включить предварительную загрузку, используйтеAdsRenderingSettings.setEnablePreloading()
чтобы установить значение preloading в true. Это необходимо сделать в обратном вызове onAdsManagerLoaded()
:@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
...
AdsRenderingSettings adsRenderingSettings =
ImaSdkFactory.getInstance().createAdsRenderingSettings();
adsRenderingSettings.setEnablePreloading(true);
mAdsManager.init(adsRenderingSettings);
}
Поддержка предварительной загрузки с помощью пользовательского VideoAdPlayer
Мы рекомендуем расширение ExoPlayer-IMA , используемое в примере приложения ExoPlayer для Android . После интеграции расширения ExoPlayer-IMA предварительная загрузка включена по умолчанию и включает встроенную поддержку.
Если вы реализуете предварительную загрузку без расширения ExoPlayer-IMA, после вызова setEnablePreloading()
потребуются дополнительные изменения. Чтобы видеоплеер поддерживал предварительную загрузку рекламы, он должен отслеживать объекты AdMediaInfo
, передаваемые в вызовах loadAd()
и playAd()
, и включать корректный AdMediaInfo
в вызовы AdPlayerCallback
. Для этого может потребоваться структура данных для управления объектами 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/Ad) | AdsManager.init() | AdsManager.init() |
Загрузка в середине или конце ролика | Для первого рекламного ролика в рекламной паузе — за 8 секунд до начала. Для последующих рекламных роликов — с началом воспроизведения предыдущего. | В момент начала показа рекламы. |
Часто задаваемые вопросы
- Загружает ли предварительная загрузка медиафайлов весь креатив?
- Нет, обычно креатив загружается не полностью при начале воспроизведения рекламы. Предварительная загрузка предназначена для улучшения пользовательского опыта за счёт минимизации времени загрузки рекламы. Она не предназначена для поддержки показа рекламы офлайн.
- Нужно ли включать предварительную загрузку медиафайлов для VAST-объявления, а также для медиа-контента?
- Нет, SDK всегда предварительно загружает VAST объявления, независимо от настройки предварительной загрузки.