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

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

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

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

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

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

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

Время

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

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

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

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