Comienza ahora

Los SDK de IMA facilitan la integración de los anuncios multimedia en sus sitios web y aplicaciones. Los SDK de IMA pueden solicitar anuncios de cualquier servidor de anuncios compatible con VAST y administrar la reproducción de anuncios en sus aplicaciones. Con los SDK del cliente de IMA, usted controla la reproducción del contenido de video, mientras que el SDK controla la reproducción de anuncios. Los anuncios se reproducen en un reproductor de video independiente ubicado encima del reproductor de video de contenido de la app.

En esta guía, se muestra cómo integrar el SDK de IMA en una app de reproductor de video simple. Si desea ver o seguir una integración de muestra completa, descargue el ejemplo simple de GitHub. Si le interesa usar un reproductor HTML5 con el SDK preintegrado, consulte el complemento del SDK de IMA para video.js.

Descripción general del cliente de IMA

La implementación del cliente de IMA implica cuatro componentes principales del SDK, que se muestran en esta guía:

  • AdDisplayContainer: Un objeto de contenedor en el que se renderizan los anuncios.
  • AdsLoader: Un objeto que solicita anuncios y controla eventos de respuestas de solicitud de anuncios. Solo debes crear una instancia de cargador de anuncios, que puedes volver a usar durante la vida útil de la aplicación.
  • AdsRequest: un objeto que define una solicitud de anuncios. Las solicitudes de anuncios especifican la URL de la etiqueta de anuncio de VAST y parámetros adicionales, como las dimensiones del anuncio.
  • AdsManager: Un objeto que contiene la respuesta a la solicitud de anuncios, controla la reproducción de anuncios y detecta eventos de anuncios que activa el SDK.

Requisitos previos

Necesitarás lo siguiente antes de comenzar:

  • Tres archivos vacíos:
    • index.html
    • style.css
    • ads.js
  • Python instalado en tu computadora o un servidor web para usar en las pruebas

1. Inicia un servidor de desarrollo

Dado que el SDK de IMA carga las dependencias a través del mismo protocolo que el de la página en la que se carga, debe usar un servidor web para probar su aplicación. La manera más simple de iniciar un servidor de desarrollo local es usar el servidor integrado de Python.

  1. Mediante una línea de comandos, desde el directorio que contiene tu archivo index.html, ejecuta:
      python -m http.server 8000
    
  2. En un navegador web, ve a http://localhost:8000/

También puedes usar cualquier otro servidor web, como el servidor HTTP Apache.

2. Crea un reproductor de video simple

Primero, modifica index.html para crear un elemento de video HTML5 simple que se encuentre en un elemento de unión, y un botón para activar la reproducción. Agrega también las etiquetas necesarias para cargar los archivos style.css y ads.js. Luego, modifica styles.css a fin de que el reproductor de video sea responsivo para dispositivos móviles. Por último, en ads.js, activa la reproducción de video cuando se haga clic en el botón de reproducción.

index.html

<!doctype html>
<html lang="en">
  <head>
    <title>IMA HTML5 Simple Demo</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <div id="page-content">
      <div id="video-container">
        <video id="video-element">
          <source src="https://storage.googleapis.com/interactive-media-ads/media/android.mp4">
          <source src="https://storage.googleapis.com/interactive-media-ads/media/android.webm">
        </video>
      </div>
      <button id="play-button">Play</button>
    </div>
    <script src="ads.js"></script>
  </body>
</html>

style.css
#page-content {
  position: relative;
  /* this element's width controls the effective height */
  /* of the video container's padding-bottom */
  max-width: 640px;
  margin: 10px auto;
}

#video-container {
  position: relative;
  /* forces the container to match a 16x9 aspect ratio */
  /* replace with 75% for a 4:3 aspect ratio, if needed */
  padding-bottom: 56.25%;
}

#video-element {
  /* forces the contents to fill the container */
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
ads.js
var videoElement;

// On window load, attach an event to the play button click
// that triggers playback on the video element
window.addEventListener('load', function(event) {
  videoElement = document.getElementById('video-element');
  var playButton = document.getElementById('play-button');
  playButton.addEventListener('click', function(event) {
    videoElement.play();
  });
});

Después de completar este paso, cuando abras index.html en tu navegador (mediante tu servidor de desarrollo), deberías poder ver el elemento de video y el video debe comenzar cuando haces clic en el botón de reproducción.

3. Importe el SDK de IMA

A continuación, agrega el marco de trabajo de IMA con una etiqueta de secuencia de comandos en index.html, antes de la etiqueta para ads.js.

index.html
...

        </video>
      </div>
      <button id="play-button">Play</button>
    </div>
    <script src="//imasdk.googleapis.com/js/sdkloader/ima3.js"></script>
    <script src="ads.js"></script>
  </body>
</html>

4. Adjuntar controladores de página y de reproductor de video

Para modificar el comportamiento del reproductor de video con JavaScript, agrega controladores de eventos que activen las siguientes acciones:

  • Cuando la página termine de cargarse, inicialice el SDK de IMA.
  • Cuando se haga clic en el botón de reproducción de video, cargue los anuncios (a menos que ya se hayan cargado).
  • Cuando cambie el tamaño de la ventana del navegador, actualice el elemento de video y las dimensiones adsManager a fin de que la página sea responsiva para dispositivos móviles
ads.js
var videoElement;
// Define a variable to track whether there are ads loaded and initially set it to false
var adsLoaded = false;

window.addEventListener('load', function(event) {
  videoElement = document.getElementById('video-element');
  initializeIMA();
  videoElement.addEventListener('play', function(event) {
    loadAds(event);
  });
  var playButton = document.getElementById('play-button');
  playButton.addEventListener('click', function(event) {
    videoElement.play();
  });
});

window.addEventListener('resize', function(event) {
  console.log("window resized");
});

function initializeIMA() {
  console.log("initializing IMA");
}

function loadAds(event) {
  // Prevent this function from running on if there are already ads loaded
  if(adsLoaded) {
    return;
  }
  adsLoaded = true;

  // Prevent triggering immediate playback when ads are loading
  event.preventDefault();

  console.log("loading ads");
}

5. Cree el contenedor de anuncios

En la mayoría de los navegadores, el SDK de IMA usa un elemento de contenedor de anuncios dedicado para mostrar anuncios y elementos de IU relacionados con anuncios. El tamaño de este contenedor debe superponerse para el elemento de video desde la esquina superior izquierda. El objeto adsManager establece la altura y el ancho de los anuncios que se colocan en este contenedor, por lo que no necesitas configurar estos valores de forma manual.

Para implementar este elemento contenedor de anuncios, primero crea un div nuevo dentro del elemento video-container. Luego, actualiza el CSS para que coloque el elemento en la esquina superior izquierda de la video-element. Por último, define una variable para el contenedor dentro de la función initializeIMA() que se ejecuta cuando se carga la página.

index.html
...

  <div id="video-container">
    <video id="video-element" controls>
      <source src="https://storage.googleapis.com/interactive-media-ads/media/android.mp4">
      <source src="https://storage.googleapis.com/interactive-media-ads/media/android.webm">
    </video>
    <div id="ad-container"></div>
  </div>

...
style.css
...

#ad-container {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
}
ads.js
var videoElement;
var adsLoaded = false;
var adContainer;

...

function initializeIMA() {
  console.log("initializing IMA");
  adContainer = document.getElementById('ad-container');
}

6. Inicializa AdsLoader y realiza una solicitud de anuncios

Para solicitar un conjunto de anuncios, crea una instancia de ima.AdsLoader. Esta instancia toma un objeto AdDisplayContainer como entrada y puede usarse para procesar objetos ima.AdsRequest asociados con una URL de etiqueta de anuncio especificada. La etiqueta que se usa en este ejemplo contiene un anuncio previo al video de 10 segundos. Puede probar esta URL o cualquier otra con el Inspector de paquetes de video de IMA.

Como práctica recomendada, solo mantén una instancia de ima.AdsLoader durante todo el ciclo de vida de una página. Para realizar solicitudes de anuncios adicionales, crea un nuevo objeto ima.AdsRequest, pero vuelve a usar el mismo ima.AdsLoader. Para obtener más información, consulte las Preguntas frecuentes del SDK de IMA.

ads.js
var videoElement;
var adsLoaded = false;
var adContainer;
var adDisplayContainer;
var adsLoader;

...

function initializeIMA() {
  console.log("initializing IMA");
  adContainer = document.getElementById('ad-container');
  adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, videoElement);
  adsLoader = new google.ima.AdsLoader(adDisplayContainer);

  // Let the AdsLoader know when the video has ended
  videoElement.addEventListener('ended', function() {
    adsLoader.contentComplete();
  });

  var adsRequest = new google.ima.AdsRequest();
  adsRequest.adTagUrl = 'https://pubads.g.doubleclick.net/gampad/ads?' +
      'iu=/21775744923/external/single_ad_samples&sz=640x480&' +
      'cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90&' +
      'gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator=';

  // Specify the linear and nonlinear slot sizes. This helps the SDK to
  // select the correct creative if multiple are returned.
  adsRequest.linearAdSlotWidth = videoElement.clientWidth;
  adsRequest.linearAdSlotHeight = videoElement.clientHeight;
  adsRequest.nonLinearAdSlotWidth = videoElement.clientWidth;
  adsRequest.nonLinearAdSlotHeight = videoElement.clientHeight / 3;

  // Pass the request to the adsLoader to request ads
  adsLoader.requestAds(adsRequest);
}

7. Cómo detectar eventos de AdsLoader

Cuando los anuncios se cargan correctamente, el ima.AdsLoader emite un evento ADS_MANAGER_LOADED. Analiza el evento que se pasa a la devolución de llamada para inicializar el objeto AdsManager. AdsManager carga los anuncios individuales según lo definido por la respuesta a la URL de la etiqueta de anuncio.

Además, asegúrese de controlar cualquier error que pueda ocurrir durante el proceso de carga. Si no se cargan los anuncios, asegúrate de que la reproducción de contenido multimedia continúe sin anuncios para no interferir en la experiencia del usuario.

ads.js
var videoElement;
var adsLoaded = false;
var adContainer;
var adDisplayContainer;
var adsLoader;
var adsManager;

...

function initializeIMA() {
  console.log("initializing IMA");
  adContainer = document.getElementById('ad-container');
  adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, videoElement);
  adsLoader = new google.ima.AdsLoader(adDisplayContainer);
  adsLoader.addEventListener(
      google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,
      onAdsManagerLoaded,
      false);
  adsLoader.addEventListener(
      google.ima.AdErrorEvent.Type.AD_ERROR,
      onAdError,
      false);

...

function onAdsManagerLoaded(adsManagerLoadedEvent) {
  // Instantiate the AdsManager from the adsLoader response and pass it the video element
  adsManager = adsManagerLoadedEvent.getAdsManager(
      videoElement);
}

function onAdError(adErrorEvent) {
  // Handle the error logging.
  console.log(adErrorEvent.getError());
  if(adsManager) {
    adsManager.destroy();
  }
}

8. Cómo iniciar el administrador de anuncios

Para iniciar la reproducción de anuncios, debes iniciar el AdsManager. Para admitir totalmente los navegadores para dispositivos móviles, esto se debe activar mediante una interacción del usuario.

ads.js
...

function loadAds(event) {
  // prevent this function from running on every play event
  if(adsLoaded) {
    return;
  }
  adsLoaded = true;

  // prevent triggering immediate playback when ads are loading
  event.preventDefault();

  console.log("loading ads");

  // Initialize the container. Must be done via a user action on mobile devices.
  videoElement.load();
  adDisplayContainer.initialize();

  var width = videoElement.clientWidth;
  var height = videoElement.clientHeight;
  try {
    adsManager.init(width, height, google.ima.ViewMode.NORMAL);
    adsManager.start();
  } catch (adError) {
    // Play the video without ads, if an error occurs
    console.log("AdsManager could not be started");
    videoElement.play();
  }
}

...

9. Cómo hacer que AdsManager sea receptivo

A fin de garantizar que los anuncios cambien de tamaño de forma dinámica para coincidir con el tamaño del reproductor de video, si la pantalla cambia de tamaño o de orientación, el evento de cambio de tamaño de la ventana debe llamar a adsManager.resize().

ads.js
...

window.addEventListener('resize', function(event) {
  console.log("window resized");
  if(adsManager) {
    var width = videoElement.clientWidth;
    var height = videoElement.clientHeight;
    adsManager.resize(width, height, google.ima.ViewMode.NORMAL);
  }
});

...

10. Cómo detectar eventos de AdsManager

El AdsManager también activa varios eventos que deben controlarse. Estos eventos se usan para realizar un seguimiento de los cambios de estado, activar la reproducción y pausar el video de contenido, y registrar errores.

Maneja los errores

El controlador de errores creado para AdsLoader puede funcionar como controlador de errores de AdsManager mediante la adición de un nuevo controlador de eventos con la misma función de devolución de llamada.

ads.js
...

function onAdsManagerLoaded(adsManagerLoadedEvent) {
  adsManager = adsManagerLoadedEvent.getAdsManager(
      videoElement);

  adsManager.addEventListener(
      google.ima.AdErrorEvent.Type.AD_ERROR,
      onAdError);
}

...

Cómo activar eventos de reproducción y pausa

Cuando el AdsManager está listo para insertar un anuncio para que se muestre, se activa el evento CONTENT_PAUSE_REQUESTED. Para controlar este evento, activa una pausa en el reproductor de video subyacente. Del mismo modo, cuando un anuncio se completa, el AdsManager activa el evento CONTENT_RESUME_REQUESTED. Para manejar este evento, reinicia la reproducción en el video de contenido subyacente.

ads.js
...

function onAdsManagerLoaded(adsManagerLoadedEvent) {
  adsManager = adsManagerLoadedEvent.getAdsManager(
      videoElement);

  adsManager.addEventListener(
      google.ima.AdErrorEvent.Type.AD_ERROR,
      onAdError);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED,
      onContentPauseRequested);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED,
      onContentResumeRequested);
}

...

function onContentPauseRequested() {
  videoElement.pause();
}

function onContentResumeRequested() {
  videoElement.play();
}

Activar clics para detener en dispositivos móviles

Como AdContainer se superpone al elemento de video, los usuarios no pueden interactuar directamente con el reproductor subyacente. Esto puede confundir a los usuarios de dispositivos móviles, que esperan poder presionar un reproductor de video para pausar la reproducción. Para solucionar este problema, el SDK de IMA pasa los clics que no maneja IMA de la superposición de anuncios al elemento AdContainer, donde se pueden manejar. Esto no se aplica a los anuncios lineales en navegadores que no sean móviles, ya que cuando se hace clic en el anuncio se abre el vínculo de clics.

Para implementar la función de hacer clic para pausar, agrega un controlador de clics a AdContainer y activa eventos de reproducción o pausa en el video subyacente.

ads.js
...

function initializeIMA() {
  console.log("initializing IMA");
  adContainer = document.getElementById('ad-container');
  adContainer.addEventListener('click', adContainerClick);
  adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, videoElement);
  adsLoader = new google.ima.AdsLoader(adDisplayContainer);

...

function adContainerClick(event) {
  console.log("ad container clicked");
  if(videoElement.paused) {
    videoElement.play();
  } else {
    videoElement.pause();
  }
}

...

Cómo activar la reproducción en anuncios no lineales

El AdsManager detiene el video de contenido cuando un anuncio está listo para reproducirse, pero este comportamiento no considera los anuncios no lineales, en los que el contenido debe seguir reproduciéndose mientras se muestra el anuncio. A fin de admitir anuncios no lineales, escucha el AdsManager para emitir el evento LOADED. Luego, verifica si el anuncio es lineal y, de lo contrario, reanuda la reproducción en el elemento de video.

ads.js
...

function onAdsManagerLoaded(adsManagerLoadedEvent) {
  adsManager = adsManagerLoadedEvent.getAdsManager(
      videoElement);

  adsManager.addEventListener(
      google.ima.AdErrorEvent.Type.AD_ERROR,
      onAdError);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED,
      onContentPauseRequested);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED,
      onContentResumeRequested);
  adsManager.addEventListener(
      google.ima.AdEvent.Type.LOADED,
      onAdLoaded);
}

...

function onAdLoaded(adEvent) {
  var ad = adEvent.getAd();
  if (!ad.isLinear()) {
    videoElement.play();
  }
}

Listo. Ahora está solicitando y mostrando anuncios con el SDK de IMA. Para obtener más información sobre las funciones avanzadas del SDK, consulta las otras guías o las muestras en GitHub.