Precarga de contenido multimedia

El SDK de IMA admite la precarga de recursos de anuncios de video. Puedes habilitar esta función en tu integración del SDK para proporcionar una transición más fluida entre los anuncios y el contenido. En esta guía, se revisan los detalles técnicos para implementar la precarga de contenido multimedia con el SDK de IMA.

Requisitos

La precarga requiere la versión 3.17.0 o posterior del SDK de IMA para Android.

Habilitar precarga

Para habilitar la precarga, usa AdsRenderingSettings.setEnablePreloading() para configurarla como verdadera. Esto debe hacerse dentro de la devolución de llamada onAdsManagerLoaded():

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

Compatibilidad con la precarga con un VideoAdPlayer personalizado

Recomendamos la extensión ExoPlayer-IMA que se usa en la app BasicExample de Android. Cuando se integra, la extensión ExoPlayer-IMA tiene habilitada la precarga de forma predeterminada y, además, incluye compatibilidad integrada con esta.

Si implementas la precarga sin la extensión ExoPlayer-IMA, se requieren cambios adicionales una vez que se llama a setEnablePreloading(). Para que un reproductor de video admita la precarga de anuncios, debe realizar un seguimiento de los objetos AdMediaInfo que se pasan en las llamadas desde loadAd() y playAd(), e incluir el AdMediaInfo correcto en las llamadas a AdPlayerCallback. Esto puede requerir una estructura de datos para administrar objetos AdMediaInfo, ya que loadAd() para una AdMediaInfo posterior puede ocurrir mientras se reproduce un AdMediaInfo anterior. En el siguiente ejemplo, se muestran algunos de los cambios que quizás debas realizar para que tu app admita la precarga:

// 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.
}

Cómo probar implementaciones de precarga personalizadas

Para las implementaciones de precarga personalizadas, se recomienda probar los siguientes casos extremos a fin de verificar una configuración de precarga correcta:

  • Anuncio previo al video único
  • 3 anuncios previos al video de grupos de anuncios
  • Anuncio durante el video de 3 grupos de anuncios
  • Busca un segundo anuncio durante el video después de que el primero haya comenzado la precarga, pero antes de que se haya reproducido.
  • Reproducción al final del video

Tiempos

En la siguiente tabla, se resumen los cambios en el tiempo de carga de anuncios cuando está habilitada la precarga:

Evento Con precarga Sin precarga
Anuncio de VAST solicitado AdsLoader.requestAds() AdsLoader.requestAds()
Anuncio previo al video cargado (un solo anuncio) AdsManager.init() AdsManager.start()
Anuncio previo al video cargado (VMAP/reglas de anuncios) AdsManager.init() AdsManager.init()
Se cargaron anuncios durante el video o al final del video Para el primer anuncio en una pausa publicitaria, 8 segundos antes de la hora de inicio del anuncio. En el caso de los anuncios consecutivos, cuando comienza a reproducirse el anuncio anterior. A la hora de inicio del anuncio

Preguntas frecuentes

¿El medio de carga previa carga la creatividad completa?
No. Por lo general, la creatividad no se carga completamente cuando comienza la reproducción de anuncios. El objetivo de la precarga es mejorar la experiencia del usuario, ya que minimiza el tiempo que tarda el anuncio en cargarse. No está diseñado para admitir la publicación de anuncios sin conexión.
¿Es necesario habilitar la precarga de contenido multimedia tanto para la VAST del anuncio como para el contenido multimedia?
No, el SDK siempre precarga la VAST del anuncio, independientemente de esta configuración de precarga.