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.createLiveStreamEventscon un objeto- LiveStreamEventy la propiedad- dynamicAdInsertionTypeestablecida en el valor de enumeración- POD_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 - POSTal 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-urlencodedo- application/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_urlde la respuesta de registro de la transmisión.
- Realiza una solicitud - GETal 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 - tagspara los pasos posteriores.
- Establece un temporizador con el valor - polling_frequencypara 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 - EventStreampara especificar eventos en el manifiesto.
- Las transmisiones DASH usan elementos - InbandEventStreamcuando 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 - emsgque 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_uriconurn:google:dai:2018ohttps://aomedia.org/emsg/ID3.
- Extrae el array de bytes del campo - message_data.- En el siguiente ejemplo, se decodifican los datos de - emsgen 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 - tagsde Metadatos del anuncio de sondeo. El objeto- tagses un array de objetos- TagSegment.
- Usa el ID completo del evento del anuncio para encontrar un objeto - TagSegmentcon el tipo- progress.
- Usa los primeros 17 caracteres del ID del evento del anuncio para encontrar un objeto - TagSegmentde otros tipos.
- Después de obtener el - TagSegment, usa la propiedad- ad_break_idcomo clave para encontrar el objeto- AdBreaken el objeto- ad_breaksde metadatos del anuncio.- En el siguiente ejemplo, se busca un objeto - AdBreak:- { "type":"mid", "duration":15, "ads":1 }
- Usa los datos de - TagSegmenty- AdBreakpara 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 - GETcon 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 error- 404.
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.