Medyayı önceden yükleme

IMA SDK, video reklam öğelerinin önceden yüklenmesini destekler. Reklamlar ve içerik arasında daha sorunsuz bir geçiş sağlamak için bu özelliği SDK entegrasyonunuzda etkinleştirebilirsiniz. Bu kılavuzda, IMA SDK ile medya önceden yükleme uygulamasının teknik ayrıntıları açıklanmaktadır.

Ön koşul

Önceden yükleme, IMA Android SDK'nın 3.17.0 veya üzeri sürümünü gerektirir.

Önceden yüklemeyi etkinleştir

Önceden yüklemeyi etkinleştirmek için AdsRenderingSettings.setEnablePreloading() kullanarak önceden yüklemeyi true olarak ayarlayın. Bu, onAdsManagerLoaded() geri çağırması içinde yapılmalıdır:

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

Özel bir VideoAdPlayer ile önceden yüklemeyi destekleme

Android BasicExample uygulamasında kullanılan ExoPlayer-IMA uzantısını öneririz. Entegre edildiğinde, ExoPlayer-IMA uzantısı varsayılan olarak önceden yükleme özelliğine sahiptir ve yerleşik önceden yükleme desteği içerir.

ExoPlayer-IMA uzantısı olmadan önceden yükleme uyguluyorsanız setEnablePreloading() çağrıldıktan sonra ek değişiklikler yapılması gerekir. Video oynatıcının önceden yüklenen reklamları desteklemesi için loadAd() ve playAd() kaynaklı çağrılarda geçirilen AdMediaInfo nesnelerini izlemeli ve AdPlayerCallback çağrılarında doğru AdMediaInfo değerini içermelidir. Önceki bir AdMediaInfo şu anda oynatma sırasında sonraki AdMediaInfo için loadAd() gerçekleşebileceği göz önünde bulundurulduğunda, bunun için AdMediaInfo nesnelerini yönetmek üzere bir veri yapısı gerekebilir. Aşağıdaki örnekte, uygulamanızın önceden yüklemeyi desteklemesi için yapmanız gereken değişikliklerden bazıları gösterilmektedir:

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

Özel önceden yükleme uygulamalarını test etme

Özel önceden yükleme uygulamaları söz konusu olduğunda, doğru önceden yükleme kurulumunun doğrulanması için aşağıdaki uç durumları test etmeniz önerilir:

  • Videodan önce gösterilen tek reklam
  • Videodan önce gösterilen 3 reklam kapsülü
  • Videonun ortasında gösterilen 3 reklam kapsülü
  • Videonun ortasında gösterilen ilk reklam önceden yüklenmeye başladıktan sonra, reklam oynatılmadan önce ikinci bir videonun ortasında gösterilen reklama geçme
  • Videodan sonra gösterilen oynatma

Zamanlama

Aşağıdaki tabloda, önceden yükleme etkinleştirildiğinde reklam yükleme zamanlamasında yapılan değişiklikler özetlenmektedir:

Etkinlik Önceden Yüklemeli Önceden Yüklemesiz
Reklam VAST istendi AdsLoader.requestAds() AdsLoader.requestAds()
Videodan önce yüklenen reklam (tek reklam) AdsManager.init() AdsManager.start()
Videodan önce gösterilen reklam yüklendi (VMAP/Reklam kuralları) AdsManager.init() AdsManager.init()
Videonun ortasında veya videodan sonra gösterilen reklam yüklendi Reklam arasındaki ilk reklam için, reklam başlangıç zamanından 8 saniye önce. Birbirini izleyen reklamlarda, önceki reklam oynatılmaya başladığında. Reklam başlangıç zamanı.

SSS

Medya önceden yükleme, reklam öğesinin tamamını yüklüyor mu?
Hayır. Reklam oynatılmaya başladığında reklam öğesi genellikle tam olarak yüklenmez. Önceden yükleme, reklamın yüklenmesi için gereken süreyi en aza indirerek kullanıcı deneyimini iyileştirmek amacıyla tasarlanmıştır. Çevrimdışı reklam sunmayı desteklemek için tasarlanmamıştır.
Medya önceden yüklemenin, medyanın yanı sıra reklamın VAST için de etkinleştirilmesi gerekir mi?
Hayır. SDK, bu önceden yükleme ayarından bağımsız olarak her zaman reklamın VAST'ını önceden yükler.