Manifestatore per i live streaming

L'API Pod Serving fornisce accesso a segmenti di annunci codificati e condizionati, preparati in modo tale da poter essere uniti direttamente in un HLS rivolto all'utente o una playlist multimediale 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 evento in live streaming di Ad Manager per ogni stream elaborato. Puoi creare un evento di live streaming utilizzando LiveStreamEventService API o la interfaccia web di Google Ad Manager.

Per utilizzare l'API di pubblicazione pod con un evento in live streaming, 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: impostalo su HLS o DASH di conseguenza.
  • 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 programmata dell'evento. Questo attributo è obbligatorio se unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime` - booleano. Vedi sopra.

Ricevere richieste di manifest dello stream

Il manipolatore di 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 client del player e restituire un manifest dello stream cucito. L'ID stream viene utilizzato per identificare la sessione di streaming in Ad Manager.

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

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 gli stream HLS
Parametri di query
stream_id L'ID stream di Ad Manager dall'app del video player client.

Recupera lo stream di contenuti

Utilizza l'ID contenuto raccolto dalla richiesta manifest per selezionare lo stream di contenuti da unire agli 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.

Stream HLS

Gli stream HLS vengono in genere 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 che combina audio e video nello stesso file di segmento.

Playlist multivarianti 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 l'unione HLS presuppongono che sia in corso l'elaborazione di un singolo file manifest della variante.

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 dell'app del video player client, utilizzato qui per identificare una sessione utente con il manipolatore 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 multivariabile 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

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: indice del segmento all'interno del pod di annunci, che inizia da zero. In alternativa, "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 seguente formato:

/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/{pod_identifier}/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 dell'asset live streaming personalizzato specificata nell'API LiveStreamEventService o nella pagina del live streaming nell'interfaccia web di Ad Manager 360.
pod_identifier

Sono supportati i seguenti formati:

pod/{integer}

L'identificatore numerico dell'interruzione pubblicitaria corrente. Gli ID pod di annunci sono assegnati in modo incrementale a ogni evento di interruzione pubblicitaria, a partire da 1.

ad_break_id/{string}

L'identificatore di stringa dell'interruzione pubblicitaria corrente.

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 contenitore 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 richiesta di creazione dell'stream.
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 nell'interruzione pubblicitaria. Il valore predefinito è false.

I valori dei parametri di query devono essere codificati correttamente per essere sicuri per 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/ad_break_id/adbreak1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=ad_break_id%3adbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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 dello stream in un unico file, in cui i contenuti sono rappresentati come una serie di periodi.

Modello di 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 con ogni interruzione pubblicitaria.

Endpoint richiesta modello di periodohjf
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 live streaming in Google Ad Manager.
Parametri di query
stream_id L'ID stream di Ad Manager dal video player del cliente.
JSON risposta
dash_period_template La stringa XML del modello di periodo.
segment_duration_ms La durata, in millisecondi, di ogni segmento di contenuti multimediali dell'annuncio nel modello di periodo del dashboard.
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 per lo stesso pod in tutte le sessioni degli spettatori. 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 è fornita, questa macro deve essere sostituita con una stringa vuota. start="PT2H33M30S"
$$period-duration$$ La durata del periodo completo 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 per i quali deve essere presa una decisione 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 al numero intero più vicino. 3
$$cust_params$$ Questa macro può essere sostituita dai parametri di targeting personalizzato specifici per la interruzione pubblicitaria corrente, se forniti. 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, se fornito. 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 periodo appropriato nel manifest non elaborato con il periodo dell'annuncio appena compilato e restituisci il manifest finale unito al client video che ha effettuato la richiesta 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