Предзагрузка медиаконтента

Выберите платформу: HTML5 Android

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

Рекомендуем использовать расширение ExoPlayer-IMA, которое применяется в примере приложения Android ExoPlayer. В расширении 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.
}

Тестирование собственных реализаций предзагрузки

Если вы используете собственную реализацию предзагрузки, рекомендуем протестировать следующие пограничные случаи, чтобы убедиться, что все настроено правильно:

  • Одно объявление в начале ролика
  • Пакет из трех объявлений в начале ролика
  • Пакет из трех объявлений в середине ролика
  • Переход ко второму видеообъявлению в середине ролика после того, как первое начало предварительно загружаться, но до его воспроизведения
  • Воспроизведение видеорекламы в конце ролика

Время

В таблице ниже показано, как меняется время загрузки объявлений при включенной предзагрузке.

Событие С предварительной загрузкой Без предварительной загрузки
Запрошено объявление VAST AdsLoader.requestAds() AdsLoader.requestAds()
Загружено объявление в начале ролика (одно объявление) AdsManager.init() AdsManager.start()
Загрузка видеорекламы в начале ролика (VMAP/правила для объявлений) AdsManager.init() AdsManager.init()
Загрузка рекламы в середине или конце ролика Для первого объявления в рекламной паузе – за 8 секунд до времени начала показа. Для последовательных объявлений – когда начинается воспроизведение предыдущего объявления. В начале объявления

Часто задаваемые вопросы

Загружается ли креатив полностью при предварительной загрузке медиафайлов?
Нет, обычно креатив не загружается полностью к моменту начала воспроизведения объявления. Предзагрузка предназначена для улучшения удобства использования за счет минимизации времени загрузки объявления. Он не предназначен для показа объявлений в офлайн-режиме.
Нужно ли включать предварительную загрузку медиаконтента для VAST-объявления и медиафайлов?
Нет, SDK всегда предварительно загружает VAST-креатив объявления, независимо от этой настройки.