Questa guida illustra lo sviluppo di un'applicazione client per caricare un live streaming HLS o DASH con l'API Pod Serving e il tuo manipolatore di manifest.
Prerequisiti
Prima di continuare, devi avere:
Una chiave asset personalizzata per un evento live streaming configurato con il tipo DAI
Pod serving redirect. Per ottenere questa chiave:Utilizza una libreria client API SOAP per chiamare il metodo
LiveStreamEventService.createLiveStreamEventscon un oggettoLiveStreamEvente la proprietàdynamicAdInsertionTypeimpostata sul valore enumPOD_SERVING_REDIRECT. Per tutte le librerie client, consulta Librerie client e codice di esempio.
Determina se l'SDK Interactive Media Ads (IMA) è disponibile per la tua piattaforma. Ti consigliamo di utilizzare l'SDK IMA per aumentare le entrate. Per maggiori dettagli, vedi Configurare l'SDK IMA per DAI.
Effettuare una richiesta di stream
Quando l'utente seleziona uno stream:
Invia una richiesta
POSTal metodo del servizio di live streaming. Per maggiori dettagli, vedi Metodo: stream.Trasmetti i parametri di targeting degli annunci nei formati
application/x-www-form-urlencodedoapplication/json. Questa richiesta registra una sessione di streaming con Google DAI.L'esempio seguente effettua una richiesta di flusso:
Codifica del modulo
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());Codifica JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());Se l'operazione va a buon fine, viene visualizzato un output simile al seguente:
{ "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }Nella risposta JSON, individua l'ID sessione stream e archivia gli altri dati per i passaggi successivi.
Metadati dell'annuncio sondaggio
Per eseguire il polling dei metadati dell'annuncio:
Leggi il valore
metadata_urldalla risposta di registrazione dello stream.Invia una richiesta
GETiniziale all'endpointmetadata_url.- Ometti il parametro di query
delta_token. Questa procedura consente al server di restituire i metadati completi per la finestra del Digital Video Recorder (DVR) dello stream. La finestra del DVR contiene l'intervallo di tempo della trasmissione disponibile per la riproduzione e il riavvolgimento da parte di uno spettatore. La risposta include un camponext_delta_token.
- Ometti il parametro di query
Per ottimizzare la larghezza di banda, memorizza il valore
next_delta_tokendell'ultima risposta.Nella richiesta successiva, invia questo valore come parametro di query
delta_token. Il server restituisce solo i metadati modificati da quando è stato generato il token. Invia sempre il token più recente che hai ricevuto. Non tentare di analizzare, modificare o costruire il token. Per i dettagli, vedi Metodo: metadati.L'esempio seguente recupera i metadati dell'annuncio:
// Initial request (returns full metadata and next_delta_token) let response = await fetch(metadata_url); let metadata = await response.json(); let deltaToken = metadata.next_delta_token; // Subsequent request (returns only changes since deltaToken) if (deltaToken) { const url = new URL(metadata_url); url.searchParams.append('delta_token', deltaToken); response = await fetch(url.toString()); const deltaMetadata = await response.json(); // Merge deltaMetadata into your local cache mergeMetadata(metadata, deltaMetadata); deltaToken = deltaMetadata.next_delta_token; }In caso di esito positivo, riceverai la risposta PodMetadata. Se fornisci il parametro
delta_token, la risposta contiene solo gli annunci, le interruzioni pubblicitarie e i tag che il server ha aggiunto o aggiornato da quando ha generato il token. La risposta contiene anche un nuovo valorenext_delta_token. Se alcune interruzioni pubblicitarie non sono aggiornate, la risposta include anche un elencoobsolete_ad_break_idsdelle interruzioni pubblicitarie da rimuovere dalla cache.{ "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0", "obsolete_ad_break_ids": ["0003069407"], "tags":{ "google_1022389921":{ "ad":"0003069408_ad1", "ad_break_id":"0003069408", "type":"start" }, ... }, "ads":{ "0003069408_ad1":{ "ad_break_id":"0003069408", "position":1, "duration":10.01, "title":"External - Pod Midroll 1", "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0003069408":{ "type":"mid", "duration":30, "ads":3 }, ... } }Salva l'oggetto
tagse unisci gli aggiornamenti nella cache locale. Se è presente il parametroobsolete_ad_break_ids, rimuovi le interruzioni pubblicitarie e gli annunci e i tag associati dalla cache.Imposta un timer utilizzando il valore
polling_frequencyper richiedere regolarmente i metadati. In ogni sondaggio, invia il valorenext_delta_tokenrestituito nella risposta dei metadati più recente come parametro di querydelta_token.
Carica lo stream nel video player
Dopo aver ottenuto l'ID sessione dalla risposta di registrazione, passalo al manipolatore del manifest o crea un URL del manifest per caricare lo stream in un video player.
Per trasmettere l'ID sessione, consulta la documentazione del manipolatore del manifest. Se sviluppi un manipolatore di manifest, consulta Manipolatore di manifest per livestream.
L'esempio seguente assembla un URL del manifest:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
Quando il lettore è pronto, inizia la riproduzione.
Ascolta gli eventi degli annunci
Controlla il formato del contenitore dello stream per i metadati temporizzati:
Gli stream HLS con contenitori Transport Stream (TS) utilizzano tag ID3 temporizzati per trasportare metadati temporizzati. Per informazioni dettagliate, vedi Informazioni su Common Media Application Format con HTTP Live Streaming (HLS).
I flussi DASH utilizzano gli elementi
EventStreamper specificare gli eventi nel manifest.Gli stream DASH utilizzano elementi
InbandEventStreamquando i segmenti contengono caselle di messaggi evento (emsg) per i dati utili, inclusi i tag ID3. Per i dettagli, consulta InbandEventStream.Gli stream CMAF, inclusi DASH e HLS, utilizzano caselle
emsgcontenenti tag ID3.
Per recuperare i tag ID3 dal tuo stream, consulta la guida del tuo video player. Per maggiori dettagli, consulta la guida alla gestione dei metadati temporizzati.
Per recuperare l'ID evento dell'annuncio dai tag ID3:
- Filtra gli eventi per
scheme_id_uriconurn:google:dai:2018ohttps://aomedia.org/emsg/ID3. Estrai l'array di byte dal campo
message_data.Il seguente esempio decodifica i dati
emsgin JSON:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1022389921", ... }Filtra i tag ID3 con il formato
TXXXgoogle_{ad_event_ID}:TXXXgoogle_1022389921
Mostra i dati sugli eventi dell'annuncio
Per trovare l'oggetto
TagSegment:
Recupera l'oggetto
tagsdei metadati dell'annuncio da Poll ad metadata. L'oggettotagsè un array di oggettiTagSegment.Utilizza l'ID evento dell'annuncio completo per trovare un oggetto
TagSegmentcon il tipoprogress.Utilizza i primi 17 caratteri dell'ID evento annuncio per trovare un oggetto
TagSegmentdi altri tipi.Poiché l'app client esegue periodicamente il polling dei metadati degli annunci, potrebbe verificarsi un ritardo tra il momento in cui il video player rileva un tag ID3 nello stream e il momento in cui i metadati associati sono disponibili. Se l'app client non trova un tag ID3 nei tag archiviati, mantieni il tag in una coda ed elaboralo di nuovo dopo il successivo polling dei metadati. Mantieni il tag in coda fino al termine dell'elaborazione.
Dopo aver ottenuto
TagSegment, utilizza la proprietàad_break_idcome chiave per trovare l'oggettoAdBreaknell'oggettoad_breaksdei metadati dell'annuncio.L'esempio seguente trova un oggetto
AdBreak:{ "type":"mid", "duration":15, "ads":1 }Utilizza i dati
TagSegmenteAdBreakper mostrare informazioni sulla posizione dell'annuncio nell'interruzione pubblicitaria. Ad esempio:Ad 1 of 3.
Inviare ping di verifica dei contenuti multimediali
Per ogni evento dell'annuncio, ad eccezione del tipo progress, invia un ping di verifica dei contenuti multimediali.
Google DAI scarta gli eventi progress e l'invio frequente di questi eventi potrebbe influire sulle prestazioni dell'app.
Per generare l'URL di verifica media completo di un evento dell'annuncio, procedi nel seguente modo:
Dalla risposta dello stream, aggiungi l'ID evento annuncio completo al valore
media_verification_url.Invia una richiesta
GETcon l'URL completo:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_1022389921`; const response = await fetch(completeUrl);In caso di esito positivo, ricevi una risposta con codice di stato
202. In caso contrario, riceverai un codice di errore404.
Puoi utilizzare il Monitoraggio attività di streaming (Stream Activity Monitor, SAM) per esaminare un log cronologico di tutti gli eventi pubblicitari. Per maggiori dettagli, vedi Monitorare e risolvere i problemi di un live streaming.