Medien vorab laden

Das IMA SDK unterstützt das Vorabladen von Videoanzeigen-Assets. Sie können diese Funktion in Ihrer SDK-Integration aktivieren, um einen nahtlosen Übergang zwischen Anzeigen und Inhalten zu ermöglichen. In diesem Leitfaden werden die technischen Details zur Implementierung des Media-Preloads mit dem IMA SDK erläutert.

Voraussetzungen

Für das Vorabladen ist Version 3.17.0 oder höher des IMA Android SDK erforderlich.

Vorabladen aktivieren

Wenn Sie das Vorladen aktivieren möchten, verwenden Sie AdsRenderingSettings.setEnablePreloading(), um „preloading“ auf „true“ zu setzen. Dies muss innerhalb des onAdsManagerLoaded()-Callbacks geschehen:

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

Unterstützung des Vorabladens mit einem benutzerdefinierten VideoAdPlayer

Wir empfehlen die ExoPlayer-IMA-Erweiterung, die in der Android ExoPlayer-Beispiel-App verwendet wird. Bei der Integration ist das Vorladen in der ExoPlayer-IMA-Erweiterung standardmäßig aktiviert und es ist eine integrierte Unterstützung für das Vorladen vorhanden.

Wenn du das Vorladen ohne die ExoPlayer-IMA-Erweiterung implementierst, sind nach dem Aufruf von setEnablePreloading() zusätzliche Änderungen erforderlich. Damit ein Videoplayer das Vorladen von Anzeigen unterstützt, muss er die AdMediaInfo-Objekte im Blick behalten, die in Aufrufen von loadAd() und playAd() übergeben werden, und die richtige AdMediaInfo in den AdPlayerCallback-Aufrufen enthalten. Dazu ist möglicherweise eine Datenstruktur zum Verwalten von AdMediaInfo-Objekten erforderlich, da loadAd() für eine nachfolgende AdMediaInfo auftreten kann, während eine vorherige AdMediaInfo gerade wiedergegeben wird. Das folgende Beispiel zeigt einige der Änderungen, die Sie möglicherweise vornehmen müssen, damit Ihre App das Vorabladen unterstützt:

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

Benutzerdefinierte Implementierungen für das Vorladen testen

Bei benutzerdefinierten Implementierungen des Vorabladens wird empfohlen, die folgenden Grenzfälle zu testen, um die korrekte Einrichtung des Vorabladens zu überprüfen:

  • Pre-Roll mit einer einzelnen Anzeige
  • Pre-Roll-Anzeigen-Pod mit 3 Anzeigen
  • Mid-Roll-Anzeigen-Pod mit 3 Anzeigen
  • Springen zu einem zweiten Mid-Roll, nachdem das erste Mid-Roll bereits vorgeladen wurde, aber noch nicht wiedergegeben wurde
  • Post-Roll-Wiedergabe

Timing

In der folgenden Tabelle sind die Änderungen am Timing des Anzeigen-Ladens zusammengefasst, wenn das Vorladen aktiviert ist:

Ereignis Mit Vorab-Download Ohne Vorabladen
Angeforderte VAST-Anzeigendatei AdsLoader.requestAds() AdsLoader.requestAds()
Pre-Roll geladen (einzelne Anzeige) AdsManager.init() AdsManager.start()
Pre-Roll wurde geladen (VMAP/Anzeigenregeln) AdsManager.init() AdsManager.init()
Mid-Roll- oder Post-Roll-Anzeigen geladen Bei der ersten Anzeige in einer Werbeunterbrechung 8 Sekunden vor Beginn der Anzeige. Bei aufeinanderfolgenden Anzeigen, wenn die vorherige Anzeige beginnt. Zum Anzeigenstart

FAQ

Wird beim Vorabladen von Medien das vollständige Creative geladen?
Nein. Das Creative ist in der Regel nicht vollständig geladen, wenn die Wiedergabe der Anzeige beginnt. Das Vorladen soll die Nutzerfreundlichkeit verbessern, indem die Ladezeit der Anzeige verkürzt wird. Die Offlinebereitstellung von Anzeigen wird nicht unterstützt.
Muss das Media-Preload für das VAST-Anzeigen-Objekt und die Medien aktiviert sein?
Nein. Das SDK lädt das VAST-Anzeigen-Manifest unabhängig von dieser Einstellung immer vorab.