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

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

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

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

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

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

Objective-C


- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event {

  ...

  switch (event.type) {

    ...

    case kIMAAdEvent_ALL_ADS_COMPLETED:

      IMAAdsRequest *request = [[IMAAdsRequest alloc]
             initWithAdTagUrl: self.adTagUrl
           adDisplayContainer: self.adDisplayContainer
         avPlayerVideoDisplay: self.avPlayerVideoDisplay
        pictureInPictureProxy: self.pictureInPictureProxy
                  userContext: nil];

      // set a delay between the end of the last ad
      // in the last request, and the first ad from
      // the new request
      Float64 adGap = 30;
      // make sure the request occurs at least five
      // seconds before starting the new set of ads
      request.liveStreamPrefetchSeconds = adGap - 5;
      [self.adsLoader requestAdsWithRequest:request];
      // start new ads after adGap seconds have elapsed
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, adGap * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [adsManager start];
      });

      break;

    ...

  }

  ...

}

Swift

func adsManager(_ adsManager: IMAAdsManager!, didReceive event: IMAAdEvent!) {
  switch event.type {

    ...

    case IMAAdEventType.ALL_ADS_COMPLETED:

      let request = IMAAdsRequest(
        adTagUrl: AdTagUrl,
        adDisplayContainer: adDisplayContainer,
        contentPlayhead: contentPlayhead,
        userContext: nil)

      // set a delay between the end of the last ad
      // in the last request, and the first ad from
      // the new request
      let adGap = 30
      // make sure the request occurs at least five
      // seconds before starting the new set of ads
      request.liveStreamPrefetchSeconds = adGap - 5
      adsLoader.requestAds(with: request)
      // start new ads after adGap seconds have elapsed
      DispatchQueue.main.asyncAfter(deadline: .now() + adGap) {
        adsManager.start()
      }

      break

    ...
  }
}