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 zawiera szczegółowe informacje techniczne dotyczące wczytywania wstępnego 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łącz wstępne ładowanie

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 przykładowej aplikacji ExoPlayer na Androida. Po zintegrowaniu rozszerzenie ExoPlayer-IMA ma domyślnie włączone wczytywanie wstępne i obsługuje wczytywanie wstępne.

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ępny wczyt reklam, musi śledzić obiekty AdMediaInfo przekazywane w wywołaniach z funkcji loadAd()playAd() oraz uwzględniać prawidłowe obiekty 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 odtwarzany. Ten przykład pokazuje niektóre zmiany, które mogą być konieczne, aby umożliwić w aplikacji 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 ładowania

W przypadku niestandardowych implementacji wstępnego wczytywania zalecamy przetestowanie tych szczególnych przypadków, aby sprawdzić prawidłową konfigurację wstępnego wczytywania:

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

Czas

Tabela poniżej zawiera podsumowanie zmian w czasie wczytywania reklamy, gdy w aplikacji włączone jest wczytywanie w tle:

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 załadowana (VMAP/Reguły reklamowe) AdsManager.init() AdsManager.init()
Załadowana reklama w trakcie filmu lub po filmie W przypadku pierwszej reklamy w przerwie na reklamę 8 sekund przed jej rozpoczęciem. W przypadku kolejnych reklam – gdy rozpoczyna się odtwarzanie poprzedniej reklamy. W momencie rozpoczęcia 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 pobieranie ma na celu zwiększenie wygody użytkowników przez skrócenie czasu wczytywania reklamy. Nie obsługuje ona wyświetlania reklam offline.
Czy w przypadku reklamy w formacie VAST i multimediów musi być włączone wczytywanie wstępne multimediów?
Nie. Pakiet SDK zawsze wstępnie wczytuje plik VAST reklamy niezależnie od tego ustawienia.