En esta guía, se explica cómo desarrollar una aplicación cliente para cargar una transmisión en vivo de HLS o DASH con la API de Pod Serving y tu manipulador de manifiestos.
Requisitos previos
Antes de continuar, debes tener lo siguiente:
Es una clave de recurso personalizada para un evento de transmisión en vivo configurado con el tipo de DAI
Pod serving redirect
. Para obtener esta clave, sigue estos pasos:Usa una biblioteca cliente de la API de SOAP para llamar al método
LiveStreamEventService.createLiveStreamEvents
con un objetoLiveStreamEvent
y la propiedaddynamicAdInsertionType
establecida en el valor de enumeraciónPOD_SERVING_REDIRECT
. Para todas las bibliotecas cliente, consulta Bibliotecas cliente y código de ejemplo.
Determina si el SDK de Interactive Media Ads (IMA) está disponible para tu plataforma. Te recomendamos que uses el SDK de IMA para aumentar los ingresos. Para obtener más detalles, consulta Configura el SDK de IMA para la DAI.
Realiza una solicitud de transmisión
Cuando el usuario seleccione una transmisión, haz lo siguiente:
Realiza una solicitud
POST
al método del servicio de transmisión en vivo. Para obtener más detalles, consulta Método: stream.Pasa parámetros de segmentación de anuncios en formatos
application/x-www-form-urlencoded
oapplication/json
. Esta solicitud registra una sesión de transmisión con la DAI de Google.En el siguiente ejemplo, se realiza una solicitud de transmisión:
Codificación de formularios
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());
Codificación JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());
Si se ejecuta de forma correcta, verás un resultado similar al siguiente:
{ "stream_id": "8d2b2292-6356-4c0e-94be-cece01d2df2e:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }
En la respuesta JSON, busca el ID de sesión de transmisión y almacena otros datos para los pasos posteriores.
Metadatos de anuncios de encuesta
Para sondear los metadatos de los anuncios, haz lo siguiente:
Lee el valor de
metadata_url
de la respuesta de registro de la transmisión.Realiza una solicitud
GET
al extremo. Para obtener más detalles, consulta Método: metadata.En el siguiente ejemplo, se recuperan los metadatos del anuncio:
const response = await fetch(metadata_url); console.log(await response.json());
Si se ejecuta correctamente, recibirás la respuesta PodMetadata para las pausas publicitarias actuales y futuras:
{ "tags":{ "google_5555555555":{ "ad":"0000229834_ad1", "ad_break_id":"0000229834", "type":"firstquartile" }, "google_1234567890123456789":{ "ad":"0000229834_ad1", "ad_break_id":"0000229834", "type":"progress" }, ... }, "ads":{ "0000229834_ad1":{ "ad_break_id":"0000229834", "position":1, "duration":15, "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0000229834":{ "type":"mid", "duration":15, "ads":1 }, ... } }
Guarda el objeto
tags
para los pasos posteriores.Establece un temporizador con el valor
polling_frequency
para solicitar metadatos de forma periódica para todos los intervalos publicitarios sucesivos.
Carga la transmisión en tu reproductor de video
Después de obtener el ID de sesión de la respuesta de registro, pásalo al manipulador de manifiestos o crea una URL de manifiesto para cargar la transmisión en un reproductor de video.
Para pasar el ID de sesión, consulta la documentación del manipulador de manifiestos. Si desarrollas un manipulador de manifiestos, consulta Manipulador de manifiestos para transmisiones en vivo.
En el siguiente ejemplo, se ensambla una URL de manifiesto:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
Cuando el reproductor esté listo, comienza la reproducción.
Cómo detectar eventos de anuncios
Verifica el formato del contenedor de tu transmisión para los metadatos cronometrados:
Las transmisiones HLS con contenedores de Transport Stream (TS) usan etiquetas ID3 cronometradas para transportar metadatos cronometrados. Para obtener más información, consulta Acerca del formato de aplicación de medios común con HTTP Live Streaming (HLS).
Los flujos de DASH usan elementos
EventStream
para especificar eventos en el manifiesto.Las transmisiones DASH usan elementos
InbandEventStream
cuando los segmentos contienen casillas de Mensaje de evento (emsg
) para los datos de carga útil, incluidas las etiquetas ID3. Para obtener más detalles, consulta InbandEventStream.Los flujos de CMAF, incluidos DASH y HLS, usan casillas
emsg
que contienen etiquetas ID3.
Para recuperar las etiquetas ID3 de tu transmisión, consulta la guía de tu reproductor de video. Para obtener más información, consulta la guía para controlar metadatos cronometrados.
Para recuperar el ID del evento de anuncio de las etiquetas ID3, haz lo siguiente:
- Filtra los eventos por
scheme_id_uri
conurn:google:dai:2018
ohttps://aomedia.org/emsg/ID3
. Extrae el array de bytes del campo
message_data
.En el siguiente ejemplo, se decodifican los datos de
emsg
en JSON:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1234567890123456789", ... }
Filtra las etiquetas ID3 con el formato
TXXXgoogle_{ad_event_ID}
:TXXXgoogle_1234567890123456789
Mostrar datos de eventos de anuncios
Para encontrar el objeto TagSegment
, haz lo siguiente:
Recupera el objeto de metadatos del anuncio
tags
de Metadatos del anuncio de sondeo. El objetotags
es un array de objetosTagSegment
.Usa el ID completo del evento del anuncio para encontrar un objeto
TagSegment
con el tipoprogress
.Usa los primeros 17 caracteres del ID del evento del anuncio para encontrar un objeto
TagSegment
de otros tipos.Después de obtener el
TagSegment
, usa la propiedadad_break_id
como clave para encontrar el objetoAdBreak
en el objetoad_breaks
de metadatos del anuncio.En el siguiente ejemplo, se busca un objeto
AdBreak
:{ "type":"mid", "duration":15, "ads":1 }
Usa los datos de
TagSegment
yAdBreak
para mostrar información sobre la posición del anuncio en la pausa publicitaria. Por ejemplo,Ad 1 of 3
.
Envía pings de verificación de medios
Para cada evento de anuncio, excepto el tipo progress
, envía un ping de verificación de medios.
La DAI de Google descarta los eventos progress
, y enviar estos eventos con frecuencia podría afectar el rendimiento de tu app.
Para generar la URL de verificación de medios completa de un evento de anuncio, haz lo siguiente:
En la respuesta de transmisión, agrega el ID completo del evento del anuncio al valor
media_verification_url
.Realiza una solicitud
GET
con la URL completa:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_5555555555123456789`; const response = await fetch(completeUrl);
Si la operación se realiza correctamente, recibirás una respuesta con el código de estado
202
. De lo contrario, recibirás un código de error404
.
Puedes usar el Monitor de actividad de transmisión (SAM) para inspeccionar un registro histórico de todos los eventos de anuncios. Para obtener más información, consulta cómo supervisar y solucionar problemas de una transmisión en vivo.