Precaricamento dei contenuti multimediali

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, 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

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.