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.

Attiva il precaricamento

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