Precaricamento dei contenuti multimediali

L'SDK IMA supporta il precaricamento degli asset annuncio 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 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 all'interno del callback onAdsManagerLoaded():

@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
  ...
  AdsRenderingSettings adsRenderingSettings =
      ImaSdkFactory.getInstance().createAdsRenderingSettings();
  adsRenderingSettings.setEnablePreloading(true);
  mAdsManager.init(adsRenderingSettings);
}

Supporto del precaricamento con un VideoAdPlayer personalizzato

Consigliamo l'estensione ExoPlayer-IMA utilizzata nell'app di esempio Android ExoPlayer. Quando è integrata, l'estensione ExoPlayer-IMA ha il precaricamento abilitato per impostazione predefinita e include il supporto del precaricamento integrato.

Se implementi il precaricamento senza l'estensione ExoPlayer-IMA, sono necessarie modifiche aggiuntive una volta chiamata setEnablePreloading(). Affinché un video player supporti il precaricamento degli annunci, deve tenere traccia degli oggetti AdMediaInfo trasmessi nelle chiamate da loadAd() e playAd() e includere AdMediaInfo corretto nelle chiamate AdPlayerCallback. Ciò potrebbe richiedere una struttura di dati per gestire gli oggetti AdMediaInfo, dato che loadAd() per un AdMediaInfo successivo può verificarsi durante la riproduzione di un AdMediaInfo precedente. L'esempio seguente mostra alcune delle modifiche che potresti dover apportare per consentire all'app di 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 una configurazione corretta del precaricamento:

  • Pre-roll con un solo annuncio
  • Pre-roll di pod di annunci da 3 annunci
  • Pod di annunci mid-roll da 3 annunci
  • Passaggio a un secondo mid-roll dopo l'inizio del caricamento anticipato del primo mid-roll, ma prima della sua riproduzione
  • Riproduzione post-roll

Tempi

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

Evento Con precarica Senza precaricamento
VAST dell'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 la creatività completa?
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 il caricamento dell'annuncio. Non è pensata per supportare la pubblicazione di annunci offline.
Il precaricamento dei contenuti multimediali deve essere abilitato per il VAST e i contenuti multimediali dell'annuncio?
No, l'SDK precarica sempre il VAST dell'annuncio, indipendentemente da questa impostazione di precaricamento.