Manifestatore per i live streaming

L'API Pod Serving fornisce l'accesso a segmenti di annunci codificati e condizionati, preparati in modo tale da poter essere uniti direttamente a una playlist multimediale HLS o MPEG-DASH rivolta all'utente. Per MPEG-DASH, l'API Pod Serving fornisce anche un modello manifest per fornire informazioni e contesto aggiuntivi per questi segmenti di annunci.

Questa guida si concentra sull'implementazione di un server di manipolazione del manifest di pubblicazione dei pod di base per i live streaming.

Prerequisito: configurazione degli eventi in live streaming in Google Ad Manager

Prima di effettuare richieste dall'API Pod Serving, devi creare un evento live streaming Ad Manager per ogni stream elaborato. Puoi creare un evento in live streaming utilizzando LiveStreamEventService API o l'interfaccia web di Google Ad Manager.

Per utilizzare un evento in live streaming con l'API di pubblicazione pod, devi compilare diversi attributi dell'evento:

  • customAssetKey: un identificatore personalizzato da utilizzare per questo evento. Deve essere univoco per tutti gli eventi della rete.
  • adTags: URL del tag annuncio principale generato dal flusso di lavoro di gestione del traffico di Ad Manager.
  • dynamicAdInsertionType: deve essere impostato su POD_SERVING_REDIRECT.
  • streamingFormat: imposta il valore su HLS o DASH a seconda dei casi.
  • segmentUrlAuthenticationKeyIds: almeno una chiave HMAC utilizzata per firmare le richieste di segmenti di annunci.
  • daiEncodingProfileIds: un elenco degli ID DAIEncodingProfile abilitati per questo evento.
  • startDateTime: la data e l'ora di inizio dell'evento
  • endDateTime: la data e l'ora di fine pianificate dell'evento. Questo attributo è obbligatorio se unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime" - valore booleano. Vedi sopra.

Ricevi richieste relative al manifest del flusso

Il manipolatore del manifest deve fornire un endpoint API per ascoltare le richieste di manifest dall'app client del video player. Come minimo, questo endpoint deve raccogliere un ID stream dall'app del player client e restituire un manifest dello stream con stitching. L'ID streaming viene utilizzato per identificare la sessione di streaming in Ad Manager.

Devi raccogliere anche altre informazioni per identificare lo stream di contenuti appropriato, ad esempio un Content ID.

Esempio di potenziale endpoint di richiesta del manifest

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Parametri del percorso
asset_key Un ID ipotetico corrispondente al live streaming richiesto nel tuo sistema.
format Un parametro ipotetico corrispondente al formato dello stream. Uno dei seguenti:
mpd Per stream MPEG-DASH
m3u8 Per gli stream HLS
Parametri di ricerca
stream_id L'ID stream di Ad Manager dall'app del video player del client.

Recuperare lo stream di contenuti

Utilizza l'ID contenuto raccolto dalla richiesta del file manifest per selezionare lo stream di contenuti da unire agli annunci.

Unisci segmenti di annunci nello stream di contenuti

L'unione degli URL dei segmenti di annunci varia in base al formato dello stream.

Flussi HLS

Gli stream HLS vengono generalmente pubblicati come manifest multivariante, che contiene un insieme di link ai manifest delle varianti, che corrispondono a ciascuno dei profili di codifica.

Nota. Per semplicità, questa guida presuppone che i contenuti multimediali HLS siano codificati in un formato che integra audio e video nello stesso file di segmento.

Playlist multivarianti proxy

Dovrai sostituire l'URL della playlist di ogni variante nella playlist multivariante originale con un'altra chiamata dell'endpoint al manipolatore per elaborare il manifest della variante selezionata dal player.

I passaggi rimanenti per lo stitching di HLS presuppongono che il manifest di una singola variante sia in fase di elaborazione.

Esempio di endpoint di richiesta di variante potenziale
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Parametri del percorso
asset_key Un ID ipotetico corrispondente al live streaming richiesto nel tuo sistema.
variant Un parametro ipotetico contenente un identificatore per la variante specifica in elaborazione.
Parametri di ricerca
stream_id L'ID stream di Ad Manager dall'app del video player del client. Utilizzato qui per identificare una sessione utente con il manipolatore del manifest.
Esempio di manifest multivariante non elaborato
#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
Esempio di manifest 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 i segmenti di interruzione pubblicitaria e inserisci le discontinuità

Durante l'elaborazione del file manifest delle varianti, tieni traccia dell'ora di inizio, della durata e dell'indice della prossima interruzione pubblicitaria imminente, finché il manifest dinamico in fase di elaborazione non contiene segmenti che verranno sostituiti dal contenuto dell'annuncio.

Le interruzioni pubblicitarie possono essere definite dai segmenti di contenuti in modi diversi, a seconda del codificatore. Un modo comune per delineare un'interruzione pubblicitaria è quello di inserire un tag #EXT-X-CUE-OUT all'inizio dei segmenti annunci e seguirli con un tag #EXT-X-CUE-IN.

Per separare le interruzioni pubblicitarie ospitate da Google dai segmenti di contenuti, devi inserire i tag #EXT-X-DISCONTINUITY all'inizio e alla fine di ogni interruzione pubblicitaria. Se questi tag di discrepanza non vengono visualizzati nel file manifest finale, la riproduzione non andrà a buon fine.

Gli URI del segmento di annuncio inseriti non sono criptati. Se i contenuti sono criptati, dovrai anche rimuovere la crittografia specificando #EXT-X-KEY:METHOD=NONE prima del primo segmento di annuncio di ogni interruzione pubblicitaria, quindi aggiungerlo di nuovo dopo l'interruzione pubblicitaria.

Manifest di esempio (originale)
#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
Manifest con discontinuità inserite
#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

Elabora i segmenti di pod di annunci

Per ogni segmento all'interno di un pod di annunci, devi monitorare alcuni valori aggiuntivi:

  • segment_number: segmenta l'indice all'interno del pod di annunci, iniziando con zero. Oppure "init" per il segmento di inizializzazione mp4.
  • segment_duration: durata del segmento corrente in millisecondi. Questo valore deve essere lo stesso per tutti i segmenti tranne l'ultimo nel pod.
  • segment_offset: offset del segmento calcolato aggiungendo la durata del segmento precedente all'offset in millisecondi
  • last: valore booleano che identifica l'ultimo segmento in un pod di annunci. Il valore predefinito è false.

Crea URL per i segmenti di annunci

Sostituisci ogni segmento all'interno dell'interruzione pubblicitaria con un URL nel 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)
Parametri del percorso
network_code Il codice di rete Ad Manager 360 per questa rete.
custom_asset_key La chiave asset live streaming personalizzata specificata nell'API LiveStreamEventService o nella pagina del live streaming nell'interfaccia web di Ad Manager 360.
pod_id Identificatore per l'interruzione pubblicitaria. Deve essere un numero intero che parte da 1 e aumenta di uno per ogni interruzione pubblicitaria.

Questo valore deve essere uguale per tutti gli utenti che visualizzano la stessa interruzione pubblicitaria nell'evento attuale.

profile_name Identificatore del profilo richiesto.
segment_number L'indice di questo segmento all'interno del pod di annunci corrente, a partire da zero.
Quando utilizzi il container MP4, il segmento di inizializzazione può essere richiesto impostando segment_number su "init".
Parametri di ricerca
stream_id Obbligatorio Parametro stream_id dell'utente restituito dalla richiesta di creazione dello stream.
sd Obbligatorio segment_duration
so Facoltativo segment_offset

Se so non è presente, si presume che i segmenti precedenti abbiano tutti la stessa durata e che l'offset del segmento venga calcolato da segment_number e sd.

pd Obbligatorio, ad eccezione degli eventi con interruzioni pubblicitarie senza durata attivate La durata (in millisecondi) dell'interruzione pubblicitaria. Chiamato anche ad_pod_duration.
auth-token Obbligatorio Un token HMAC firmato e con codifica URL per questo pod di annunci.
last Facoltativo Valore booleano che indica l'ultimo segmento dell'interruzione pubblicitaria. Il valore predefinito è false.

Per essere sicuri per l'URL, i valori dei parametri di query devono essere codificati correttamente. Questo è particolarmente importante per il campo auth-token, poiché potrebbe contenere i caratteri /, + e =.

Manifest di esempio (dopo la sostituzione 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

Complimenti! Ora stai pubblicando un live streaming con segmenti di annunci forniti dall'API DAI Pod Serving.

Stream DASH

Gli stream DASH vengono forniti come file MPD, che contiene tutte le codifiche degli stream in un unico file, dove i contenuti sono rappresentati come una serie di punti.

Modello di periodo di richiesta

Richiedi un modello di periodo da Google Ad Manager. Una volta compilate le macro che contiene, questo modello diventerà il tuo periodo di interruzione pubblicitaria.

Devi richiedere questo modello una sola volta per sessione di streaming e memorizzarlo nella cache per riutilizzarlo a ogni interruzione pubblicitaria.

Endpoint richiesta modello periodo hjf
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
Parametri del percorso
network_code Il codice di rete Ad Manager 360 del publisher.
custom_asset La chiave asset personalizzata dell'evento in live streaming in Google Ad Manager.
Parametri di ricerca
stream_id L'ID stream di Ad Manager dal video player del client.
JSON risposta
dash_period_template La stringa XML del modello del periodo.
segment_duration_ms La durata in millisecondi di ogni segmento multimediale pubblicitario nel modello del periodo da trattino.
Richiesta di esempio (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
Esempio di risposta
{"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}

Compila il modello del periodo

Il modello del periodo contiene diverse macro da sostituire per ogni interruzione pubblicitaria. Tutte le macro devono essere sostituite. Le macro inutilizzate devono essere sostituite con una stringa vuota ("").

Macro Descrizione Esempio
$$pod-id$$ L'indice del pod di annunci rappresentato da questo periodo. Questo valore deve corrispondere allo stesso pod in tutte le sessioni di visualizzazione. 1
$$period-start$$ L'ora di inizio del ciclo nel file MPD corrente. Un attributo facoltativo che deve essere sostituito da start="###", dove ### è l'ora di presentazione in cui inizia l'interruzione pubblicitaria. Se l'ora di inizio del periodo non viene indicata, questa macro deve essere sostituita con una stringa vuota. start="PT2H33M30S"
$$period-duration$$ La durata del periodo dell'annuncio completo. Un attributo facoltativo che deve essere sostituito con duration="###", dove ### è la durata del periodo pubblicitario nel formato di durata DASH standard. Se la durata del periodo non viene indicata, questa macro deve essere sostituita con una stringa vuota. duration="PT15S"
$$pod-duration$$ La durata prevista degli annunci da stabilire per questo pod, in millisecondi. 15000
$$number-of-repeated-segments$$ Questo valore viene calcolato dividendo la durata del periodo annuncio (in millisecondi) per il valore di segment_duration_ms e arrotondando per eccesso al numero intero più vicino. 3
$$cust_params$$ Questa macro può essere sostituita dai parametri di targeting personalizzato univoci per l'interruzione pubblicitaria corrente, se fornito. Il valore deve essere formattato come descritto in questo articolo del Centro assistenza Ad Manager. Se non sono necessari parametri personalizzati, questa macro deve essere sostituita con una stringa vuota. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ Questa macro deve essere sostituita da un valore scte35 univoco per l'interruzione pubblicitaria, se disponibile. Se non sono necessarie informazioni scte35, questa macro deve essere sostituita con una stringa vuota. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ Un token HMAC firmato e con codifica URL. Questo token è obbligatorio. custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
Modello di periodo non elaborato, contenente macro
<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>
Periodo dell'annuncio compilato
<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>

Inserisci il ciclo inserito nel manifest DASH

Infine, sostituisci il punto appropriato nel file manifest non elaborato con il periodo dell'annuncio appena completato e restituisci il file manifest finale con unione al client video richiedente affinché venga riprodotto.

Esempio di manifest di contenuti non elaborati
<?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>
Esempio di manifest con unione
<?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>

Complimenti! Ora stai pubblicando un live streaming DASH con segmenti di annunci forniti dall'API DAI Pod Serving.

Altre risorse