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

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

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 объявления, независимо от настройки предварительной загрузки.