El SDK de IMA HTML5 admite playlists de anuncios completamente automatizadas. Esta función inserta pausas publicitarias en el contenido, como se especifica en Google Ad Manager, cuando publicas tus anuncios. También simplifica en gran medida el código del reproductor de video necesario para admitir pausas publicitarias, incluidos los anuncios previos al video, durante el video y al final del video.
- Cuando se crea el
AdsManager
, se pasa un objetocontentPlayback
con la llamada getAdsManager. Este objeto debe tener una propiedadcurrentTime
que devuelva la posición actual del cabezal de reproducción del video. Si usas un elementovideo
HTML5 para mostrar tu contenido, puedes pasar ese elemento al SDK. Este objeto se usa para hacer un seguimiento del progreso de la reproducción del contenido, de modo que las pausas publicitarias se inserten automáticamente en los momentos especificados en Ad Manager. También debes informarle al SDK que quieres que controle el estado del contenido en tu nombre.var adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsManager = adsManagerLoadedEvent.getAdsManager( videoContent, adsRenderingSettings); // See API reference for contentPlayback.
- Para asegurarte de que se reproduzcan los anuncios al final del video, debes informarle al SDK cuando finalice tu contenido. Esto es un poco complicado, ya que, en algunos casos, el SDK usa tu reproductor de video para reproducir anuncios, por lo que debes asegurarte de solo informarle al SDK cuando termina tu contenido y no cuando termina un anuncio. Puedes hacerlo con el siguiente código:
var videoContent = document.getElementById('contentElement'); var contentEndedListener = function() {adsLoader.contentComplete();}; videoContent.addEventListener('ended', contentEndedListener); function onContentPauseRequested() { contentElement.removeEventListener('ended', contentEndedListener); ... } function onContentResumeRequested() { contentElement.addEventListener('ended', contentEndedListener); ... }
- Los eventos
CONTENT_PAUSE_REQUESTED
yCONTENT_RESUME_REQUESTED
se usan para pausar y reanudar el contenido cuando se reproducen las pausas publicitarias. - Si tu reproductor de video admite el arrastre para avanzar y la propiedad de hora actual del reproductor de video se actualiza mientras el usuario arrastra, el SDK no puede diferenciar entre el contenido que avanza de forma normal y un usuario que avanza por el contenido.
Debes usar un objeto contentPlayback personalizado como parámetro para
getAdsManager
. Para ver un ejemplo de este caso de uso, consulta Los problemas con el salto.
Nota: Cuando se termine de reproducir el contenido o el usuario detenga la reproducción, asegúrate de llamar a AdsLoader.contentComplete para indicarle al SDK que el contenido está listo. Luego, el SDK reproduce la pausa publicitaria al final del video, si se programó una. El evento ALL_ADS_COMPLETED
se genera cuando se reproducen TODAS las pausas publicitarias. Además, ten en cuenta que el seguimiento de contenido comienza cuando se llama a init()
y que siempre debes llamar a init()
antes de reproducir contenido.
Cómo inhabilitar la reproducción automática de las pausas publicitarias
En algunas circunstancias, es posible que quieras evitar que el SDK reproduzca las pausas publicitarias hasta que esté todo listo para ellas. En este caso, puedes inhabilitar la reproducción automática de las pausas publicitarias para informarle al SDK cuándo tienes todo listo para que se reproduzca una pausa publicitaria. Con esta configuración, una vez que el SDK cargó una pausa publicitaria, activa un evento AD_BREAK_READY
. Cuando el reproductor esté listo para que comience la pausa publicitaria, puedes llamar a adsManager.start():
function requestAds() {} ... adsLoader.getSettings().setAutoPlayAdBreaks(false); ... } function onAdsManagerLoaded() { ... // For non-auto ad breaks, listen for ad break ready adsManager.addEventListener( google.ima.AdEvent.Type.AD_BREAK_READY, adBreakReadyHandler); ... } function adBreakReadyHandler() { // Once we're ready to play ads. To skip this ad break, simply return // from this handler without calling adsManager.start(). adsManager.start(); }
Probar
Consulta el siguiente código para ver una implementación que funciona.
El problema con el salto
Si usas reglas de anuncios, es posible que tengas un problema con el salto con clic y arrastre. Específicamente, después de que un usuario hace clic y arrastra para saltar el video más allá de varios grupos de anuncios durante el video, es posible que vea 2 o más de esos grupos de anuncios reproducirse uno tras otro antes de que se reanude el contenido. Esto se debe a que la hora de la barra de reproducción del video se actualiza mientras el usuario avanza. Si el SDK sondea la hora actual mientras el usuario avanza más allá de un anuncio, es posible que piense que se debe reproducir. Cuando se reanuda el contenido, se reproduce ese anuncio y, luego, el más reciente desde el salto. Para ver una representación visual de este problema, consulta el siguiente diagrama:

Guarda la hora actual cuando el usuario comienza a buscar y, luego, informa esa hora cuando el SDK la solicite hasta que el usuario reanude la reproducción normal. Para ver una representación visual de esta solución, consulta el siguiente diagrama:

Con esta solución, omites correctamente el anuncio durante el video de 0:10 y solo reproduces el de 0:20.
Esto se hace con un rastreador de cabezal de reproducción personalizado en el siguiente fragmento de código. Este código contiene modificaciones (que se muestran en negrita) de ads.js
en la muestra avanzada de HTML5 disponible en nuestra página de descarga.
var Ads = function(application, videoPlayer) { ... this.currentTime = 0; setInterval(this.updateCurrentTime, 1000); }; Ads.prototype.updateCurrentTime = function() { if (!this.videoPlayer_.contentPlayer.seeking) { this.currentTime = this.videoPlayer_.contentPlayer.currentTime; } }; Ads.prototype.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) { this.application_.log('Ads loaded.'); this.adsManager_ = adsManagerLoadedEvent.getAdsManager(this); this.processAdsManager_(this.adsManager_); };
Problemas conocidos con Safari para dispositivos móviles
Este método debería funcionar en todas las plataformas, excepto en Safari para dispositivos móviles. En Safari para dispositivos móviles, la propiedad de búsqueda de la etiqueta de video no se implementa correctamente (siempre muestra un valor falso). Para evitarlo, debes hacer tu propia verificación para ver si el usuario está saltando partes del video. A continuación, se muestra el código de muestra de este método. Una vez más, las líneas en negrita son modificaciones en el código existente.
var Ads = function(application, videoPlayer) { ... this.currentTime = 0; setInterval(this.updateCurrentTime, 1000); this.seeking = false; this.seekCheckInterval = 1000; // You may need to adjust this value, depending on your platform this.seekThreshold = 100; this.previousTime = 0; setInterval( Application.bind(this, this.checkForSeeking), this.seekCheckInterval); }; Ads.prototype.updateCurrentTime = function() { if (!this.seeking) { this.currentTime = this.videoPlayer_.contentPlayer.currentTime; } }; Ads.prototype.checkForSeeking = function() { var currentTime = this.videoPlayer_.contentPlayer.currentTime; // How much time has passed since you last ran this method, in milliseconds var diff = (currentTime - this.previousTime) * 1000; // If that difference is greater than the time since you last ran this method, // plus the threshold, the user was seeking if (Math.abs(diff) > this.interval + this.threshold) { this.seeking = true; } else { this.seeking = false; } // Grab the current video time again to make up for time spent in this method previousTime = this.videoPlayer_.contentPlayer.currentTime; }; Ads.prototype.onAdsManagerLoaded_ = function(adsManagerLoadedEvent) { this.application_.log('Ads loaded.'); this.adsManager_ = adsManagerLoadedEvent.getAdsManager(this); this.processAdsManager_(this.adsManager_); };
Con estos cambios, el SDK ahora usa la propiedad currentTime de tu objeto Ads
para determinar cuándo reproducir las pausas publicitarias, no la propiedad currentTime
del reproductor de video de contenido.