Precaricare i contenuti multimediali

Seleziona la piattaforma: HTML5 Android

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.

Attivare il precaricamento

Per attivare il precaricamento, utilizza AdsRenderingSettings.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

Ti consigliamo l' estensione ExoPlayer-IMA utilizzata nell' app di esempio ExoPlayer per Android. Una volta integrata, l'estensione ExoPlayer-IMA ha il precaricamento attivato per impostazione predefinita e include il supporto integrato per il precaricamento.

Se implementi il precaricamento senza l'estensione ExoPlayer-IMA, sono necessarie modifiche aggiuntive dopo aver 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 AdMediaInfo successivo 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 di precaricamento personalizzate

Per le implementazioni di precaricamento personalizzate, ti consigliamo di testare i seguenti casi limite per verificare la correttezza della configurazione del precaricamento:

  • Annuncio pre-roll singolo
  • Annuncio pre-roll con pod di 3 annunci
  • Pod di annunci mid-roll con 3 annunci
  • Passaggio a un secondo annuncio mid-roll dopo che il primo annuncio mid-roll ha iniziato il precaricamento, ma prima che venga riprodotto
  • Riproduzione di annunci post-roll

Sincronizzazione

La seguente tabella riassume le modifiche ai tempi di caricamento degli annunci quando il precaricamento è attivato:

Evento Con precaricamento Senza precaricamento
VAST dell'annuncio richiesto AdsLoader.requestAds() AdsLoader.requestAds()
Annuncio pre-roll caricato (annuncio singolo) AdsManager.init() AdsManager.start()
Annuncio pre-roll caricato (VMAP/regole per gli annunci) AdsManager.init() AdsManager.init()
Annuncio mid-roll o post-roll caricato 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 la creatività completa?
No, in genere la creatività non viene caricata completamente 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 sia per il VAST dell'annuncio sia per i contenuti multimediali?
No, l'SDK precarica sempre il VAST dell'annuncio, indipendentemente da questa impostazione di precaricamento.