Manifestatore per i live streaming

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

Questa guida è incentrata sull'implementazione di una manipolazione di base del manifest di pubblicazione dei pod un server web per i live streaming.

Prerequisito: configurare gli eventi di live streaming in Google Ad Manager

Prima di effettuare qualsiasi richiesta dall'API di pubblicazione dei pod, devi creare un Gestisci l'evento in live streaming per ogni stream che elabori. Puoi creare un un evento in live streaming utilizzando LiveStreamEventService API o il Interfaccia web di Google Ad Manager.

Per utilizzare un evento in live streaming con l'API Pod Serving, è necessario: compilare diversi attributi dell'evento:

  • customAssetKey: un identificatore personalizzato da utilizzare per questo evento. Deve essere univoci in tutti gli eventi della rete.
  • adTags. URL del tag annuncio principale generato dalla gestione del traffico di Ad Manager nel tuo flusso di lavoro.
  • dynamicAdInsertionType: deve essere impostato su POD_SERVING_REDIRECT.
  • streamingFormat: impostala su HLS o DASH a seconda del caso.
  • segmentUrlAuthenticationKeyIds - almeno uno Chiave HMAC utilizzati per firmare richieste di segmento di annunci.
  • daiEncodingProfileIds: un elenco dei DAIEncodingProfile ID attivati per questo evento.
  • startDateTime: la data e l'ora di inizio dell'evento
  • endDateTime: la data e l'ora di fine programmata dell'evento. Questo attributo è obbligatorio se unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime` - Booleano. Vedi sopra.

Ricevi richieste di manifest dello stream

Il manipolatore del manifest deve fornire un endpoint API per l'ascolto del manifest dall'app client del video player. Come minimo, questo endpoint deve devono raccogliere un ID stream dall'app player client e restituire uno stitching manifest dello stream. L'ID stream viene utilizzato per identificare la sessione di streaming sull'annuncio Gestore.

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

Esempio di un potenziale endpoint di richiesta di 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 flussi HLS
Parametri di query
stream_id L'ID stream di Ad Manager dall'app video player del client.

Recupera lo stream di contenuti

Utilizza il Content ID raccolto dalla richiesta del file manifest per selezionare i contenuti uno stream per eseguire lo stitching con gli annunci.

Unisci i segmenti di annunci nello stream di contenuti

Gli URL dei segmenti di annunci di unione saranno diversi a seconda del formato dello stream.

Flussi HLS

Gli stream HLS vengono solitamente pubblicati come manifest multivariante, che contiene un di link ai manifest delle varianti, che corrispondono a ogni profili.

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

Playlist multivariante proxy

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

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

Esempio di un potenziale endpoint per la richiesta di varianti
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 fase di elaborazione.
Parametri di query
stream_id L'ID stream di Ad Manager dall'app 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 inviato tramite 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

Identificare i segmenti di interruzioni pubblicitarie e inserire le discontinuità

Man mano che elabori il manifest della variante, tieni traccia di ora di inizio, durata e indice della successiva interruzione pubblicitaria imminente, fino all'elaborazione del manifest dinamico contiene segmenti che verranno sostituiti dal contenuto dell'annuncio.

Le interruzioni pubblicitarie possono essere distinte dai segmenti di contenuti in modi diversi, a seconda sul tuo codificatore. Un modo comune per delineare un'interruzione pubblicitaria è quello di far precedere l'annuncio segmenti con un tag #EXT-X-CUE-OUT e seguirlo con un tag #EXT-X-CUE-IN.

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

Gli URI dei segmenti di annunci inseriti non sono criptati. Se i tuoi contenuti sono criptati, dovrai anche rimuovere la crittografia specificando #EXT-X-KEY:METHOD=NONE prima del primo segmento di ogni interruzione pubblicitaria e poi riaggiungilo dopo il un'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à inserito
#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 dovrebbe essere lo stesso per tutti i segmenti tranne l'ultimo nel pod.
  • segment_offset: l'offset del segmento calcolato sommando il valore precedente dalla durata del segmento all'offset del segmento in millisecondi
  • last: valore booleano che identifica l'ultimo segmento in un pod di annunci. Valori predefiniti su false.

Creare URL dei segmenti di annunci

Sostituisci ogni segmento all'interno dell'interruzione pubblicitaria con un URL del 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 per il live streaming personalizzata specificata in LiveStreamEventService dell'API di Google Cloud o nella pagina di live streaming dell'interfaccia web di Ad Manager 360.
pod_id Identificatore dell'interruzione pubblicitaria. Deve essere un numero intero che inizia da 1 e aumentando di uno per ogni interruzione pubblicitaria.

Questo valore deve essere lo stesso per tutti gli utenti che visualizzano la stessa interruzione pubblicitaria in l'evento attuale.

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

Se so manca, si presume che i segmenti precedenti siano tutti hanno la stessa durata e l'offset del segmento viene calcolato segment_number e sd.

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

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

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! Stai pubblicando un live streaming con segmenti di annunci forniti da l'API DAI Pod Serving.

Stream DASH

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

Modello periodo di richiesta

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

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

Endpointhjf richiesta modello di periodo
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 query
stream_id L'ID stream Ad Manager dal video player del cliente.
JSON risposta
dash_period_template La stringa XML del modello di periodo.
segment_duration_ms La durata di ogni segmento multimediale dell'annuncio nel modello di periodo tratteggiato, in millisecondi.
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 di periodo contiene varie macro da sostituire per ogni annuncio pausa. Tutte le macro devono essere sostituite. Le macro inutilizzate devono essere sostituite con stringa vuota ("").

Macro Descrizione Esempio
$$pod-id$$ L'indice del pod di annunci rappresentato da questo periodo. Questo valore deve corrispondere a lo 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 dovrebbe essere sostituito da start="###", dove ### è l'ora di presentazione in cui inizia l'interruzione pubblicitaria. Se l'ora di inizio del periodo non è specificata, questa macro deve essere sostituita con una stringa vuota. start="PT2H33M30S"
$$period-duration$$ La durata dell'intero periodo dell'annuncio. Un attributo facoltativo che deve verrà sostituito da duration="###", dove ### è il durata del periodo dell'annuncio nel formato di durata DASH standard. Se durata massima del periodo, questa macro deve essere sostituita con stringa vuota. duration="PT15S"
$$pod-duration$$ La durata prevista degli annunci da decidere per questo pod, in millisecondi. 15000
$$number-of-repeated-segments$$ Questo valore viene calcolato dividendo la durata del periodo dell'annuncio (in millisecondi) per il valore di segment_duration_ms e arrotondando per eccesso a 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 descritte in questo Ad Manager Articolo del Centro assistenza. Se non sono necessari parametri personalizzati, questa macro deve essere sostituita con un parametro stringa. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ Questa macro deve essere sostituita da un valore scte35 univoco per l'interruzione pubblicitaria in questione, se disponibile. Se non sono necessarie informazioni scte35, questa macro essere sostituita con una stringa vuota. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ Un token firmato con codifica URL Token HMAC. 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 la mestruazione completata nel manifest DASH

Infine, sostituisci il punto appropriato nel manifest non elaborato con il nuovo dell'annuncio completato e restituire il manifest finale unito alla richiesta client video per la riproduzione.

Esempio di manifest dei 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 file manifest unito
<?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! Stai pubblicando un live streaming DASH con i segmenti di annunci forniti dall'API DAI Pod Serving.

Risorse aggiuntive