El SDK de IMA admite la carga previa de recursos de anuncios de video. Puedes habilitar esta función en la integración de tu SDK para brindar una transición más fluida entre los anuncios y el contenido. En esta guía, se analizan los detalles técnicos de la implementación de la carga previa de contenido multimedia con el SDK de IMA.
Requisitos
La carga previa requiere la versión 3.17.0 o una posterior del SDK de IMA para Android.
Habilita la carga previa
Para habilitar la carga previa, usaAdsRenderingSettings.setEnablePreloading()
para establecer la carga previa como verdadera. Esto se debe hacer 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 carga previa con un VideoAdPlayer personalizado
Recomendamos la extensión ExoPlayer-IMA que se usa en la app de Android BasicExample. Cuando se integra, la extensión ExoPlayer-IMA tiene habilitada la carga previa de forma predeterminada y, además, incluye compatibilidad con la carga previa integrada.
Si implementas la carga previa sin la extensión ExoPlayer-IMA, se requieren cambios adicionales una vez que se llame a setEnablePreloading()
. Para que un reproductor de video admita la carga previa de anuncios, debe realizar un seguimiento de los objetos AdMediaInfo
que se pasan en las llamadas de loadAd()
y playAd()
, y debe incluir el AdMediaInfo
correcto en las llamadas de AdPlayerCallback
. Esto puede requerir una estructura de datos para administrar objetos AdMediaInfo
, dado que loadAd()
para un 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 carga previa personalizadas
En el caso de las implementaciones de carga previa personalizada, se recomienda probar los siguientes casos extremos para verificar que la configuración de carga previa sea correcta:
- Anuncio previo al video único
- 3 anuncios previos al video de grupo de anuncios
- 3 grupos de anuncios durante el video
- Saltar a un segundo anuncio durante el video después de que el primero comenzó a cargarse, pero antes de que se reproduzca
- Reproducción al final del video
Tiempos
En la siguiente tabla, se resumen los cambios en los tiempos de carga de anuncios cuando se habilita la carga previa:
Evento | Con carga previa | Sin precarga |
---|---|---|
Anuncio de VAST solicitado | AdsLoader.requestAds() |
AdsLoader.requestAds() |
Anuncio previo al video cargado (anuncio único) | AdsManager.init() |
AdsManager.start() |
Se cargó el anuncio previo al video (VMAP/reglas de anuncios) | AdsManager.init() |
AdsManager.init() |
Se cargó un anuncio durante el video o al final del video | Para el primer anuncio de una pausa publicitaria, 8 segundos antes de la hora de inicio del anuncio. En el caso de anuncios consecutivos, cuando comienza a reproducirse el anuncio anterior. | En el momento de inicio del anuncio |
Preguntas frecuentes
- ¿La precarga de medios carga la creatividad completa?
- No, por lo general, la creatividad no se carga por completo cuando comienza la reproducción del anuncio. El objetivo de la carga previa es mejorar la experiencia del usuario, ya que minimiza el tiempo que tarda en cargarse el anuncio. No está diseñada para admitir la publicación de anuncios sin conexión.
- ¿Se debe habilitar la carga previa de contenido multimedia para el VAST del anuncio y el contenido multimedia?
- No, el SDK siempre precarga el VAST del anuncio, independientemente de este parámetro de configuración de carga previa.