L'SDK IMA supporta il precaricamento degli asset degli annunci video. Puoi attivare questa funzionalità nell'integrazione dell'SDK per offrire una transizione più fluida tra annunci e contenuti. Questa guida illustra i dettagli tecnici dell'implementazione del precaricamento multimediale con l'SDK IMA.
Prerequisiti
Il precaricamento richiede la versione 3.17.0 o successive dell'SDK IMA per Android.
Attiva precaricamento
Per abilitare il precaricamento, utilizzaAdsRenderingSettings.setEnablePreloading()
per impostare il precaricamento su true. Questa operazione deve essere eseguita all'interno del callback onAdsManagerLoaded()
:
@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
...
AdsRenderingSettings adsRenderingSettings =
ImaSdkFactory.getInstance().createAdsRenderingSettings();
adsRenderingSettings.setEnablePreloading(true);
mAdsManager.init(adsRenderingSettings);
}
Supportare il precaricamento con un VideoAdPlayer personalizzato
Consigliamo l'estensione ExoPlayer-IMA utilizzata nell'app Android BasicExample. Una volta integrata, l'estensione ExoPlayer-IMA ha il precaricamento attivato per impostazione predefinita e include il supporto integrato per il precaricamento.
Se stai implementando il precaricamento senza l'estensione ExoPlayer-IMA, sono necessarie ulteriori modifiche una volta chiamato setEnablePreloading()
. Affinché
un video player possa supportare gli annunci di precaricamento, deve tenere traccia degli
oggetti AdMediaInfo
trasmessi nelle chiamate da loadAd()
e playAd()
e includere il valore AdMediaInfo
corretto nelle chiamate AdPlayerCallback
. Ciò potrebbe richiedere una struttura di dati per gestire gli oggetti AdMediaInfo
, dato che potrebbe verificarsi loadAd()
per un AdMediaInfo
successivo mentre è in corso la riproduzione di un AdMediaInfo
precedente. L'esempio seguente illustra alcune delle modifiche
che potresti dover apportare affinché la tua app supporti il precaricamento:
// 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.
}
Test delle implementazioni di precaricamento personalizzate
Per le implementazioni di precaricamento personalizzate, ti consigliamo di testare i seguenti casi limite per verificare una configurazione di precaricamento corretta:
- Pre-roll singolo annuncio
- Pre-roll di 3 pod di annunci
- Mid-roll di 3 pod di annunci
- Ricerca di un secondo mid-roll dopo l'inizio del precaricamento del primo, ma prima della riproduzione
- Riproduzione post-roll
Tempistica
La seguente tabella riassume le modifiche alla tempistica del caricamento degli annunci quando è attivato il precaricamento:
Evento | Con precaricamento | Senza precaricamento |
---|---|---|
Annuncio VAST richiesto | AdsLoader.requestAds() |
AdsLoader.requestAds() |
Caricamento pre-roll (annuncio singolo) | AdsManager.init() |
AdsManager.start() |
Caricamento pre-roll (VMAP/regole annunci) | AdsManager.init() |
AdsManager.init() |
Mid-roll o post-roll caricati | Per il primo annuncio in un'interruzione pubblicitaria, 8 secondi prima dell'ora di inizio dell'annuncio. Per gli annunci consecutivi, quando inizia la riproduzione dell'annuncio precedente. | All'ora di inizio dell'annuncio. |
Domande frequenti
- Il precaricamento dei contenuti multimediali carica l'intera creatività?
- No, generalmente la creatività non è completamente caricata all'inizio della riproduzione dell'annuncio. Il precaricamento è pensato per migliorare l'esperienza utente riducendo al minimo il tempo necessario per il caricamento dell'annuncio. Non è pensata per supportare la pubblicazione di annunci offline.
- Il precaricamento dei contenuti multimediali deve essere attivato per il modello VAST dell'annuncio e per i contenuti multimediali?
- No, l'SDK precarica sempre il modello VAST dell'annuncio, indipendentemente da questa impostazione di precaricamento.