Wstępnie wczytaj multimedia

Wybierz platformę: HTML5 Android

Pakiet IMA SDK obsługuje wstępne wczytywanie komponentów reklamy wideo. Możesz włączyć tę funkcję w integracji pakietu SDK, aby zapewnić płynniejsze przejście między reklamami a treściami. Ten przewodnik zawiera szczegółowe informacje techniczne na temat implementacji wstępnego wczytywania multimediów za pomocą pakietu IMA SDK.

Warunek wstępny

Wstępne wczytywanie wymaga pakietu IMA SDK na Androida w wersji 3.17.0 lub nowszej.

Włącz wstępne ładowanie

Aby włączyć wstępne wczytywanie, użyj AdsRenderingSettings.setEnablePreloading() i ustaw wartość „true”. Musisz to zrobić w ciągu onAdsManagerLoaded() wywołania zwrotnego:

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

Obsługa wstępnego wczytywania za pomocą niestandardowego odtwarzacza VideoAdPlayer

Zalecamy używanie rozszerzenia ExoPlayer-IMA, które jest używane w przykładowej aplikacji ExoPlayer na Androida. Po zintegrowaniu rozszerzenie ExoPlayer-IMA ma domyślnie włączone wstępne wczytywanie i obejmuje wbudowaną obsługę wstępnego wczytywania.

Jeśli wdrażasz wstępne wczytywanie bez rozszerzenia ExoPlayer-IMA, po wywołaniu funkcji setEnablePreloading() konieczne będą dodatkowe zmiany. Aby odtwarzacz wideo obsługiwał wstępne wczytywanie reklam, musi śledzić obiekty AdMediaInfo przekazywane w wywołaniach z loadAd()playAd() oraz zawierać prawidłowy parametr AdMediaInfo w wywołaniach AdPlayerCallback. Może to wymagać struktury danych do zarządzania obiektami AdMediaInfo, ponieważ AdMediaInfo dla kolejnego AdMediaInfo może wystąpić podczas odtwarzania poprzedniego AdMediaInfo.loadAd() Poniższy przykład pokazuje niektóre zmiany, które musisz wprowadzić, aby aplikacja obsługiwała wstępne wczytywanie:

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

Testowanie niestandardowych implementacji wstępnego wczytywania

W przypadku niestandardowych implementacji wstępnego wczytywania zalecamy przetestowanie tych przypadków brzegowych, aby sprawdzić, czy wstępne wczytywanie jest prawidłowo skonfigurowane:

  • Reklama przed filmem w postaci pojedynczej reklamy
  • 3 reklamy przed filmem w bloku reklamowym
  • blok reklamowy w trakcie filmu z 3 reklamami
  • Przewijanie do drugiej reklamy w trakcie filmu po rozpoczęciu wstępnego wczytywania pierwszej reklamy w trakcie filmu, ale przed jej odtworzeniem
  • Odtwarzanie po filmie

Czas

Tabela poniżej zawiera podsumowanie zmian w czasie wczytywania reklam po włączeniu wstępnego wczytywania:

Zdarzenie Z wczytywaniem z wyprzedzeniem Bez wstępnego wczytywania
Wysłano żądanie reklamy VAST AdsLoader.requestAds() AdsLoader.requestAds()
Załadowano reklamę przed filmem (pojedynczą) AdsManager.init() AdsManager.start()
Załadowano reklamę przed filmem (VMAP/reguły reklamowe) AdsManager.init() AdsManager.init()
Reklama w trakcie filmu lub reklama po filmie została wczytana W przypadku pierwszej reklamy w przerwie na reklamę: 8 sekund przed czasem rozpoczęcia reklamy. W przypadku kolejnych reklam – gdy zacznie się odtwarzać poprzednia reklama. W momencie rozpoczęcia wyświetlania reklamy.

Najczęstsze pytania

Czy wstępne wczytywanie multimediów powoduje załadowanie pełnej kreacji?
Nie, kreacja zwykle nie jest w pełni wczytana, gdy rozpoczyna się odtwarzanie reklamy. Wstępne wczytywanie ma na celu poprawę wygody użytkowników przez skrócenie czasu wczytywania reklamy. Nie jest przeznaczony do obsługi wyświetlania reklam offline.
Czy wstępne wczytywanie multimediów musi być włączone zarówno w przypadku VAST reklamy, jak i multimediów?
Nie. Pakiet SDK zawsze wstępnie wczytuje VAST reklamy, niezależnie od tego ustawienia wstępnego wczytywania.