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óły techniczne dotyczące 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ść Prawda. 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 Android ExoPlayer. 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ędzie wprowadzenie dodatkowych zmian. 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 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 wstępne wczytywanie jest prawidłowo skonfigurowane:

  • Reklama przed filmem w postaci pojedynczej reklamy
  • 3 reklamy przed filmem w bloku reklamowym
  • Blok reklamowy z 3 reklamami w trakcie filmu
  • Przewijanie do drugiej reklamy w trakcie filmu po rozpoczęciu wstępnego buforowania 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()
Reklama przed filmem została załadowana (pojedyncza reklama) AdsManager.init() AdsManager.start()
Reklama przed filmem została załadowana (VMAP/reguły reklamowe) AdsManager.init() AdsManager.init()
Reklama w trakcie filmu lub po filmie została wczytana W przypadku pierwszej reklamy w przerwie na reklamę: 8 sekund przed rozpoczęciem wyświetlania 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.