미디어 미리 로드

IMA SDK는 동영상 광고 애셋 미리 로드를 지원합니다. SDK 통합에서 이 기능을 사용 설정하여 광고와 콘텐츠 간에 더 원활하게 전환할 수 있습니다. 이 가이드에서는 IMA SDK를 사용하여 미디어 미리 로드를 구현하는 기술을 자세히 설명합니다.

기본 요건

미리 로드하려면 IMA Android SDK 버전 3.17.0 이상이 필요합니다.

미리 로드 사용

미리 로드를 사용 설정하려면 AdsRenderingSettings.setEnablePreloading()를 사용하여 미리 로드를 true로 설정합니다. 이 작업은 onAdsManagerLoaded() 콜백 내에서 실행해야 합니다.

@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
  ...
  AdsRenderingSettings adsRenderingSettings =
      ImaSdkFactory.getInstance().createAdsRenderingSettings();
  adsRenderingSettings.setEnablePreloading(true);
  mAdsManager.init(adsRenderingSettings);
}

맞춤 VideoAdPlayer로 미리 로드 지원

Android BasicExample 앱에서 사용되는 ExoPlayer-IMA 확장 프로그램을 사용하는 것이 좋습니다. 통합되면 ExoPlayer-IMA 확장 프로그램에 미리 로드가 기본적으로 사용 설정되고 사전 로드 지원이 내장되어 있습니다.

ExoPlayer-IMA 확장 프로그램 없이 미리 로드를 구현하는 경우 setEnablePreloading()가 호출되면 추가로 변경해야 합니다. 동영상 플레이어가 광고 미리 로드를 지원하도록 하려면 loadAd()playAd()에서 호출로 전달된 AdMediaInfo 객체를 추적하고 AdPlayerCallback 호출에 올바른 AdMediaInfo를 포함해야 합니다. 이전 AdMediaInfo가 현재 재생되는 동안 후속 AdMediaInfoloadAd()가 발생할 수 있으므로 AdMediaInfo 객체를 관리하기 위한 데이터 구조가 필요할 수 있습니다. 다음 예는 앱에서 미리 로드를 지원하기 위해 적용해야 할 수 있는 몇 가지 변경사항을 보여줍니다.

// enum for cases of PlayerState.
static enum PlayerState {
  IDLE,
  LOADED,
  PLAYING,
  PAUSED,
}

...

private final List<VideoAdPlayer.VideoAdPlayerCallback> callbacks;
private final ArrayList<AdMediaInfo> mediaInfos = new ArrayList<>();
private PlayerState playerState;
private boolean adCurrentlyLoaded;

...

@Override
public void playAd(AdMediaInfo adMediaInfo) {
  switch (playerState) {
    case LOADED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onPlay(adMediaInfo);
      }
      break;
    case PAUSED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onResume(adMediaInfo);
      }
      break;
    case PLAYING:
      // Intentionally and silently ignore since it is already playing from a prior media item,
      // note that onPlay is triggered by positionDiscontinuity.
      return;
    case IDLE:
      throw new IllegalStateException("Call to playAd when player state is not LOADED.");
  }
  playerState = PlayerState.PLAYING;
  player.setPlayWhenReady(true);
}

@Override
public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {
  if (adCurrentlyLoaded == true) {
    mediaInfos.add(adMediaInfo);
    return;
  }
  player.stop();
  player.seekTo(0);
  mediaInfos.clear();
  mediaInfos.add(adMediaInfo);
  player.setPlayWhenReady(false);
  player.loadMedia(adMediaInfo.getUrl());
  playerState = PlayerState.LOADED;
  adCurrentlyLoaded = true;
}

@Override
public void stopAd(AdMediaInfo adMediaInfo) {
  if (allAdsInBreakHavePlayed()) {
    if (isFinalAd(adMediaInfo)) {
      // handle clean up after all ads have played.
    } else {
      seekToNextItem(player);
    }
  } else {
    mediaInfos.remove(adMediaInfo);
  }
}

private boolean allAdsInBreakHavePlayed() {
  // Code to determine if all the ads in the current ad break have completed.
}

private boolean isFinalAd(AdMediaInfo adMediaInfo) {
  // Code to determine if this adMediaInfo is the final ad.
}

private void seekToNextItem(YourPlayerClass player) {
  // Code to seek your player to the next media item.
}

맞춤 미리 로드 구현 테스트

맞춤 미리 로드 구현의 경우 다음과 같은 극단적인 사례를 테스트하여 올바른 미리 로드 설정을 확인하는 것이 좋습니다.

  • 단일 광고 프리롤
  • 광고 모음 프리롤 3개
  • 광고 모음 미드롤 3개
  • 첫 번째 미드롤이 미리 로드되기 시작한 후 재생되기 전에 두 번째 미드롤 탐색
  • 포스트롤 재생

시간

다음 표에는 미리 로드가 사용 설정된 경우 광고 로드 타이밍의 변경사항이 요약되어 있습니다.

이벤트 미리 로드 포함 미리 로드 제외
광고 VAST 요청됨 AdsLoader.requestAds() AdsLoader.requestAds()
프리롤 로드됨 (단일 광고) AdsManager.init() AdsManager.start()
프리롤 로드됨 (VMAP/광고 규칙) AdsManager.init() AdsManager.init()
미드롤 또는 포스트롤 로드됨 광고 시점의 첫 번째 광고의 경우 광고 시작 시간 8초 전 연속 광고의 경우 이전 광고가 재생되기 시작할 때입니다. 광고 시작 시간

FAQ

미디어를 미리 로드하면 전체 광고 소재가 로드되나요?
아니요. 일반적으로 광고 재생이 시작될 때 광고 소재가 완전히 로드되지 않습니다. 미리 로드는 광고가 로드되는 시간을 최소화하여 사용자 환경을 개선하기 위한 것입니다. 오프라인 광고 게재를 지원하지 않습니다.
광고의 VAST는 물론 미디어에도 미디어 미리 로드를 사용 설정해야 하나요?
아니요. 이 미리 로드 설정에 관계없이 SDK는 항상 광고의 VAST를 미리 로드합니다.