Pubblicazione di contenuti di YouTube in diretta tramite DASH

Questo documento fornisce le linee guida per l'utilizzo del formato di pubblicazione DASH per lo streaming dei dati in tempo reale su YouTube da un codificatore. Il suo scopo è aiutare i fornitori di codificatori ad aggiungere il supporto per la consegna DASH ai loro prodotti.

Informazioni su DASH

Nell'elenco che segue sono elencati alcuni attributi e funzionalità chiave di DASH:

  • In base a standard aperti.
  • basate su HTTP Di conseguenza, DASH è compatibile con l'infrastruttura Internet e può attraversare i firewall.
  • Supporta una velocità in bit elevata per il trasferimento. DASH supporta più sessioni HTTP simultanee e una distribuzione dei segmenti non sequenziale, fornendo una maggiore resilienza rispetto ai protocolli che si basano su una singola connessione TCP.
  • Distribuzione sicura tramite HTTPS.
  • Distribuzione senza perdita di dati tramite HTTP e HTTPS.
  • Indipendente dal codec.
  • Supporta MP4 contenente H264 e AAC, nonché WebM contenente 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 del metodo PUT inviate da un codificatore.

  • L'endpoint DASH supporta connessioni TCP simultanee. Puoi riutilizzare le connessioni come da HTTP/1.1.
  • I segmenti MPD e inizializzazione devono essere inviati tramite PUT entro tre 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 a più parti di più segmenti non è supportato.
  • Le operazioni PUT per i segmenti multimediali possono sovrapporsi nel tempo per migliorare la larghezza di banda di caricamento.
  • I segmenti possono essere forniti in ordine non sequenziale entro una finestra temporale di circa 3 secondi.
  • I segmenti MPD e inizializzazione devono essere aggiornati almeno ogni 60 secondi con un availabilityStartTime e un startNumber aggiornati. Come indicato in precedenza, 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 tuo codificatore deve formare URL PUT aggiungendo una stringa all'URL di base dell'endpoint di YouTube. Devi creare l'endpoint di importazione DASH utilizzando l'API YouTube Live Streaming.

Il codificatore può poi ottenere in modo programmatico l'URL di base dell'endpoint tramite l'API YouTube Live Streaming. L'URL di base è visibile anche nella UI degli eventi dal vivo di YouTube se vuoi fornirlo manualmente al codificatore.

La stringa aggiunta all'URL di base può contenere la seguente serie di caratteri ASCII:

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

URL MPD

Oltre a soddisfare il requisito di cui sopra, l'URL del file MPD deve terminare con .mpd e consentire al server di YouTube di identificare facilmente il file MPD.Gli altri URL segmento non devono terminare con .mpd.

URL di inizializzazione e segmento multimediale

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

Contenuti MPD

Il file MPD deve essere completo e conforme allo standard DASH. Deve contenere esattamente uno dei seguenti elementi. Questo elenco identifica gli elementi specificatamente richiesti da YouTube, mentre lo standard DASH potrebbe identificare ulteriori elementi obbligatori. 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 il $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 di questo. Se il segmento di inizializzazione è incluso nel file MPD, l'URL data: che contiene il segmento non deve superare i 100 kB.

Output del codificatore

Il segmento di inizializzazione e i segmenti multimediali devono costituire uno stream di file ISO BMFF o WebM multiplex con GOP chiusi (gruppi di immagini).

  • Le dimensioni GOP devono essere di circa 2 secondi e inferiori a 8 secondi.
  • Lo stream multiplex deve contenere tracce audio e video.

Best practice aggiuntive

Crittografia

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

Segmenti di inizializzazione in MPD

Puoi rappresentare il segmento di inizializzazione direttamente nel file MPD utilizzando un URL data:, in base a RFC 2397. In questo modo si semplifica la configurazione dello stream 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 prestazioni di importazione ottimali e un buon compromesso tra velocità effettiva e latenza, la lunghezza 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 nel fattore 2 di tutte le durate del segmento o le prestazioni di streaming potrebbero risentirne.

Tieni presente che la durata target dell'importazione non corrisponde alla durata del blocco per il live streaming prodotta da YouTube. YouTube esegue la transcodifica e il ridimensionamento dell'input, e la durata del target di output dipende dall'ottimizzazione dello streaming per la qualità o dalla latenza.

Nuovi tentativi e backoff esponenziale

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

Una richiesta PUT di segmento multimediale che non riesce a causa di un timeout o di altri errori corrisponde a una lacuna nel video stream. Pertanto, dovresti riprovare qualsiasi richiesta di questo tipo utilizzando un backoff esponenziale binario casuale:

  1. In caso di errore, attendi un periodo casuale compreso tra [0 ... 100] millisecondi e ritenta la richiesta.
  2. Se la richiesta ha esito negativo, attendi un periodo casuale compreso tra [0 ... 200] millisecondi e riprova.
  3. Se la richiesta ha esito negativo, attendi un periodo casuale compreso tra [0 ... 400] millisecondi e riprova.
  4. E così via

Tieni presente che gli errori ripetuti dovrebbero essere segnalati all'operatore del codificatore in quanto corrispondono a una trasmissione in errore.

Codici di risposta HTTP

Le seguenti sezioni 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 di YouTube ha ricevuto un'operazione prevista e l'ha gestita correttamente.

202 (Accettato)

Una risposta HTTP 202 (accettata) a un'operazione PUT o POST indica che l'operazione era inaspettata e accettata per l'elaborazione differita. Tuttavia, l'operazione differita potrebbe avere esito positivo o negativo, pertanto la risposta non garantisce che YouTube riesca effettivamente a elaborare l'operazione.

Questa risposta si verifica più frequentemente quando un segmento viene pubblicato in sequenza. In genere, YouTube è in grado di elaborare correttamente il segmento accettato dopo aver ricevuto i segmenti precedenti e tu non hai bisogno di inviarlo nuovamente.

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 inizializzazione.
  • Un segmento multimediale viene ricevuto prima di un segmento precedente, ad esempio il segmento 3 prima del segmento 2.

Tuttavia, una risposta 202 può anche indicare che l'identificatore dell'articolo non è corretto se YouTube non è in grado di convalidare completamente l'identificatore alla ricezione della richiesta POST o PUT. Ad esempio, una delle situazioni che si verificano è 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 alla ricezione del file MPD. Puoi evitare questo scenario specifico includendo il segmento di inizializzazione nel file MPD.

400 (Richiesta non valida)

Una risposta HTTP 400 (richiesta errata) indica uno dei seguenti problemi:

  • Formato URL non valido
  • Il post è troppo grande (> 10 MB)
  • Impossibile analizzare il file MPD
  • Il segmento di inizializzazione nel file MPD è danneggiato

401 (non autorizzato)

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

405 (metodo non consentito)

Una risposta HTTP 405 (metodo non consentito) 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 ha ancora il segmento MPD, il segmento Inizializzazione o entrambi. In questo esempio, il codificatore deve ritrasmettere i segmenti MPD e inizializzazione prima di riprovare la richiesta non riuscita.

500 (errore interno del server)

Una risposta HTTP 500 (Errore server interno) indica che il server non è stato in grado di elaborare la richiesta. Per questo errore, ti consigliamo di riprovare a eseguire la richiesta con il backoff esponenziale.

Esempi

Sequenza URL

La sequenza di URL riportata di seguito mostra una serie di richieste PUT da eseguire per fornire contenuti tramite DASH. La sequenza presuppone che l'URL di base per l'endpoint di YouTube DASH sia:

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

La sequenza mostra i segmenti MPD e inizializzazione inviati separatamente. Tuttavia, il segmento di inizializzazione può essere rappresentato direttamente nel file MPD e questa pratica è consigliata. Inoltre, i segmenti MPD e inizializzazione devono essere aggiornati almeno ogni 60 secondi. Quindi, alla fine, gli URL di questi segmenti verrebbero visualizzati di nuovo in questa sequenza, 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 per l'importazione da WebM (VP8 o VP9, Opus) su YouTube. La maggior parte dell'URL dei dati è stata rimossa per una migliore 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

Anche il seguente MPD, che non ha un segmento di inizializzazione incorporato, è conforme all'importazione da 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 porzione dello stream WebM fino al primo cluster incluso.

Contenuti multimediali

Di seguito viene mostrato il layout di un segmento multimediale WebM di esempio. È costituito da un unico cluster WebM. Come per lo stream ISO BMFF, il segmento di inizializzazione anteposto a una serie di cluster dovrebbe 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) di YouTube. La maggior parte dell'URL dei dati è stata rimossa per una migliore 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, è inoltre conforme all'importazione ISO BMFF (H.264, AAC) di 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 esempio di inizializzazione ISO BMFF multiplex. YouTube non usa necessariamente gli atomi, ma questo è un esempio conforme. In particolare, sono rappresentate sia le tracce audio che quelle video.

Contenuti multimediali

Il seguente diagramma mostra il layout di un segmento multimediale ISO BMFF multiplex di esempio. YouTube non usa necessariamente tutti gli atomi, ma questo è un esempio conforme. In particolare, sono rappresentate sia le tracce audio che quelle video. È possibile aggiungere una serie di segmenti a un segmento di inizializzazione per produrre uno stream BMFF ISO multiplex valido e completo.

Limitazioni note

Importazioni RTMP e DASH

Non è possibile unire le importazioni da RTMP e DASH a YouTube.Questo vale sia per passare dai due durante una trasmissione sia per utilizzarli come metodo di importazione principale e all'altro per l'importazione di backup.