Pakiet IMA SDK obsługuje wczytywanie zasobów reklam wideo z wyprzedzeniem. Możesz włączyć tę funkcję w integracji pakietu SDK, aby zapewnić płynniejsze przejście między reklamami a treścią. Z tego przewodnika dowiesz się, jak wdrożyć wczytywanie multimediów z wyprzedzeniem za pomocą pakietu IMA SDK.
Warunek wstępny
Wczytywanie z wyprzedzeniem wymaga pakietu IMA Android SDK w wersji 3.17.0 lub nowszej.
Włączanie wczytywania z wyprzedzeniem
Aby włączyć wczytywanie z wyprzedzeniem, użyjAdsRenderingSettings.setEnablePreloading()
i ustaw wartość true. Musisz to zrobić w wywołaniu zwrotnym onAdsManagerLoaded():
@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
...
AdsRenderingSettings adsRenderingSettings =
ImaSdkFactory.getInstance().createAdsRenderingSettings();
adsRenderingSettings.setEnablePreloading(true);
mAdsManager.init(adsRenderingSettings);
}
Obsługa wczytywania z wyprzedzeniem za pomocą niestandardowego odtwarzacza VideoAdPlayer
Zalecamy używanie rozszerzenia 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 z wyprzedzeniem i obejmuje wbudowaną obsługę wczytywania z wyprzedzeniem.
Jeśli implementujesz wczytywanie z wyprzedzeniem bez rozszerzenia ExoPlayer-IMA, po wywołaniu setEnablePreloading() wymagane są dodatkowe zmiany. Aby odtwarzacz wideo obsługiwał wczytywanie reklam z wyprzedzeniem, musi śledzić obiekty AdMediaInfo przekazywane w wywołaniach z loadAd() i playAd() oraz zawierać prawidłowy obiekt AdMediaInfo w wywołaniach AdPlayerCallback. Może to wymagać struktury danych do zarządzania obiektami AdMediaInfo, ponieważ loadAd() dla kolejnego obiektu AdMediaInfo może wystąpić, gdy odtwarzany jest poprzedni obiekt AdMediaInfo. Poniższy przykład pokazuje niektóre zmiany, które mogą być konieczne, aby aplikacja obsługiwała wczytywanie z wyprzedzeniem:
// 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 wczytywania z wyprzedzeniem
W przypadku niestandardowych implementacji wczytywania z wyprzedzeniem zalecamy przetestowanie tych przypadków brzegowych, aby sprawdzić, czy konfiguracja wczytywania z wyprzedzeniem jest prawidłowa:
- Reklama przed filmem
- Reklama przed filmem w bloku reklamowym z 3 reklamami
- Reklama w trakcie filmu w bloku reklamowym z 3 reklamami
- Przewijanie do drugiej reklamy w trakcie filmu po rozpoczęciu wczytywania pierwszej reklamy w trakcie filmu, ale przed jej odtworzeniem
- Odtwarzanie reklamy po filmie
Kod czasowy
Tabela poniżej zawiera podsumowanie zmian w czasie wczytywania reklam, gdy włączone jest wczytywanie z wyprzedzeniem:
| Zdarzenie | Z wczytywaniem z wyprzedzeniem | Bez wczytywania z wyprzedzeniem |
|---|---|---|
| Żądanie VAST reklamy | AdsLoader.requestAds() |
AdsLoader.requestAds() |
| Reklama przed filmem wczytana (pojedyncza reklama) | AdsManager.init() |
AdsManager.start() |
| Reklama przed filmem wczytana (VMAP/reguły reklamowe) | AdsManager.init() |
AdsManager.init() |
| Reklama w trakcie filmu lub po filmie wczytana | W przypadku pierwszej reklamy w przerwie na reklamę – 8 sekund przed czasem rozpoczęcia wyświetlania reklamy. W przypadku kolejnych reklam – gdy zacznie się odtwarzać poprzednia reklama. | W czasie rozpoczęcia wyświetlania reklamy. |
Najczęstsze pytania
- Czy wczytywanie multimediów z wyprzedzeniem wczytuje całą kreację?
- Nie, kreacja zwykle nie jest w pełni wczytywana, gdy rozpoczyna się odtwarzanie reklamy. Wczytywanie z wyprzedzeniem ma na celu poprawę wygody użytkowników przez zminimalizowanie czasu wczytywania reklamy. Nie jest przeznaczone do obsługi wyświetlania reklam offline.
- Czy wczytywanie multimediów z wyprzedzeniem musi być włączone zarówno w przypadku VAST reklamy, jak i multimediów?
- Nie, pakiet SDK zawsze wczytuje VAST reklamy z wyprzedzeniem, niezależnie od tego ustawienia.