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 suPOD_SERVING_REDIRECT
.streamingFormat
: impostala suHLS
oDASH
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'eventoendDateTime
: la data e l'ora di fine programmata dell'evento. Questo attributo è obbligatorio seunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis 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:
|
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 millisecondilast
: 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 |
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}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&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&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&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&sd=5000&pd=30000&cust_params=&auth-token=&scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&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&sd=5000&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&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
- Riproduzione con la pubblicazione dei pod con l'SDK IMA:
- Il pod che gestisce la riproduzione con l'inserimento di annunci dinamici dell'API