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żyjAdsRenderingSettings.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()
i 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.