Wstępne wczytywanie multimediów

Pakiet IMA SDK obsługuje wstępny wczytywanie komponentów reklam wideo. Możesz włączyć tę funkcję w ramach integracji pakietu SDK, aby zapewnić płynne przejście między reklamami a treściami. Ten przewodnik przedstawia techniczne szczegóły implementacji wstępnego ładowania multimediów za pomocą pakietu IMA SDK.

Warunek wstępny

Wczytywanie wstępne wymaga pakietu IMA Android SDK w wersji 3.17.0 lub nowszej.

Włączanie pre-load

Aby włączyć wstępne wczytywanie, użyj elementu AdsRenderingSettings.setEnablePreloading(), aby ustawić wartość wstępnego wczytywania na „Prawda”. Musisz to zrobić w ramach wywołania zwrotnego 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 rozszerzenie ExoPlayer-IMA, które jest używane w aplikacji Android BasicExample. Po zintegrowaniu rozszerzenie ExoPlayer-IMA ma domyślnie włączone wstępne wczytywanie i obsługuje wbudowane wstępne wczytywanie.

Jeśli implementujesz wstępny wczytywanie bez rozszerzenia ExoPlayer-IMA, po wywołaniu funkcji setEnablePreloading() wymagane są dodatkowe zmiany. Aby odtwarzacz wideo obsługiwał wstępne wczytywanie reklam, musi śledzić obiekty AdMediaInfo, które są przekazywane w wywołaniach loadAd() i playAd(), oraz zawierać prawidłowy ciąg AdMediaInfo w wywołaniach AdPlayerCallback. Może to wymagać użycia struktury danych do zarządzania obiektami AdMediaInfo, ponieważ loadAd() dla kolejnego AdMediaInfo może wystąpić, gdy poprzedni AdMediaInfo jest obecnie odtwarzany. Ten przykład pokazuje niektóre zmiany, które mogą być konieczne, aby aplikacja obsługiwała wczytywanie w tle:

// 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 scenariuszy brzegowych w celu sprawdzenia prawidłowej konfiguracji wstępnego wczytywania:

  • Pojedyncza reklama przed filmem
  • 3 bloki reklamowe przed filmem
  • 3 bloki reklamowe w trakcie filmu
  • Przeszukiwanie drugiej reklamy w trakcie filmu po rozpoczęciu wstępnego wczytywania pierwszej reklamy, ale przed jej odtworzeniem
  • Odtwarzanie po filmie

Czas

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

Zdarzenie Z wczytywaniem z wyprzedzeniem Bez wstępnego wczytywania
Żądana reklama VAST AdsLoader.requestAds() AdsLoader.requestAds()
Załadowana reklama przed filmem (pojedyncza reklama) AdsManager.init() AdsManager.start()
Reklama przed filmem została załadowana (VMAP/Reguły reklamowe) AdsManager.init() AdsManager.init()
Załadowana reklama w trakcie filmu lub po nim W przypadku pierwszej reklamy w przerwie na reklamę 8 sekund przed jej rozpoczęciem. W przypadku kolejnych reklam, gdy rozpocznie się odtwarzanie poprzedniej reklamy. W momencie 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ę wrażeń użytkownika przez skrócenie czasu potrzebnego na wczytanie reklamy. Nie obsługuje ona wyświetlania reklam offline.
Czy w przypadku reklamy VAST i multimediów musi być włączone wstępne wczytywanie multimediów?
Nie. SDK zawsze wstępnie wczytuje VAST reklamy, niezależnie od tego ustawienia wstępnego wczytywania.