실시간 스트림 미리 가져오기

IMA SDK를 사용하면 실시간 스트림은 물론 VOD로 수익을 창출할 수 있습니다. 실시간 스트림의 경우 광고 시점마다 새로운 광고 요청을 해야 합니다. 모든 시청자가 동시에 광고를 요청하여 광고 서버에 혼선을 야기하지 않도록 시차를 두고 이러한 요청을 진행하세요.

이를 위해 IMA SDK에는 AdsRequest.liveStreamPrefetchSeconds 속성이 있습니다. 이 속성은 AdsLoader.requestAds()를 호출한 후 SDK가 광고 서버에 연결하기 전에 대기해야 하는 최대 시간(초)을 지정합니다. 실제 요청 시간은 무작위로 지정됩니다. 예를 들어 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);
}