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 suPOD_SERVING_REDIRECT
.streamingFormat
: impostalo suHLS
oDASH
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'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.
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:
|
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 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 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
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 |
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}&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 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&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 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&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 pubblicazione di pod con l'SDK IMA:
- Il pod che gestisce la riproduzione con l'inserimento di annunci dinamici tramite Google Cloud