Предварительная загрузка рекламных пауз в трансляциях

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

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

Для этого в IMA SDK есть свойство AdsRequest.liveStreamPrefetchSeconds. Это свойство определяет максимальное количество секунд, в течение которых SDK должен ждать, прежде чем обратиться к серверу объявлений после вызова AdsLoader.requestAds(). Фактическое время запроса будет выбрано случайным образом. Например, если вы зададите для параметра AdsRequest.liveStreamPrefetchSeconds значение 30, SDK будет ждать от 0 до 30 секунд после вызова функции AdsLoader.requestAds(), прежде чем отправить запрос на сервер.

Пример упреждающего запроса для прямой трансляции

Мы рекомендуем выполнять упреждающий запрос следующей рекламной паузы сразу после завершения текущей. Это позволит максимально увеличить время, доступное для окна упреждающего запроса. Предположим, что между рекламными паузами проходит пять минут. Когда рекламная пауза завершится, вы можете запросить следующую рекламную паузу с окном упреждающего запроса в 290 секунд (5 минут минус 10 секунд, чтобы запросы, отправленные в конце окна упреждающего запроса, успели обработаться):

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

VideoPlayerController.java

/** Ads logic for handling the IMA SDK integration code and events. */
public class VideoPlayerController {

  // 5 minutes == 300 seconds. Include a 10 second buffer
  private float AD_INTERVAL = 290;
  private double AD_TIMEOUT = 300;

...

  adsManager.addAdEventListener(
    new AdEvent.AdEventListener() {
      /** Responds to AdEvents. */
      @Override
      public void onAdEvent(AdEvent adEvent) {

      ...

      case ALL_ADS_COMPLETED:
        if (adsManager != null) {
          adsManager.destroy();
          adsManager = null;
        }

        // When pre-fetching for live streams, be sure to destroy the current AdsManager,
        // in case the tag you requested previously contains post-rolls
        // (you don't want to play those now).

        // Pre-fetch the next ad break.
        // Play those ads in ~5 minutes. In a real-world implementation,
        // this will likely be done as the result of a message from your
        // streaming server, not a through the playAdsAfterThisTime parameter
        // of requestAndPlayAds().
        requestAndPlayAds(AD_TIMEOUT);
        break;
      default:
        break;
      }
  }

...

public void requestAndPlayAds(double playAdsAfterThisTime) {
  if (currentAdTagUrl == null || currentAdTagUrl == "") {
    log("No VAST ad tag URL specified");
    resumeContent();
    return;
  }

  // Since you're switching to a new video, tell the SDK the previous video is finished.
  if (adsManager != null) {
    adsManager.destroy();
  }

  playButton.setVisibility(View.GONE);

  // Create the ads request.
  AdsRequest request = sdkFactory.createAdsRequest();
  request.setAdTagUrl(currentAdTagUrl);
  request.setContentProgressProvider(videoPlayerWithAdPlayback.getContentProgressProvider());
  request.setLiveStreamPrefetchSeconds(AD_INTERVAL);

  playAdsAfterTime = playAdsAfterThisTime;

  // Request the ad. After the ad is loaded, onAdsManagerLoaded() will be called.
  adsLoader.requestAds(request);
}