Предварительная загрузка носителя

IMA SDK поддерживает предварительную загрузку ресурсов видеорекламы. Вы можете включить эту функцию в своей интеграции SDK, чтобы обеспечить более плавный переход между рекламой и контентом. В этом руководстве рассматриваются технические детали реализации предварительной загрузки мультимедиа с помощью IMA SDK.

Предварительное условие

Для предварительной загрузки требуется версия 3.17.0 или более поздняя версия IMA Android SDK.

Включить предварительную загрузку

Чтобы включить предварительную загрузку, используйте 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 BasicExample . При интеграции расширение 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 пакета объявлений в середине ролика
  • Поиск второго мидролла после начала предварительной загрузки первого мидролла, но до его воспроизведения.
  • Воспроизведение послепрокрутки

Тайминг

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

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

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

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