直播预提取

IMA SDK 可用于通过直播和视频点播创收。 对于直播,您需要为每个广告插播时间点发送新的广告请求。 错开这些请求,确保不会有观看者在请求 导致广告服务器出现卡顿。

为帮助解决这个问题,IMA SDK 提供了 AdsRequest.liveStreamPrefetchSeconds 属性。此属性用于指定 SDK 的秒数上限 在您调用 AdsLoader.requestAds()。实际请求时间将随机分配。对于 例如,如果您将 AdsRequest.liveStreamPrefetchSeconds 设置为 30,则 SDK 在您调用 AdsLoader.requestAds() 后,系统将等待 0 到 30 秒, 向服务器发出请求。

直播预提取功能的实际运用

我们建议您在广告插播结束后立即预提取下一个广告插播时间点。 这样可以确保预提取期限的最长时间。 假设广告插播时间点有 5 分钟。广告插播结束后 您可以请求下一个广告插播时间点,预提取时间范围为 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 via 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);
}