Medien vorab laden

Plattform auswählen:HTML5 Android

Das IMA SDK unterstützt das Vorabladen von Videoanzeigen-Assets. Sie können diese Funktion in Ihre SDK-Integration einbinden, um einen nahtloseren Übergang zwischen Anzeigen und Inhalten zu ermöglichen. In diesem Leitfaden werden die technischen Details der Implementierung des Media-Preloads mit dem IMA SDK beschrieben.

Voraussetzungen

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

Vorabladen aktivieren

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

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

Vorabladen mit einem benutzerdefinierten VideoAdPlayer unterstützen

Wir empfehlen die ExoPlayer-IMA-Erweiterung, die in der Android ExoPlayer-Beispiel-App verwendet wird. Wenn sie eingebunden ist, ist das Preloading in der ExoPlayer-IMA-Erweiterung standardmäßig aktiviert und sie bietet integrierte Unterstützung für das Preloading.

Wenn Sie das Preloading ohne die ExoPlayer-IMA-Erweiterung implementieren, sind zusätzliche Änderungen erforderlich, sobald setEnablePreloading() aufgerufen wird. Damit ein Videoplayer das Vorladen von Anzeigen unterstützt, muss er die AdMediaInfo-Objekte verfolgen, die in Aufrufen von loadAd() und playAd() übergeben werden, und die richtige AdMediaInfo in die AdPlayerCallback-Aufrufe einfügen. Dazu ist möglicherweise eine Datenstruktur zum Verwalten von AdMediaInfo-Objekten erforderlich, da loadAd() für ein nachfolgendes AdMediaInfo auftreten kann, während ein vorheriges 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 Vorabladen testen

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

  • Pre-Roll mit einer einzelnen Anzeige
  • Pre-Roll mit 3 Anzeigen-Pods
  • Mid-Roll mit 3 Anzeigen-Pod
  • Es wird zu einem zweiten Mid-Roll gesucht, nachdem das Vorladen des ersten Mid-Rolls begonnen hat, aber bevor es abgespielt wurde.
  • Post-Roll-Wiedergabe

Timing

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

Ereignis Mit Preload Ohne Vorabladen
VAST-Anzeige angefordert 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 Für die erste Anzeige in einer Werbeunterbrechung: 8 Sekunden vor Beginn der Anzeige. Bei aufeinanderfolgenden Anzeigen, wenn die vorherige Anzeige abgespielt wird. Zur Anzeigenstartzeit.

FAQ

Wird beim Vorabladen von Media das vollständige Creative geladen?
Nein. Das Creative ist in der Regel nicht vollständig geladen, wenn die Anzeigenwiedergabe beginnt. Durch das Vorabladen soll die Nutzerfreundlichkeit verbessert werden, indem die Ladezeit der Anzeige minimiert wird. Es ist nicht für die Offline-Anzeigenbereitstellung vorgesehen.
Muss das Vorabladen von Media sowohl für das VAST der Anzeige als auch für die Media aktiviert sein?
Nein. Das SDK lädt das VAST der Anzeige immer vorab, unabhängig von dieser Voreinstellung.