Manipulador de manifiestos para transmisiones en vivo

La API de Publicación de grupos de anuncios brinda acceso a segmentos de anuncios codificados y condicionados, preparadas de manera que puedan unirse directamente a un servidor HLS orientado al usuario o MPEG-DASH. Para MPEG-DASH, la API de Pod Serving también proporciona una plantilla de manifiesto que proporciona información adicional y contexto para estos anuncios segmentos.

Esta guía se enfoca en implementar una manipulación básica del manifiesto de Publicación de grupos de anuncios para transmisiones en vivo.

Requisito previo: Configura eventos de transmisión en vivo en Google Ad Manager

Antes de realizar solicitudes desde la API de publicación de grupos de anuncios, debes crear un Administrar evento de transmisión en vivo para cada transmisión que proceses Puedes crear un de un evento de transmisión en vivo LiveStreamEventService API o el Interfaz web de Google Ad Manager.

Para usar un evento de transmisión en vivo con la API de entrega de grupos de anuncios, deberás hacer lo siguiente: para completar varios atributos de tu evento:

  • customAssetKey: Es un identificador personalizado que se usará para este evento. Debe ser únicos en todos los eventos de la red.
  • adTags: URL de etiqueta de anuncio principal generada por la coordinación de anuncios de Ad Manager en el flujo de trabajo.
  • dynamicAdInsertionType: Se debe establecer en POD_SERVING_REDIRECT.
  • streamingFormat: Se establece en HLS o DASH según corresponda.
  • segmentUrlAuthenticationKeyIds (al menos uno) Clave HMAC usarse para firmar solicitudes de segmentos de anuncios.
  • daiEncodingProfileIds: una lista de los DAIEncodingProfile IDs habilitados para este evento.
  • startDateTime: Es la fecha y hora de inicio del evento.
  • endDateTime: Es la fecha y hora de finalización programadas para este evento. Este atributo es obligatorio si unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime` - Booleano. Consulta la información mencionada con anterioridad.

Cómo recibir solicitudes de manifiesto de transmisión

Tu manipulador de manifiestos debe proporcionar un extremo de API para escuchar el manifiesto de la app cliente del reproductor de video. Como mínimo, este extremo debe recopilar un ID de transmisión de la app de reproductor cliente y debe mostrar un manifiesto de transmisión. El ID de transmisión se utiliza para identificar la sesión de transmisión al anuncio Administrador.

También debe recopilar otra información para identificar la la transmisión de contenido, por ejemplo, un ID de contenido.

Ejemplo de un extremo de solicitud de manifiesto potencial

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Parámetros de ruta
asset_key Un ID hipotético que corresponde a la transmisión en vivo solicitada en tu sistema.
format Es un parámetro hipotético que corresponde al formato de transmisión. Uno de los siguientes:
mpd Para transmisiones MPEG-DASH
m3u8 Para transmisiones HLS
Parámetros de consulta
stream_id Es el ID de transmisión de Ad Manager de la app del reproductor de video del cliente.

Recupera la transmisión de contenido

Usa el ID de contenido recopilado de la solicitud del manifiesto para seleccionar el contenido transmitir para unir anuncios.

Une segmentos de anuncios en la transmisión de contenido

La unión de las URLs de segmentos de anuncios variará según el formato de tu transmisión.

Transmisiones HLS

Las transmisiones HLS suelen entregarse como un manifiesto de múltiples variantes, que contiene un conjunto de vínculos a manifiestos de variantes, que se corresponden con cada código de perfiles.

Nota: Para simplificar, en esta guía, se presupone que el contenido multimedia HLS está codificado en un que combina audio y video en el mismo archivo de segmentos.

Playlists de múltiples variantes como proxy

Deberás reemplazar la URL de la playlist de cada variante en la multivariante original con otra llamada de extremo al manipulador para procesar la manifiesto de la variante seleccionada.

En los pasos restantes para unir HLS, se presupone que un manifiesto de variante única se está procesando.

Ejemplo de un extremo de solicitud de variante potencial
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Parámetros de ruta
asset_key Un ID hipotético que corresponde a la transmisión en vivo solicitada en tu sistema.
variant Un parámetro hipotético que contiene un identificador para la variante específica mientras se procesan.
Parámetros de consulta
stream_id Es el ID de transmisión de Ad Manager de la app del reproductor de video del cliente. se usa aquí para identificar una sesión de usuario con el manipulador de manifiestos
Ejemplo de manifiesto de multivariante sin procesar
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/360p.m3u8
Ejemplo de manifiesto de multivariante con proxy
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/1080p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/720p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/360p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS

Identifica segmentos de pausas publicitarias e inserta discontinuidades

Mientras procesa el manifiesto de variantes, realice un seguimiento de la hora de inicio, la duración y índice de la próxima pausa publicitaria hasta que se procese el manifiesto dinámico Contiene segmentos que se reemplazarán por el contenido del anuncio.

Las pausas publicitarias se pueden trazar de los segmentos de contenido de diferentes maneras, según en tu codificador. Una forma común de definir una pausa publicitaria es anteponer el anuncio segmentos con una etiqueta #EXT-X-CUE-OUT y, luego, una etiqueta #EXT-X-CUE-IN.

Para separar las pausas publicitarias alojadas en Google de los segmentos de contenido, debes insertar Etiquetas #EXT-X-DISCONTINUITY al comienzo y al final de cada pausa publicitaria. Si estos las etiquetas de discontinuidad no aparecen en el manifiesto final y la reproducción fallará.

Los URI del segmento de anuncio insertados no están encriptados. Si tu contenido está encriptado, También deberás quitar la encriptación especificando #EXT-X-KEY:METHOD=NONE antes del primer segmento publicitario de cada pausa publicitaria y, luego, volver a agregarlo después de pausa publicitaria.

Manifiesto de muestra (original)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.005,
contentorigin.com/3.ts
#EXTINF:5.005,
contentorigin.com/4.ts
#EXTINF:5.005,
contentorigin.com/5.ts
#EXTINF:5.000,d
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
Manifiesto con discontinuidades insertadas
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXTINF:5.005,
#EXT-X-DISCONTINUITY
{... New segments will go here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4

Procesa segmentos de grupos de anuncios

Para cada segmento dentro de un grupo de anuncios, debes hacer un seguimiento de algunos valores adicionales:

  • segment_number: Es el índice del segmento dentro del grupo de anuncios, que comienza con cero. O "init" para el segmento de inicialización de mp4.
  • segment_duration: Es la duración del segmento actual en milisegundos. Esta el valor debe ser el mismo para todos los segmentos, excepto el último del grupo.
  • segment_offset: El desplazamiento de segmento se calcula agregando el valor anterior duración del segmento respecto de su desplazamiento en milisegundos
  • last: Valor booleano que identifica el último segmento de un grupo de anuncios. Valores predeterminados como false.

Cómo crear URLs de segmentos de anuncios

Reemplaza cada segmento dentro de la pausa publicitaria por una URL con el siguiente formato:

/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/pod/{pod_id}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
Parámetros de ruta
network_code Es el código de red de Ad Manager 360 para esta red.
custom_asset_key La clave del activo de transmisión en vivo personalizada que se especifica en el LiveStreamEventService o en la página de transmisión en vivo en la interfaz web de Ad Manager 360.
pod_id Es el identificador de la pausa publicitaria. Debe ser un número entero que comience en 1 y aumentando en uno para cada pausa publicitaria.

Este valor debe ser el mismo para todos los usuarios que vean la misma pausa publicitaria en el evento actual.

profile_name el identificador del perfil que se solicita.
segment_number Es el índice de este segmento en el grupo de anuncios actual, a partir de cero.
Cuando se usa un contenedor MP4, se puede solicitar el segmento de inicialización configurando segment_number en "init".
Parámetros de consulta
stream_id Obligatorio El parámetro stream_id del usuario que muestra Stream Create para cada solicitud.
sd Obligatorio segment_duration
so Opcional segment_offset

Si falta so, se supone que todos los segmentos anteriores tienen la misma duración, y el desplazamiento del segmento se calcula a partir de segment_number y sd.

pd Obligatorio, excepto en el caso de los eventos con pausas publicitarias de duración indefinida habilitadas Es la duración (en milisegundos) de la pausa publicitaria. También conocido como ad_pod_duration
auth-token Obligatorio Una dirección de correo electrónico firmada y codificada en URL Token HMAC para este grupo de anuncios.
last Opcional Es un valor booleano que indica el último segmento de la pausa publicitaria. La configuración predeterminada es "false".

Los valores de los parámetros de consulta deben estar codificados correctamente para que sean seguros para URLs. Este es Es muy importante para el campo auth-token, ya que podría contener /. + y = caracteres.

Manifiesto de ejemplo (después del reemplazo del segmento)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:3.000,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2&last=true
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4

¡Felicitaciones! Estás publicando una transmisión en vivo con segmentos de anuncios proporcionados por la API de DAI Pod Serving.

Transmisiones DASH

Las transmisiones DASH se proporcionan como archivos MPD, que contienen todas las codificaciones de transmisión un solo archivo, en el que el contenido se representa como una serie de puntos.

Plantilla de período de solicitud

Solicita una plantilla de período de Google Ad Manager. Esta plantilla se convertirá en tu el período de la pausa publicitaria, una vez que se completan las macros que contiene.

Solo debes solicitar esta plantilla una vez por sesión de transmisión y almacenarla en caché reutilizar con cada pausa publicitaria.

Extremohjf de solicitud de plantilla de período
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
Parámetros de ruta
network_code Es el código de red de Ad Manager 360 del publicador.
custom_asset La clave del recurso personalizada del evento de transmisión en vivo en Google Ad Manager.
Parámetros de consulta
stream_id Es el ID de transmisión de Ad Manager del reproductor de video del cliente.
JSON de la respuesta
dash_period_template La cadena XML de la plantilla de período.
segment_duration_ms La duración de cada segmento de medios del anuncio en la plantilla del período del guion, en milisegundos.
Solicitud de ejemplo (cURL)
curl https://dai.google.com/linear/pods/v1/dash/network/21775744923/custom_asset/tears_of_steel/pods.json?stream-id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS
Ejemplo de respuesta
{"dash_period_template":"<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$> <BaseURL>https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/</BaseURL>
 <SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
  <SegmentTimeline>
    <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
  </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>

    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>",
"segment_duration_ms":5000}

Propaga la plantilla de período

La plantilla de período contiene varias macros que debe reemplazar para cada anuncio romper. Se deben reemplazar todas las macros. Las macros sin usar se deben reemplazar por string vacía ("").

Macro Descripción Ejemplo
$$pod-id$$ Es el índice del grupo de anuncios que representa este período. Este valor debe coincidir con el mismo grupo en todas las sesiones de visualizador. 1
$$period-start$$ Es el momento en el que comienza el período en la MPD actual. Un atributo opcional que se debe reemplazar por start="###", donde ### es la hora de presentación en la que comienza la pausa publicitaria. Si No se proporcionó la hora de inicio del período, por lo que se debe reemplazar esta macro con una cadena vacía. start="PT2H33M30S"
$$period-duration$$ Es la duración del período del anuncio completo. Un atributo opcional que debería se reemplazará por duration="###", donde ### es el del período del anuncio en el formato de duración DASH estándar. Si el botón no se proporciona la duración del período. Esta macro se debe reemplazar por un una cadena vacía. duration="PT15S"
$$pod-duration$$ Es la duración esperada de la decisión de los anuncios para este grupo, en milisegundos. 15000
$$number-of-repeated-segments$$ Para calcular este valor, se divide la duración del período del anuncio (en milisegundos) por el valor de segment_duration_ms y se redondea a número entero más cercano. 3
$$cust_params$$ Esta macro se puede reemplazar por los parámetros de segmentación personalizados únicos para la pausa publicitaria actual. que se proporcionan. El valor debe tener el siguiente formato: en esta sección de Ad Manager artículo del Centro de ayuda. Si no se necesitan parámetros personalizados, esta macro se debe reemplazar por un campo vacío una cadena vacía. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ Esta macro se debe reemplazar por un valor scte35 único para esa pausa publicitaria si se proporciona uno. Si no se necesita información de scte35, esta macro debe reemplazarse por una cadena vacía. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ Una dirección de correo electrónico firmada y codificada en URL Token HMAC. Este token es obligatorio. custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
Plantilla de período sin procesar, que contiene macros
<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$>
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/
  </BaseURL>
  <SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">  
    <SegmentTimeline>
      <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>
Período del anuncio propagado
<Period id="pod-0" start="PT5H50M12S">
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
  </BaseURL>
  <SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=">
    <SegmentTimeline>
      <S d="5" r="1"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
      <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    </Representation>
  </AdaptationSet>
  <AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
      <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    </Representation>
  </AdaptationSet>
</Period>

Inserta el período completado en el manifiesto de DASH

Finalmente, reemplaza el punto correspondiente en tu manifiesto sin procesar con el del anuncio propagado y devolverá el manifiesto unido final al período de de video para la reproducción.

Ejemplo de manifiesto de contenido sin procesar
<?xml version="1.0"?>
  <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
    <BaseURL>
      http://example.com/tears_of_steel/
    </BaseURL>
    <Period start="PT0S">
      <AdaptationSet bitstreamSwitching="true">

        <Representation id="0" codecs="avc1" mimeType="video/mp4" width="1920" height="1080" startWithSAP="1" bandwidth="500000">
          <SegmentBase>
            <Initialization sourceURL="segments/1080/1.m4s" range="0-862"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segments/1080p/2.m4s" mediaRange="863-7113"/>
            <SegmentURL media="segments/1080p/3.m4s" mediaRange="7114-14104"/>
            <SegmentURL media="segments/1080p/4.m4s" mediaRange="14105-17990"/>
            ...
          </SegmentList>
        </Representation>

        <Representation id="1" codecs="avc1" mimeType="video/mp4" width="1280" height="720" startWithSAP="1" bandwidth="250000">
          <SegmentBase>
            <Initialization sourceURL="segments/720p/1.m4s" range="0-864"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segments/720p/2.m4s" mediaRange="865-11523"/>
            <SegmentURL media="segments/720p/3.m4s" mediaRange="11524-25621"/>
            <SegmentURL media="segments/720p/4.m4s" mediaRange="25622-33693"/>
            ...
          </SegmentList>
        </Representation>

        <Representation id="1" codecs="avc1" mimeType="video/mp4" width="640" height="480" startWithSAP="1" bandwidth="100000">
          <SegmentBase>
            <Initialization sourceURL="segment/480p/1.m4s" range="0-865"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segment/480p/2.m4s" mediaRange="866-26970"/>
            <SegmentURL media="segment/480p/3.m4s" mediaRange="26971-72543"/>
            <SegmentURL media="segment/480p/4.m4s" mediaRange="72544-95972"/>
            ...
          </SegmentList>
        </Representation>
        ...
      </AdaptationSet>
    </Period end>
  </MPD>
Ejemplo de manifiesto unido
<?xml version="1.0"?>
  <MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
    <BaseURL>
      http://example.com/tears_of_steel/
    </BaseURL>
    
    <Period id="pod-0" start="PT5H50M12S">
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
  </BaseURL>
  <SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$">
    <SegmentTimeline>
      <S d="5" r="1"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
      <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    </Representation>
  </AdaptationSet>
  <AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
      <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    </Representation>
  </AdaptationSet>
</Period>
    
</MPD>

¡Felicitaciones! Ahora estás publicando una transmisión en vivo de DASH con segmentos de anuncios proporcionados la API de DAI Pod Serving.

Recursos adicionales