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 poluAdsRenderingSettings.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.