Pubblicare contenuti di YouTube live tramite DASH

Questo documento fornisce linee guida per l'utilizzo del formato di distribuzione Dynamic Adaptive Streaming over HTTP (DASH) per lo streaming di dati live su YouTube da un codificatore. È progettato per aiutare i fornitori di codificatori ad aggiungere il supporto della distribuzione DASH ai loro prodotti.

Informazioni su DASH

L'elenco seguente riporta alcune funzionalità e alcuni attributi chiave di DASH:

  • Basato su standard aperti.
  • Basato su HTTP. Di conseguenza, DASH è compatibile con l'infrastruttura internet e può attraversare i firewall.
  • Supporta un bitrate di trasferimento elevato. DASH supporta più sessioni HTTP simultanee e la distribuzione di segmenti non sequenziali, offrendo una maggiore resilienza rispetto ai protocolli che si basano su una singola connessione TCP.
  • Distribuzione sicura tramite HTTPS.
  • Distribuzione lossless tramite HTTP e HTTPS.
  • Indipendente dal codec.
  • Supporta MP4 contenenti H264 e AAC, nonché WebM contenenti VP8/VP9 e Vorbis/Opus.

Specifiche

Requisiti

Le seguenti sottosezioni spiegano i requisiti per l'utilizzo di DASH per la pubblicazione di live streaming su YouTube.

Tempi

L'endpoint DASH di YouTube si comporta come un server HTTP passivo, registrando le chiamate al metodo PUT inviate da un codificatore.

  • L'endpoint DASH supporta connessioni TCP simultanee. Puoi riutilizzare le connessioni in base a HTTP/1.1.
  • I segmenti MPD e di inizializzazione devono essere inseriti entro 3 secondi dal primo segmento multimediale. Ti consigliamo di includere il segmento di inizializzazione nel file MPD.
  • Ogni segmento o MPD deve utilizzare una richiesta PUT separata; il caricamento in più parti di più segmenti non è supportato.
  • Le operazioni PUT per i segmenti multimediali potrebbero sovrapporsi nel tempo per migliorare la larghezza di banda di caricamento.
  • I segmenti possono essere forniti in ordine non sequenziale entro un intervallo di tempo di circa 3 secondi.
  • I segmenti MPD e di inizializzazione devono essere aggiornati almeno ogni 60 secondi con availabilityStartTime e startNumber aggiornati. Come indicato sopra, il segmento di inizializzazione può essere incluso nel file MPD. In questo caso, una richiesta PUT può aggiornare entrambi i segmenti.)

Struttura di URL

Il codificatore deve formare gli URL PUT aggiungendo una stringa all'URL di base dell'endpoint YouTube. Devi creare l'endpoint di importazione DASH utilizzando l'API YouTube Live Streaming.

Il codificatore può quindi ottenere l'URL di base dell'endpoint a livello di programmazione tramite l'API YouTube Live Streaming. L'URL di base è visibile anche nell'interfaccia utente di YouTube Live Events se vuoi fornire l'URL al codificatore manualmente.

La stringa aggiunta all'URL di base può contenere il seguente insieme di caratteri ASCII:

  • Lettere minuscole: a-z
  • Lettere maiuscole: A-Z
  • Cifre: 0-9
  • Caratteri speciali: _ (trattino basso), - (trattino), . (punto)

URL MPD

Oltre al requisito precedente, l'URL MPD deve terminare con .mpd, in modo che il server YouTube possa identificare facilmente l'MPD. Gli altri URL di segmento non devono terminare con .mpd.

URL di inizializzazione e dei segmenti multimediali

L'URL del segmento di inizializzazione e tutti gli URL dei segmenti multimediali devono terminare con .mp4 se i dati si trovano in un contenitore ISO BMFF o con .webm se i dati si trovano in un contenitore WebM.

Contenuti MPD

Il file MPD deve essere completo e conforme allo standard DASH. Deve contenere esattamente uno di ciascuno dei seguenti elementi. Questo elenco identifica gli elementi richiesti specificamente da YouTube e lo standard DASH potrebbe identificare elementi richiesti aggiuntivi. Gli elementi sono rappresentati utilizzando la sintassi XPath e sono coerenti con lo standard DASH.

  • /mpd:MPD/attribute::type
  • /mpd:MPD/mpd:Period
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/attribute::mimeType (video/mp4 or video/webm)
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::media
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::initialization
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::startNumber

Tieni presente i seguenti requisiti per i valori degli elementi:

  • L'attributo minimumUpdatePeriod dell'elemento <MPD> deve essere impostato su un valore uguale o inferiore a 60 secondi (PT60S).
  • L'attributo media dell'elemento <SegmentTemplate> deve specificare che gli URL dei segmenti multimediali vengono generati utilizzando $Number$. L'attributo startNumber identifica il numero che verrà assegnato al primo segmento multimediale.

Lunghezza del segmento di inizializzazione

Il segmento di inizializzazione non deve superare i 100 KB. In genere, un segmento di inizializzazione è molto più piccolo. Se il segmento di inizializzazione è incluso nel file MPD, l'URL data:, che contiene il segmento, non deve superare i 100 KB.

Output dell'encoder

Il segmento di inizializzazione e i segmenti multimediali devono costituire un flusso di file ISO BMFF o WebM multiplexato con GOP (gruppi di immagini) chiusi.

  • La dimensione GOP deve essere di circa 2 secondi e non deve superare gli 8 secondi.
  • Lo stream multiplexato deve contenere sia tracce audio che video.

Best practice aggiuntive

Crittografia

YouTube supporta la crittografia dello stream tramite HTTPS. Ti consigliamo vivamente di utilizzare questa funzionalità.

Segmenti di inizializzazione nell'MPD

Puoi rappresentare il segmento di inizializzazione direttamente nel file MPD utilizzando un URL data:, come indicato nella RFC 2397. In questo modo la configurazione dello stream viene semplificata e si riduce la possibilità che il segmento di inizializzazione non corrisponda al resto dello stream.

L'XPath per questo elemento è:

/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute:data

Durate dei segmenti target

Per un buon rendimento dell'importazione e un buon compromesso tra velocità effettiva e latenza, la durata dei segmenti multimediali deve essere compresa tra 1 e 5 secondi. Ti consigliamo vivamente di comunicare la durata target di questi segmenti nel file MPD utilizzando questi due elementi:

  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::duration
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::timescale

La durata calcolata da questi attributi deve rientrare in un fattore di 2 rispetto a tutte le durate effettive dei segmenti, altrimenti le prestazioni di streaming potrebbero risentirne.

Tieni presente che la durata target per l'importazione non corrisponde alla durata del segmento per il live streaming prodotto da YouTube. YouTube esegue la transcodifica e la ricomposizione dell'input e la durata target dell'output dipende dal fatto che uno stream sia ottimizzato per la qualità dello streaming o per la latenza.

Nuovi tentativi e backoff esponenziale

Tutte le richieste HTTP PUT devono essere eseguite con un timeout, che ti consigliamo di impostare su un valore 500 millisecondi superiore alla durata del segmento.

Una richiesta PUT di un segmento multimediale non riuscita, a causa di timeout o altri errori, corrisponde a una lacuna nel flusso video. Pertanto, devi riprovare a inviare queste richieste utilizzando un backoff esponenziale binario randomizzato:

  1. Dopo un errore, attendi un periodo casuale compreso tra [0 ... 100] millisecondi e riprova a inviare la richiesta.
  2. Se la richiesta non riesce nuovamente, attendi un periodo casuale compreso tra [0 ... 200] millisecondi e riprova.
  3. Se la richiesta non riesce nuovamente, attendi un periodo casuale compreso tra [0 ... 400] millisecondi e riprova.
  4. e così via

Tieni presente che gli errori ripetuti devono essere segnalati all'operatore del codificatore, in quanto corrispondono a una trasmissione non riuscita.

Codici di risposta HTTP

Le sezioni seguenti spiegano i codici di risposta restituiti da YouTube in risposta ai segmenti pubblicati tramite DASH.

200 (OK)

Una risposta HTTP 200 (OK) indica che il server YouTube ha ricevuto un'operazione prevista e l'ha gestita correttamente.

202 (Accettato)

Una risposta HTTP 202 (Accettato) a qualsiasi operazione PUT o POST indica che l'operazione era imprevista ed è stata accettata per l'elaborazione differita. Tuttavia, l'operazione differita potrebbe riuscire o meno, quindi la risposta non garantisce che YouTube sarà effettivamente in grado di elaborarla correttamente.

Questa risposta si verifica più spesso quando un segmento viene inviato in modo non sequenziale. In genere, YouTube può elaborare correttamente il segmento accettato dopo aver ricevuto i segmenti precedenti e non è necessario inviarlo di nuovo.

Ad esempio, YouTube può restituire una risposta 202 in uno dei seguenti casi:

  • Un segmento di inizializzazione viene ricevuto prima del file MPD.
  • I segmenti multimediali vengono ricevuti prima dei segmenti MPD e di inizializzazione.
  • Un segmento multimediale viene ricevuto prima di un segmento precedente, ad esempio il segmento 3 viene ricevuto prima del segmento 2.

Tuttavia, una risposta 202 può anche indicare che l'identificatore dell'elemento non è corretto se YouTube non riesce a convalidarlo completamente al momento della ricezione della richiesta POST o PUT. Ad esempio, ciò si verifica quando YouTube riceve e accetta un segmento di inizializzazione prima di ricevere il file MPD, ma il segmento di inizializzazione risulta non valido. In questo caso, YouTube accetta il segmento di inizializzazione e restituisce un codice 202, quindi determina se il segmento è valido al momento della ricezione del file MPD. Puoi evitare questo scenario specifico includendo il segmento di inizializzazione nel file MPD.

400 (Richiesta errata)

Una risposta HTTP 400 (Bad Request) indica che si è verificato uno dei seguenti problemi:

  • Il formato dell'URL non è corretto.
  • Il post è troppo grande (> 10 MB).
  • Impossibile analizzare MPD.
  • Il segmento di inizializzazione nell'MPD è danneggiato.

401 (Non autorizzato)

Una risposta HTTP 401 (Non autorizzato) indica che l'URL di base per l'endpoint YouTube DASH è danneggiato o scaduto.

405 (Method Not Allowed)

Una risposta HTTP 405 (Method Not Allowed) indica che è stata inviata una richiesta diversa da POST o PUT.

409 (Conflitto)

Una risposta HTTP 409 (Conflitto) a qualsiasi operazione PUT o POST indica che YouTube non può elaborare la richiesta. Ad esempio, questa risposta potrebbe verificarsi se il richiedente ha inviato numerosi segmenti multimediali, ma YouTube non dispone ancora del file MPD, del segmento di inizializzazione o di entrambi. In questo esempio, il codificatore dovrebbe ritrasmettere i segmenti MPD e di inizializzazione prima di ritentare la richiesta non riuscita.

500 (errore interno del server)

Una risposta HTTP 500 (errore interno del server) indica che il server non è riuscito a elaborare la richiesta. Per questo errore, ti consigliamo di riprovare a inviare la richiesta con il backoff esponenziale.

Esempi

Sequenza di URL

La sequenza di URL riportata di seguito mostra una serie di richieste PUT che verrebbero effettuate per pubblicare i contenuti tramite DASH. La sequenza presuppone che l'URL di base per l'endpoint YouTube DASH sia:

http://upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=

La sequenza mostra i segmenti MPD e di inizializzazione inviati separatamente. Tuttavia, il segmento di inizializzazione può essere rappresentato direttamente nel file MPD e questa pratica è consigliata. Inoltre, i segmenti MPD e di inizializzazione devono essere aggiornati almeno ogni 60 secondi. Di conseguenza, gli URL di questi segmenti si ripresenteranno in questa sequenza e saranno seguiti da URL di altri segmenti multimediali.

PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=dash.mpd
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media001.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media002.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media003.mp4
...

Segmenti WebM

MPD con segmento di inizializzazione incorporato

Il seguente MPD di esempio ha un segmento di inizializzazione incorporato in un URL dati RFC 2397. Ti consigliamo di incorporare il segmento di inizializzazione in questo modo anziché inviarlo separatamente.

Questo esempio è conforme all'importazione di WebM (VP8 o VP9, Opus) su YouTube. La maggior parte dell'URL dei dati è stata omessa per leggibilità:

<?xml version="1.0" encoding="UTF-8"?>
<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 DASH-MPD.xsd"
     type="dynamic" 
     profiles="urn:mpeg:dash:profile:isoff-live:2011" 
     minimumUpdatePeriod="PT60S"
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:52:58" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/webm">
      <ContentComponent contentType="video" id="1"/>
      <SegmentTemplate timescale="1000"
           duration="2000"
           startNumber="1"
           initialization="data:video/mp4;base64,AAAAGGZ0eXBpc...AAA"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media-$Number%09d$.webm"/>
      <Representation id="1" width="1920" height="1080">
        <SubRepresentation contentComponent="1"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

MPD

Il seguente MPD di esempio, che non ha un segmento di inizializzazione incorporato, è conforme anche per l'importazione di WebM (VP8 o VP9, Opus) su YouTube:

<?xml version="1.0" encoding="UTF-8"?>
<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 DASH-MPD.xsd"
     type="dynamic" 
     profiles="urn:mpeg:dash:profile:isoff-live:2011" 
     minimumUpdatePeriod="PT60S"
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:52:58" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/webm">
      <ContentComponent contentType="video" id="1"/>
      <SegmentTemplate timescale="1000"
           duration="2000"
           startNumber="1"
           initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.webm"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media-$Number%09d$.webm"/>
      <Representation id="1" width="1920" height="1080">
        <SubRepresentation contentComponent="1"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

Inizializzazione

Di seguito è mostrato il layout di un segmento di inizializzazione WebM di esempio. È costituita dalla parte dello stream WebM fino al primo cluster incluso.

Media

Di seguito è mostrato il layout di un segmento multimediale WebM di esempio. È composto da un singolo cluster WebM. Come per uno stream ISO BMFF, il segmento di inizializzazione anteposto a una serie di cluster deve produrre uno stream WebM valido.

Segmenti ISO BMFF

MPD con segmento di inizializzazione incorporato

Il seguente MPD di esempio ha un segmento di inizializzazione incorporato in un URL dati RFC 2397. Ti consigliamo di incorporare il segmento di inizializzazione in questo modo anziché inviarlo separatamente.

Questo esempio è conforme all'importazione ISO BMFF (H.264, AAC) su YouTube. La maggior parte dell'URL dei dati è stata omessa per leggibilità:

<?xml version="1.0" encoding="UTF-8"?>
<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 DASH-MPD.xsd" 
    type="dynamic"
    minimumUpdatePeriod="PT30S" 
    availabilityStartTime="2016-05-04T20:47:25" 
    minBufferTime="PT12S" 
    profiles="urn:mpeg:dash:profile:isoff-live:2011">
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2"/>
      <SegmentTemplate timescale="600"
             media="/dash_upload?cid=ug50-xg26-cbc1-2p0h&staging=1&copy=0&file=media$Number%09d$.mp4"
             initialization="data:video/mp4;base64,AAAAGGZ0eXBpc281AA...AA"
             duration="306"
             startNumber="1"/>
      <Representation id="1" width="640" height="360" bandwidth="526952">
        <SubRepresentation contentComponent="1" bandwidth="526952" 
codecs="avc1.4d401e"/>
        <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

MPD

Il seguente MPD di esempio, che non ha un segmento di inizializzazione incorporato, è conforme anche per l'importazione ISO BMFF (H.264, AAC) su YouTube:

<?xml version="1.0" encoding="UTF-8"?>
<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 DASH-MPD.xsd"
     type="dynamic"
     profiles="urn:mpeg:dash:profile:isoff-live:2011"
     minimumUpdatePeriod="PT60S" 
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:51:31" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2"/>
      <SegmentTemplate timescale="600"
           duration="1200"
           startNumber="1"
           initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media$Number%09d$.mp4"/>
      <Representation id="1" width="640" height="360" bandwidth="526952">
        <SubRepresentation contentComponent="1" bandwidth="526952" codecs="avc1.4d401e"/>
        <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

Inizializzazione

Il seguente diagramma mostra il layout di un segmento di inizializzazione ISO BMFF multiplexato di esempio. YouTube non utilizza necessariamente gli atomi, ma questo è un esempio conforme. In particolare, sono rappresentate sia le tracce audio che quelle video.

Media

Il seguente diagramma mostra il layout di un segmento multimediale ISO BMFF multiplexato di esempio. YouTube non utilizza necessariamente tutti gli atomi, ma questo è un esempio conforme. In particolare, sono rappresentate sia le tracce audio che quelle video. Una serie di questi segmenti può essere aggiunta a un segmento di inizializzazione per produrre un flusso ISO BMFF multiplexato valido e completo.

Limitazioni note

Inserimenti RTMP e DASH

Non è possibile combinare le importazioni RTMP e DASH su YouTube. Ciò vale sia per il passaggio da uno all'altro durante una trasmissione sia per l'utilizzo di uno come metodo di importazione principale e dell'altro per l'importazione di backup.