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
...
}
}