Wstępnie wczytaj multimedia

Wybierz platformę: HTML5 Android

Pakiet IMA SDK obsługuje wstępne wczytywanie zasobów reklam wideo. Możesz włączyć tę funkcję w integracji pakietu SDK, aby zapewnić płynniejsze przejście między reklamami a treścią. Z tego przewodnika dowiesz się, jak zaimplementować wstępne wczytywanie multimediów za pomocą pakietu IMA SDK.

Warunek wstępny

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

Włączanie wstępnego wczytywania

Aby włączyć wstępne wczytywanie, użyj AdsRenderingSettings.setEnablePreloading() i ustaw wartość true. Musisz to zrobić w wywołaniu zwrotnym onAdsManagerLoaded():

@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 wbudowaną obsługę wstępnego wczytywania.

Jeśli implementujesz wstępne wczytywanie bez rozszerzenia ExoPlayer-IMA, po wywołaniu setEnablePreloading() wymagane są dodatkowe zmiany. Aby odtwarzacz wideo obsługiwał wstępne wczytywanie reklam, musi śledzić obiekty AdMediaInfo przekazywane w wywołaniach z loadAd() i playAd() oraz zawierać prawidłowy obiekt AdMediaInfo w wywołaniach AdPlayerCallback. Może to wymagać struktury danych do zarządzania obiektami AdMediaInfo, ponieważ wywołanie loadAd() dla kolejnego obiektu AdMediaInfo może nastąpić, gdy odtwarzany jest poprzedni obiekt AdMediaInfo. Poniższy przykład pokazuje niektóre zmiany, które mogą być konieczne, 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 konfiguracja wstępnego wczytywania jest prawidłowa:

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

Kod czasowy

Tabela poniżej zawiera podsumowanie zmian w czasie wczytywania reklam, gdy włączone jest wstępne wczytywanie:

Zdarzenie Z wstępnym wczytywaniem Bez wstępnego wczytywania
Żądanie VAST reklamy AdsLoader.requestAds() AdsLoader.requestAds()
Wczytano reklamę przed filmem (pojedyncza reklama) AdsManager.init() AdsManager.start()
Wczytano reklamę przed filmem (VMAP/reguły reklamowe) AdsManager.init() AdsManager.init()
Wczytano reklamę w trakcie filmu lub po filmie W przypadku pierwszej reklamy w przerwie na reklamę – 8 sekund przed czasem rozpoczęcia wyświetlania reklamy. W przypadku kolejnych reklam – gdy zacznie się odtwarzać poprzednia reklama. W czasie rozpoczęcia wyświetlania reklamy.

Najczęstsze pytania

Czy wstępne wczytywanie multimediów wczytuje całą kreację?
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 zminimalizowanie czasu wczytywania reklamy. Nie jest przeznaczone 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.