Configura el SDK de IMA para la DAI

Selecciona la solución de DAI que te interesa

Publicación de grupos de anuncios de DAI

Los SDK de IMA simplifican la integración de anuncios multimedia en tus sitios web y aplicaciones.

Los SDKs de IMA pueden solicitar anuncios de cualquier servidor de anuncios compatible con VAST y administrar la reproducción de anuncios en tus aplicaciones.

Con los SDKs de IMA DAI, las apps realizan una solicitud de transmisión para el video de contenido y el anuncio, ya sea para contenido de VOD o en vivo. Luego, el SDK devuelve una transmisión de video combinada, por lo que no tienes que administrar el cambio entre el anuncio y el video de contenido en tu app.

En esta guía, se muestra cómo reproducir una transmisión de DAI Pod Serving con el SDK de IMA DAI para CAF.

Antes de usar esta guía, familiarízate con el protocolo del receptor web del marco de trabajo de la aplicación de Chromecast. En esta guía, se supone que tienes conocimientos básicos sobre los conceptos del receptor de CAF, como los interceptores de mensajes y los objetos mediaInformation, y que sabes usar la herramienta de control y comando de Cast para emular un emisor de CAF.

Para usar la Publicación de grupos de anuncios de DAI de IMA, debes trabajar con un socio de Publicación de grupos de anuncios y tener una cuenta de Ad Manager 360 Advanced. Si tienes una cuenta de Ad Manager, comunícate con tu administrador de cuentas para obtener más detalles. Para obtener información sobre cómo registrarte en Ad Manager, visita el Centro de ayuda de Ad Manager.

Para obtener información sobre la integración con otras plataformas o el uso de los SDKs de IMA del cliente, consulta SDKs de Interactive Media Ads.

Descripción general de la Publicación de grupos de anuncios de DAI de IMA

La implementación de Pod Serving con el SDK de CAF de DAI de IMA implica dos componentes principales, que se demuestran en esta guía:

  • StreamRequest: Objeto que define una solicitud de transmisión a los servidores de anuncios de Google. Las solicitudes especifican un código de red, una clave de recurso personalizada y una clave de API opcional, así como otros parámetros opcionales.
  • StreamManager: Es un objeto que controla la comunicación entre la transmisión de video y el SDK de DAI de IMA, como el envío de pings de seguimiento y el reenvío de eventos de transmisión al publicador.

Requisitos previos

  • Una cuenta de Cast Developer Console con dispositivos de prueba registrados
  • Una app de receptor web alojada que esté registrada en tu Consola para desarrolladores de Cast y que se pueda modificar para alojar el código que proporciona esta guía.
  • Una app de envío configurada para usar tu app de receptor web. Para los fines de este ejemplo, usa la herramienta de comando y control de Cast como dispositivo de envío.

Configura los objetos MediaInfo del remitente

Primero, configura el objeto MediaInfo de tu app del remitente para que incluya los siguientes campos:

Campo Contenido
contentId Es un identificador único para este elemento multimedia.

CONTENT_ID

contentUrl Opcional. Es la URL de la transmisión de copia de seguridad que se reproducirá si no se carga la transmisión de DAI.

BACKUP_STREAM_URL

contentType Opcional. Es el tipo de MIME de las transmisiones de copia de seguridad del contenido. Solo se necesita para las transmisiones de DASH.

CONTENT_STREAM_MIMETYPE

streamType El literal de cadena o la constante que se usa para este valor varía según la plataforma del remitente.
customData El campo customData contiene un almacén de pares clave-valor de campos obligatorios adicionales. En este ejemplo, contiene los parámetros de la transmisión de DAI. En una app de producción, podrías pasar un identificador que tu app de receptor de transmisión usaría para recuperar estos parámetros con una solicitud del servidor.
Campo Contenido
daiStreamType Es el tipo de transmisión de DAI. Puede ser "LIVE" o "VOD".

DAI_STREAM_TYPE

networkCode Es el código de red de tu cuenta de Google Ad Manager 360.

NETWORK_CODE

customAssetKey Este campo solo es necesario para las transmisiones en vivo. Es la clave del recurso personalizado que identifica tu evento de Pod Serving en Google Ad Manager 360.

CUSTOM_ASSET_KEY

apiKey Es una clave de API opcional para recuperar un ID de transmisión del SDK de IMA DAI.

API_KEY

A continuación, se incluyen algunas muestras de código que te ayudarán a comenzar:

Web

Para configurar estos valores en un remitente web de Cast, primero crea un objeto MediaInfo con los datos necesarios y, luego, realiza una solicitud de carga al receptor web.

// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "CONTENT_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
  daiStreamType: "DAI_STREAM_TYPE",
  networkCode: "NETWORK-CODE",
  customAssetKey: "CUSTOM_ASSET_KEY",
  apiKey: "API_KEY"
};

// Make load request to cast web receiver
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
const request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
  () => { console.log('Load succeed'); },
  (errorCode) => { console.log('Error code: ' + errorCode); });

Android

Para configurar estos valores en un remitente web de Cast, primero crea un objeto MediaInfo con los datos necesarios y, luego, realiza una solicitud de carga al receptor web.

JSONObject customData = new JSONObject()?
  .put("daiStreamType", "DAI_STREAM_TYPE")
  .put("networkCode", "NETWORK-CODE")
  .put("customAssetKey", "CUSTOM_ASSET_KEY")
  .put("apiKey", "API_KEY");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
  .setContentUrl("BACKUP_STREAM_URL")
  .setContentType("CONTENT_STREAM_MIMETYPE")
  .setStreamType(MediaInfo.STREAM_TYPE_LIVE)
  .setCustomData(customData)
  .build();

RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
remoteMediaClient.load(new MediaLoadRequestData.Builder().setMediaInfo(mediaInfo).build());

iOS (Obj-C)

Para configurar estos valores en un remitente web de Cast, primero crea un objeto GCKMediaInformation con los datos necesarios y, luego, realiza una solicitud de carga al receptor web.

NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
  @"daiStreamType": @"DAI_STREAM_TYPE",
  @"networkCode": @"NETWORK-CODE",
  @"customAssetKey": @"CUSTOM_ASSET_KEY",
  @"apiKey": @"API_KEY"};
mediaInfoBuilder.customData = customData;

GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE";
mediaInfoBuilder.streamType = GCKMediaStreamTypeLive;
mediaInfoBuilder.customData = customData;
self.mediaInformation = [mediaInfoBuilder build];

GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
  request.delegate = self;
}

iOS (Swift)

Para configurar estos valores en un remitente web de Cast, primero crea un objeto GCKMediaInformation con los datos necesarios y, luego, realiza una solicitud de carga al receptor web.

let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
  print("invalid mediaURL")
  return
}

let customData = [
  "daiStreamType": "DAI_STREAM_TYPE",
  "networkCode": "NETWORK-CODE",
  "customAssetKey": "CUSTOM_ASSET_KEY",
  "region": "API_KEY"
]

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE"
mediaInfoBuilder.streamType = GCKMediaStreamType.Live
mediaInfoBuilder.customData = customData
mediaInformation = mediaInfoBuilder.build()

guard let mediaInfo = mediaInformation else {
  print("invalid mediaInformation")
  return
}

if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia
(mediaInfo) {
  request.delegate = self
}

Herramienta de CAC

Para configurar estos valores en la herramienta de comando y control de Cast, haz clic en la pestaña Load Media y establece el tipo de solicitud de carga personalizada en LOAD. Luego, reemplaza los datos JSON en el área de texto por este JSON:

{
  "media": {
    "contentId": "CONTENT_ID",
    "contentUrl": "BACKUP_STREAM_URL",
    "contentType": ""CONTENT_STREAM_MIMETYPE"",
    "streamType": "LIVE",
    "customData": {
      "daiStreamType": "DAI_STREAM_TYPE",
      "networkCode": "NETWORK-CODE",
      "customAssetKey": "CUSTOM_ASSET_KEY",
      "oAuthToken": "API_KEY"
    }
  }
}

Esta solicitud de carga personalizada se puede enviar al receptor para probar el resto de los pasos.

Crea un receptor de CAF básico

Crea un receptor web personalizado, como se muestra en la Guía del receptor web personalizado del SDK de CAF.

El código del receptor debería verse de la siguiente manera:

<html>
<head>
  <script
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
  </script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    // ...
  </script>
</body>
</html>

Importa el SDK de IMA DAI y obtén el administrador de reproductores

Agrega una etiqueta de secuencia de comandos para importar el SDK de IMA DAI para CAF a tu receptor web, justo después de que la secuencia de comandos cargue CAF. En la etiqueta de secuencia de comandos, almacena el contexto del receptor y el administrador del reproductor como constantes antes de iniciar el receptor.

<html>
<head>
  <script
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
  <script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();

    castContext.start();
  </script>
</body>
</html>

Inicializa el IMA Stream Manager

Inicializa el IMA Stream Manager.

<html>
<head>
  <script type="text/javascript"
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
  <script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();
    const streamManager = new google.ima.cast.dai.api.StreamManager();

    castContext.start();
  </script>
</body>
</html>

Crea el interceptor de carga de Stream Manager

Antes de que tus elementos multimedia se pasen a CAF, crea tu solicitud de transmisión en un interceptor de mensajes LOAD.

    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();
    const streamManager = new google.ima.cast.dai.api.StreamManager();

    /**
     * Creates a livestream request object for a Pod Serving stream.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {StreamRequest} an IMA stream request
     */
    const createStreamRequest = (castRequest) => { /* ... */};

    /**
     * Initates a DAI stream request for the final stream manifest.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
     */
    const createDAICastRequest = (castRequest) => {
        return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
          .then((castRequestWithPodStreamData) => {
            console.log('Successfully made DAI stream request.');
            // ...
            return castRequestWithPodStreamData;
          })
          .catch((error) => {
            console.log('Failed to make DAI stream request.');
            // CAF will automatically fallback to the content URL
            // that it can read from the castRequest object.
            return castRequest;
          });
    };

    playerManager.setMessageInterceptor(
        cast.framework.messages.MessageType.LOAD, createDAICastRequest);

    castContext.start();

Crea la solicitud de transmisión

Completa la función createStreamRequest para crear una transmisión de Pod Serving basada en la solicitud de carga de la CAF.

    /**
     * Creates a livestream request object for a Pod Serving stream.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {StreamRequest} an IMA stream request
     */
    const createStreamRequest = (castRequest) => {
      const customData = castRequest.media.customData;
      let streamRequest;
      if (customData.daiStreamType == "LIVE") {
        streamRequest = new google.ima.cast.dai.api.PodStreamRequest();
        streamRequest.customAssetKey = customData.customAssetKey;
        streamRequest.networkCode = customData.networkCode;
        streamRequest.apiKey = customData.apiKey;
      } else if (customData.daiStreamType == "VOD") {
        streamRequest = new google.ima.cast.dai.api.PodVodStreamRequest();
        streamRequest.networkCode = customData.networkCode;
        streamRequest.apiKey = customData.apiKey;
      }
      return streamRequest;
    };

Recupera el manifiesto unido de tu VTP

Si tu solicitud de transmisión se realiza correctamente, usa streamManager.getStreamId() para recuperar el ID de la transmisión. Tu socio técnico de video (VTP) o tu manipulador de manifiestos personalizado te proporcionará instrucciones para recuperar una URL de manifiesto con este ID de transmisión.

Una vez que hayas recuperado la URL del manifiesto, reemplaza el contentUrl existente por el nuevo manifestUrl.

Por último, antes de devolver el manifiesto de transmisión modificado, llama al método loadStreamMetadata en tu streamManager para informar al SDK de IMA que puede solicitar de forma segura los metadatos de la transmisión. Esta llamada solo es necesaria para las transmisiones de VOD.

    /**
     * Initates a DAI stream request for the final stream manifest.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
     */
    const createDAICastRequest = (castRequest) => {
        return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
          .then((castRequestWithPodStreamData) => {
            console.log('Successfully made DAI stream request.');

            // This is a sample VTP integration. Consult your VTP documentation
            // for how to retrieve an ad-stitched stream manifest URL.
            const manifestTemplate = "https://.../manifest.m3u8?gam_stream_id=[[STREAMID]]";
            const streamId = streamManager.getStreamId();
            const manifestUrl = manifestTemplate.replace('[[STREAMID]]', streamId)
            // Assign your manifestUrl to the request's content URL.
            castRequestWithPodStreamData.media.contentUrl = manifestUrl;

            // After generating the manifest URL, VOD streams must notify the
            // IMA SDK that it is safe to request ad pod metadata.
            // This is only necessary for VOD streams. It is a no-op for
            // livestreams, so no conditional is needed.
            streamManager.loadStreamMetadata();

            return castRequestWithPodStreamData;
          })
          .catch((error) => {
            console.log('Failed to make DAI stream request.');
            // CAF will automatically fallback to the content URL
            // that it can read from the castRequest object.
            return castRequest;
          });
    };

Limpia los recursos de la DAI de IMA

Cuando hayas terminado de solicitar y mostrar anuncios en una transmisión de Pod Serving con el SDK de IMA DAI, te sugerimos que limpies los recursos después de que finalice la sesión de Pod Serving. Llama a StreamManager.destroy() para detener la reproducción de la transmisión, detener todo el seguimiento de anuncios y liberar todos los recursos de transmisión cargados.