Medien vorab laden

Das IMA SDK unterstützt das Vorabladen von Videoanzeigen-Assets. Du kannst diese Funktion in deiner SDK-Integration aktivieren, um einen nahtlosen Übergang zwischen Werbung und Content zu ermöglichen. In diesem Leitfaden werden die technischen Details der Implementierung von Medien-Vorabladevorgängen mit dem IMA SDK beschrieben.

Vorbereitung

Für das Vorabladen ist mindestens Version 3.17.0 des IMA Android SDK erforderlich.

Vorabladen aktivieren

Verwenden Sie AdsRenderingSettings.setEnablePreloading(), um das Vorabladen auf „true“ zu setzen, um das Vorabladen zu aktivieren. Dies muss innerhalb des onAdsManagerLoaded()-Callbacks erfolgen:

@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 BasicExample-App verwendet wird. Bei der Einbindung ist das Vorabladen bei der ExoPlayer-IMA-Erweiterung standardmäßig aktiviert und unterstützt das Vorabladen.

Wenn Sie das Vorabladen ohne die ExoPlayer-IMA-Erweiterung implementieren, sind nach dem Aufruf von setEnablePreloading() zusätzliche Änderungen erforderlich. Damit ein Videoplayer das Vorabladen von Anzeigen unterstützt, muss er die AdMediaInfo-Objekte erfassen, die in Aufrufen von loadAd() und playAd() übergeben werden, und die korrekte AdMediaInfo in den AdPlayerCallback-Aufrufen enthalten. Dies kann eine Datenstruktur zur Verwaltung von AdMediaInfo-Objekten erfordern, da loadAd() für eine nachfolgende AdMediaInfo auftreten kann, während eine vorherige AdMediaInfo wiedergegeben wird. Das folgende Beispiel zeigt einige der Änderungen, die du möglicherweise vornehmen musst, damit deine 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 Vorabladen testen

Bei benutzerdefinierten Vorabladeimplementierungen wird empfohlen, die folgenden Grenzfälle zu testen, um eine korrekte Einrichtung für das Vorabladen zu prüfen:

  • Einzelne Anzeige (Pre-Roll)
  • 3 Pre-Roll-Anzeigen-Pods
  • 3 Mid-Rolls für Anzeigen-Pods
  • Suchen zu einer zweiten Mid-Roll, nachdem die erste Mid-Roll vor dem Laden begonnen hat, aber bevor sie abgespielt wurde
  • Post-Roll-Wiedergabe

Dauer

In der folgenden Tabelle sind die Änderungen im zeitlichen Ablauf des Anzeigenladevorgangs zusammengefasst, wenn das Vorabladen aktiviert ist:

Veranstaltung Mit Vorladefunktion Ohne Vorabladen
VAST-Anzeigenanfrage AdsLoader.requestAds() AdsLoader.requestAds()
Pre-Roll geladen (einzelne Anzeige) AdsManager.init() AdsManager.start()
Pre-Roll geladen (VMAP-/Anzeigenregeln) AdsManager.init() AdsManager.init()
Mid-Roll oder Post-Roll geladen Bei der ersten Anzeige in einer Werbeunterbrechung, 8 Sekunden vor der Startzeit Bei aufeinanderfolgenden Anzeigen, wenn die vorherige Anzeige wiedergegeben wird. Bei Anzeigenstart.

Häufig gestellte Fragen

Wird bei Media-Vorabladevorgängen das gesamte Creative geladen?
Nein, das Creative ist zu Beginn der Anzeigenwiedergabe normalerweise noch nicht vollständig geladen. Durch das Vorabladen soll die Nutzerfreundlichkeit verbessert werden, indem die Ladezeit der Anzeige verkürzt wird. Es ist nicht darauf ausgelegt, die Offline-Anzeigenbereitstellung zu unterstützen.
Muss das Vorabladen von Medien sowohl für die VAST- als auch für die Medien der Anzeige aktiviert sein?
Nein, das SDK lädt die VAST-Anzeigen der Anzeige unabhängig von dieser Einstellung immer vorab.