미디어 미리 로드

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를 미리 로드합니다.