Wstępne wczytywanie multimediów

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 przechodzenie między reklamami a treściami. W tym przewodniku omawiamy szczegóły techniczne implementacji wstępnego wczytywania multimediów za pomocą pakietu IMA SDK.

Warunek wstępny

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

Włącz wstępne ładowanie

Aby włączyć wstępne wczytywanie, ustaw wartość „true” (prawda) w polu AdsRenderingSettings.setEnablePreloading(). Należy to zrobić z wywołaniem 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życie rozszerzenia ExoPlayer-IMA z aplikacji Android BasicExample. Po integracji rozszerzenie ExoPlayer-IMA ma domyślnie włączone wstępne wczytywanie i obsługę wstępnego wczytywania.

Jeśli implementujesz wstępne wczytywanie bez rozszerzenia ExoPlayer-IMA, po wywołaniu metody setEnablePreloading() musisz wprowadzić dodatkowe zmiany. Aby odtwarzacz wideo obsługiwał wstępne wczytywanie reklam, musi śledzić obiekty AdMediaInfo przekazywane w wywołaniach z metod loadAd() i playAd() oraz podawać w wywołaniach AdPlayerCallback prawidłową wartość AdMediaInfo. Może to wymagać struktury danych do zarządzania obiektami AdMediaInfo, ponieważ loadAd() może wystąpić w przypadku kolejnych AdMediaInfo podczas odtwarzania wcześniejszej treści AdMediaInfo. Ten przykład pokazuje niektóre zmiany, które być może trzeba 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 implementacji wstępnego wczytywania

W przypadku niestandardowych implementacji wstępnego wczytywania zalecamy przetestowanie tych przypadków brzegowych, aby sprawdzić poprawność konfiguracji wstępnego wczytywania:

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

Czas

W tabeli poniżej znajdziesz podsumowanie zmian czasu wczytywania reklamy po włączeniu wstępnego wczytywania:

Zdarzenie Ze wstępnym wczytywaniem Bez wstępnego wczytywania
Żądanie VAST reklamy AdsLoader.requestAds() AdsLoader.requestAds()
Wczytywana reklama przed filmem (pojedyncza reklama) AdsManager.init() AdsManager.start()
Wczytano przed filmem (VMAP/reguły reklamowe) AdsManager.init() AdsManager.init()
Wczytano reklamę w trakcie filmu lub po filmie Pierwsza reklama w przerwie na reklamę – 8 sekund przed czasem rozpoczęcia. w przypadku kolejnych reklam – wtedy rozpoczyna 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 wczytuje się w pełni na początku odtwarzania reklamy. Wstępne wczytywanie ma na celu poprawę wrażeń użytkowników, skracając czas potrzebny na wczytanie reklamy. Nie służy do wyświetlania reklam offline.
Czy na potrzeby reklam VAST oraz multimediów musi być włączone wstępne wczytywanie multimediów?
Nie, SDK zawsze wstępnie wczytuje tag VAST reklamy, niezależnie od tego ustawienia wstępnego wczytywania.