L'SDK IMA supporta il precaricamento degli asset degli annunci video. Puoi attivare questa funzionalità nell'integrazione dell'SDK per fornire una transizione più fluida tra annunci e contenuti. Questa guida illustra i dettagli tecnici dell'implementazione del precaricamento dei contenuti multimediali con l'SDK IMA.
Prerequisito
Il precaricamento richiede la versione 3.17.0 o successive dell'SDK IMA per Android.
Attiva il precaricamento
Per attivare il precaricamento, utilizzaAdsRenderingSettings.setEnablePreloading()
per impostare il precaricamento su true. Questa operazione deve essere eseguita entro il onAdsManagerLoaded()
callback:
@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
...
AdsRenderingSettings adsRenderingSettings =
ImaSdkFactory.getInstance().createAdsRenderingSettings();
adsRenderingSettings.setEnablePreloading(true);
mAdsManager.init(adsRenderingSettings);
}
Supporto del precaricamento con un VideoAdPlayer personalizzato
Ti consigliamo l'estensione ExoPlayer-IMA utilizzata nell'app di esempio ExoPlayer per Android. Una volta integrata, l'estensione ExoPlayer-IMA ha il precaricamento abilitato per impostazione predefinita e include il supporto integrato per il precaricamento.
Se implementi il precaricamento senza l'estensione ExoPlayer-IMA,
sono necessarie modifiche aggiuntive una volta chiamato setEnablePreloading()
. Affinché
un video player supporti il precaricamento degli annunci, deve tenere traccia degli
oggetti AdMediaInfo
passati nelle chiamate da loadAd()
e playAd()
e includere il AdMediaInfo
corretto nelle chiamate AdPlayerCallback
. Ciò potrebbe
richiedere una struttura di dati per gestire gli oggetti AdMediaInfo
, dato che loadAd()
per un successivo AdMediaInfo
potrebbe verificarsi durante la riproduzione di un AdMediaInfo
precedente. L'esempio seguente mostra alcune delle modifiche
che potresti dover apportare alla tua app per supportare 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.
}
Testare le implementazioni del precaricamento personalizzato
Per le implementazioni del precaricamento personalizzato, è consigliabile testare i seguenti casi limite per verificare la corretta configurazione del precaricamento:
- Annuncio pre-roll singolo
- Pre-roll di pod di annunci da 3
- Mid-roll con 3 pod di annunci
- Spostamento a un secondo mid-roll dopo che il primo mid-roll ha iniziato il precaricamento, ma prima della riproduzione
- Riproduzione post-roll
Tempi
La seguente tabella riassume le modifiche alla tempistica di caricamento degli annunci quando il precaricamento è attivato:
Evento | Con precaricamento | Senza precaricamento |
---|---|---|
VAST annuncio richiesto | AdsLoader.requestAds() |
AdsLoader.requestAds() |
Pre-roll caricato (singolo annuncio) | AdsManager.init() |
AdsManager.start() |
Pre-roll caricato (VMAP/regole per gli annunci) | AdsManager.init() |
AdsManager.init() |
Mid-roll o post-roll caricato | Per il primo annuncio di 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, in genere la creatività non è completamente caricata quando inizia la riproduzione dell'annuncio. Il precaricamento ha lo scopo di migliorare l'esperienza utente riducendo al minimo il tempo necessario per caricare l'annuncio. Non è progettato per supportare la pubblicazione di annunci offline.
- Il precaricamento dei contenuti multimediali deve essere attivato anche per il VAST dell'annuncio e per i contenuti multimediali?
- No, l'SDK precarica sempre il VAST dell'annuncio, indipendentemente da questa impostazione di precaricamento.