Usar una integración personalizada

Antes de empezar

En esta guía solo se incluyen las instrucciones de reproducción cuando no se usa el SDK de inserción dinámica de anuncios de IMA.

Asegúrate de haber completado los pasos que se indican en el artículo Integrar Google Ad Manager (GAM) con emisiones en directo.

Si el SDK de IMA no está disponible para la plataforma que quieres usar, tu aplicación deberá llamar a las APIs necesarias y activar las impresiones de anuncios por sí misma.

Para ello, necesitará la siguiente información:

Ubicación La región de Google Cloud en la que se creó tu configuración activa:
LOCATION
Número de proyecto El número del proyecto de Google Cloud que usa la API Video Stitcher:
PROJECT_NUMBER
Token de OAuth Token de OAuth de corta duración de una cuenta de servicio con el rol de usuario de Video Stitcher:
OAUTH_TOKEN

Consulta más información sobre cómo crear tokens de OAuth de corta duración.
Código de red El código de red de Ad Manager para solicitar anuncios:
NETWORK_CODE
ID de configuración en directo El ID de configuración en directo que especificaste al crear el evento de emisión en directo:
LIVE_CONFIG_ID
Clave de recurso personalizada La clave de recurso personalizada de Ad Manager que se genera durante el proceso de creación de una configuración para un evento de emisión en directo con la API Video Stitcher:
CUSTOM_ASSET_KEY

Enviar una solicitud de registro de stream a Ad Manager

Envía una solicitud POST al endpoint de registro de la emisión. A cambio, recibirás una respuesta JSON que contiene el ID de la emisión que debes enviar a la API de costura de vídeo.

punto final de API

POST: /ssai/pods/api/v1/network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream
Host: dai.google.com
Content-Type: application/x-www-form-urlencoded

Parámetros de ruta

NETWORK_CODE Su código de red de Google Ad Manager 360:
NETWORK_CODE
CUSTOM_ASSET_KEY El identificador personalizado asociado a este evento en Google Ad Manager:
CUSTOM_ASSET_KEY

Parámetros del cuerpo codificados en formularios

Conjunto opcional de parámetros de segmentación codificados en formato de formulario.

Respuesta (JSON)

media_verification_url URL base para enviar pings de eventos de seguimiento de la reproducción. La URL de verificación de medios completa se forma añadiendo un ID de evento de anuncio a esta URL base.
MEDIA_VERIFICATION_URL
metadata_url La URL para solicitar metadatos de pods de anuncios.
METADATA_URL
polling_frequency La frecuencia recomendada en milisegundos para sondear `metadata_url`.
POLLING_FREQUENCY
stream_id Cadena que se usa para identificar la sesión de streaming actual.
STREAM_ID
valid_for Tiempo restante hasta que caduque la sesión de streaming actual, en formato dhms (días, horas, minutos y segundos). Por ejemplo, 2h0m0.000s representa una duración de 2 horas.
valid_until Hora a la que caduca la sesión de streaming actual, como una cadena de fecha y hora ISO 8601 en formato yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm.

Solicitud de ejemplo (cURL)

curl -X POST \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -d "cust_params=\"section%3Dsports%26page%3Dgolf%2Ctennis\"" \
  https://dai.google.com/ssai/pods/api/v1/network/51636543/custom_asset/ext-doc-ps-redirect-hls/stream

Respuesta de ejemplo

{
  "stream_id":"9fe8fe4f-f12e-4fed-b509-0ca269bb1668:TUL",
  "media_verification_url":"https://dai.google.com/.../media/",
  "metadata_url":"https://dai.google.com/.../metadata",
  "session_update_url":"https://dai.google.com/.../session",
  "polling_frequency":10
}

En caso de error, se devuelven códigos de error HTTP estándar sin cuerpo de respuesta JSON.

Analiza la respuesta JSON y almacena los valores pertinentes.

Generar el URI de reproducción de la sesión

Haz una solicitud POST al endpoint /livesessions de la API Video Stitcher para crear una sesión en directo. A cambio, recibirás una respuesta JSON que contiene el manifiesto de la emisión para cargarlo en tu reproductor de vídeo.

punto final de API

POST: /v1/projects/PROJECT_NUMBER/locations/LOCATION/liveSessions
Host: videostitcher.googleapis.com
Authorization: Bearer OAUTH_TOKEN
Content-Type: application/json

Parámetros de ruta

PROJECT_NUMBER El número del proyecto de Google Cloud que usa la API Video Stitcher:
PROJECT_NUMBER
LOCATION La región de Google Cloud en la que se creó tu configuración activa:
LOCATION

Parámetro de encabezado de autorización

OAUTH_TOKEN Token de OAuth de corta duración de una cuenta de servicio con el rol de usuario de Video Stitcher:
OAUTH_TOKEN

Parámetros del cuerpo codificados en JSON

liveConfig Cadena que contiene tu número de proyecto, la ubicación y el ID de configuración activa con el siguiente formato:
projects/PROJECT_NUMBER/locations/LOCATION/liveConfigs/LIVE_CONFIG_ID
adTracking Asigna el valor "CLIENT" para habilitar el seguimiento del lado del cliente.
gamSettings Objeto que contiene el ID de la emisión con el siguiente formato:
{"streamId":"STREAM_ID"}

Respuesta (JSON)

name El nombre de la sesión en directo, que contiene el ID de sesión.
playUri El URI del manifiesto de la emisión combinada que se cargará en tu reproductor de vídeo para reproducirse.
PLAY_URI
liveConfig La misma cadena liveConfig enviada a la API en el cuerpo de tu solicitud.
gamSettings El mismo objeto gamSettings que se ha enviado a la API en el cuerpo de la solicitud.

Solicitud de ejemplo (cURL)

curl -X POST \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer OAUTH_TOKEN" \
     -d '@request.json' \
  https://videostitcher.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/liveSessions

request.json

{
  "liveConfig": "projects/PROJECT_NUMBER/locations/LOCATION/liveConfigs/LIVE_CONFIG_ID",
  "adTracking": "CLIENT",
  "gamSettings": {
    "streamId": "STREAM_ID"
  }
}

Respuesta de ejemplo

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/liveSessions/SESSION_ID",
  "playUri": PLAY_URI,
  "liveConfig": "projects/PROJECT_NUMBER/locations/LOCATION/liveConfigs/LIVE_CONFIG_ID"
  "gamSettings": {
    "streamId": STREAM_ID
  }
}

Una vez que se haya recibido la respuesta, podrá reproducir la emisión en directo con anuncios insertados haciendo referencia al URI de reproducción de la sesión del campo playUri del objeto de respuesta.

La API Video Stitcher genera un ID de sesión único para cada solicitud, que se puede obtener de la última sección del campo name del objeto de respuesta.

Las sesiones inactivas caducan al cabo de 5 minutos. Una sesión se considera inactiva si no se ha realizado ninguna solicitud de manifiesto en un periodo determinado.

Sondea los nuevos metadatos de AdBreak.

La aplicación es responsable de recuperar los metadatos de cada pausa publicitaria para saber qué impresiones se deben activar. Para ello, debes configurar un temporizador que consulte periódicamente las APIs de inserción dinámica de anuncios metadata_url para obtener información sobre los anuncios. El intervalo de sondeo se especifica en el campo polling_frequency de la respuesta de registro de la secuencia.

A cambio, recibirás un objeto JSON que contiene los siguientes parámetros:

tags Conjunto de pares clave-valor que describen los eventos multimedia de anuncios que se producirán en el flujo. Cada clave consta de los primeros 17 caracteres de un ID de recurso multimedia de anuncio que aparecerá en los metadatos ID3 de la emisión o, en el caso de los eventos `progress`, del ID de recurso multimedia de anuncio completo. Cada valor es un objeto con las siguientes propiedades:
  • ad: el ID del anuncio que contiene el evento multimedia del anuncio.
  • ad_break_id: ID de la pausa publicitaria que contiene el evento multimedia del anuncio.
  • type: el tipo de evento multimedia del anuncio. Los valores pueden ser uno de los siguientes:
    • start: el anuncio se ha iniciado.
    • firstquartile: el anuncio se ha completado en un 25 %.
    • midpoint: el anuncio se ha completado al 50 %.
    • thirdquartile: el anuncio se ha completado al 75 %.
    • complete: el anuncio ha finalizado.
    • progress: se activa cada segundo mientras se reproduce un anuncio.
ads Conjunto de pares clave-valor que describen los anuncios que aparecerán en el flujo. Cada clave es un ID de anuncio. Cada valor es un objeto con las siguientes propiedades:
  • ad_break_id: ID de la pausa publicitaria que contiene el evento multimedia del anuncio.
  • position: la posición del anuncio en la pausa publicitaria. Ten en cuenta que el primer anuncio de una pausa tiene la posición 1.
  • duration: duración del anuncio en segundos de coma flotante.
  • title: el título del anuncio, tal como se define en VAST.
  • description: la descripción del anuncio, tal como se define en VAST.
  • ad_system: el sistema publicitario, tal como se define en VAST.
  • ad_system: el ID del anuncio, tal como se define en VAST.
  • ad_system: el ID de la creatividad, tal como se define en VAST.
  • clickthrough_url: la URL que se abre cuando un usuario interactúa con el anuncio.
  • universal_ad_id: objeto que representa el ID de anuncio universal, tal como se define en VAST.
ad_breaks Un conjunto de pares clave-valor que describen los saltos publicitarios que se producirán en el flujo. Cada clave es un ID de pausa publicitaria. Cada valor es un objeto con las siguientes propiedades:
  • type: el tipo de pausa publicitaria. Los valores serán uno de los siguientes:
    • pre: representa un anuncio pre-roll.
    • mid: representa un anuncio mid-roll.
    • post: representa un anuncio post-roll.
  • duration: duración de la pausa publicitaria en segundos de coma flotante.
  • expected_duration: Duración prevista de la pausa publicitaria en segundos de coma flotante.
  • ads: el número de anuncios que contiene la pausa publicitaria.

Almacena estos valores después de cada sondeo para asociar eventos de metadatos temporizados en tu flujo de vídeo.

Solicitud de ejemplo (cURL)

curl https://dai.google.com/.../metadata/

Respuesta de ejemplo

{
   "tags":{
      "google_0492266569":{
         "ad":"0000229836_ad1",
         "ad_break_id":"0000229836",
         "type":"firstquartile"
      },
      "google_1560331148":{
         "ad":"0000229836_ad1",
         "ad_break_id":"0000229836",
         "type":"thirdquartile"
      },
      "google_1877686714378797835":{
         "ad":"0000229836_slate",
         "ad_break_id":"0000229836",
         "type":"progress"
      },
      "google_1vRyQBYPw_7Gg3MrZ6S5EjmV9aLje-YpW8QHed1DSlU":{
         "ad":"0000229835_ad1",
         "ad_break_id":"0000229835",
         "type":"progress"
      },
      "google_2032765498":{
         "ad":"0000229835_ad1",
         "ad_break_id":"0000229835",
         "type":"midpoint"
      },
      ...
      "google_5646900623":{
         "ad":"0000229837_ad1",
         "ad_break_id":"0000229837",
         "type":"complete"
      }
   },
   "ads":{
      "0000229834_ad1":{
         "ad_break_id":"0000229834",
         "position":1,
         "duration":15.01,
         "title":"truman-e2e-creativeset4",
         "description":"truman-e2e-creativeset4 ad",
         "ad_system":"GDFP",
         "ad_id":"39066884",
         "creative_id":"58092079124",
         "clickthrough_url":"https://pubads.g.doubleclick.net/...",
         "universal_ad_id":{
            "id_value":"58092079124",
            "id_registry":"GDFP"
         }
      },
      "0000229834_slate":{
         "ad_break_id":"0000229834",
         "position":-1,
         "duration":14.974977777,
         "slate":true
      },
      ...
   },
   "ad_breaks":{
      "0000229834":{
         "type":"mid",
         "duration":15.01,
         "expected_duration":29.984977776999997,
         "ads":1
      },
      ...
   }
}

Procesar eventos ID3 y registrar eventos de reproducción

Para verificar que se han producido eventos específicos en un flujo de vídeo, sigue estos pasos para gestionar eventos ID3:

  1. Almacena los eventos multimedia en una cola y guarda cada ID multimedia junto con su marca de tiempo, si el reproductor lo muestra.
  2. En cada actualización de tiempo del reproductor o con una frecuencia definida (se recomienda 500 ms), comprueba la cola de eventos multimedia para ver los eventos reproducidos recientemente comparando las marcas de tiempo de los eventos con el cabezal de reproducción.
  3. En el caso de los eventos multimedia que haya confirmado que se han reproducido, consulte el tipo buscando el ID de contenido multimedia en las etiquetas de inserción de anuncios almacenadas. Ten en cuenta que el objeto de las etiquetas de inserción publicitaria solo contiene una versión truncada del ID de contenido multimedia, limitada a los 10 primeros dígitos después del prefijo google_, por lo que no hay una coincidencia directa entre los IDs de verificación de contenido multimedia ID3 y las claves del objeto de las etiquetas. De esta forma, se evita que se envíen pings de verificación de eventos antes de que llegue el evento ID3. Para generar la URL de verificación de contenido multimedia completa de un evento de anuncio, añade el ID de evento de anuncio completo al valor de media_verification_url de la respuesta de creación de la emisión.
  4. Usa los eventos "progress" para hacer un seguimiento de si un usuario está en una pausa publicitaria. No envíe estos eventos al endpoint de verificación de medios para evitar un código de error HTTP. En el caso de otros tipos de eventos, añade el ID de contenido multimedia a la URL de verificación de contenido multimedia y haz una solicitud GET para monitorizar la reproducción.
  5. Quita el evento multimedia de la cola.

punto final de API

GET: MEDIA_VERIFICATION_URLAD_MEDIA_ID
Host: dai.google.com

Parámetros de ruta

MEDIA_VERIFICATION_URL El valor devuelto por el endpoint de registro de la emisión, en el campo media_verification_url:
MEDIA_VERIFICATION_URL
AD_MEDIA_ID El ID de recurso multimedia de anuncio completo, tal como aparece en los metadatos ID3 de la emisión:
AD_MEDIA_ID

Valores de retorno esperados

HTTP/1.1 204 No Content Respuesta vacía correcta.
HTTP/1.1 404 Not Found No se ha reconocido el ID de verificación de medios.
HTTP/1.1 409 Conflict Ya se ha enviado el ID de verificación de medios.

Solicitud de ejemplo (cURL)

curl MEDIA_VERIFICATION_URLAD_MEDIA_ID

Respuesta de ejemplo

HTTP/1.1 204 No Content

Limitaciones

Si usas la API en vistas web, se aplican las siguientes limitaciones en relación con la segmentación:

  • UserAgent el parámetro user-agent se transmite como un valor específico del navegador en lugar de la plataforma subyacente.
  • rdid, idtype, is_lat: el ID de dispositivo no se transfiere correctamente, lo que limita la funcionalidad de las siguientes funciones:
    • Limitación de frecuencia
    • Rotación de anuncios secuencial
    • Segmentación y orientación de la audiencia