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 Vorabladens von Medien 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 Vorabladen aktivieren möchten, legen Sie mit AdsRenderingSettings.setEnablePreloading() den Wert „true“ fest. 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 Vorabladen in der ExoPlayer-IMA-Erweiterung standardmäßig aktiviert und sie bietet integrierte Unterstützung für das Vorabladen.

Wenn Sie das Vorabladen ohne die ExoPlayer-IMA-Erweiterung implementieren, sind zusätzliche Änderungen erforderlich, nachdem setEnablePreloading() aufgerufen wurde. Damit ein Videoplayer das Vorabladen von Anzeigen unterstützt, muss er die AdMediaInfo-Objekte verfolgen, die in Aufrufen von loadAd() und playAd() übergeben werden, und die korrekte AdMediaInfo in die AdPlayerCallback-Aufrufe einbeziehen. Möglicherweise ist eine Datenstruktur erforderlich, um AdMediaInfo-Objekte zu verwalten, da loadAd() für eine nachfolgende AdMediaInfo auftreten kann, während eine vorherige AdMediaInfo gerade wiedergegeben wird. Im folgenden Beispiel werden einige der Änderungen veranschaulicht, 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 des Vorabladens testen

Bei benutzerdefinierten Implementierungen des Vorabladens empfiehlt es sich, die folgenden Grenzfälle zu testen, um eine korrekte Einrichtung des Vorabladens zu überprüfen:

  • Pre-Roll mit einer einzelnen Anzeige
  • Pre-Roll mit einem Anzeigen-Pod mit drei Anzeigen
  • Mid-Roll mit einem Anzeigen-Pod mit drei Anzeigen
  • Zu einem zweiten Mid-Roll springen, nachdem das Vorabladen des ersten Mid-Rolls begonnen hat, aber bevor es wiedergegeben wurde
  • Post-Roll-Wiedergabe

Timing

In der folgenden Tabelle werden die Änderungen beim Timing des Ladens von Anzeigen zusammengefasst, wenn das Vorabladen aktiviert ist:

Ereignis Mit Vorabladen 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 Bei der ersten Anzeige in einer Werbeunterbrechung: 8 Sekunden vor der Startzeit der Anzeige. Bei nachfolgenden Anzeigen: wenn die vorherige Anzeige wiedergegeben wird. Zur Startzeit der Anzeige.

FAQ

Wird beim Vorabladen von Medien das gesamte Creative geladen?
Nein. Das Creative wird in der Regel nicht vollständig geladen, wenn die Wiedergabe der Anzeige beginnt. Das Vorabladen soll die Nutzerfreundlichkeit verbessern, indem die Ladezeit der Anzeige minimiert wird. Es ist nicht für die Bereitstellung von Anzeigen im Offlinemodus vorgesehen.
Muss das Vorabladen von Medien sowohl für die VAST-Datei der Anzeige als auch für die Medien aktiviert werden?
Nein. Das SDK lädt die VAST-Datei der Anzeige immer vorab, unabhängig von dieser Einstellung für das Vorabladen.