Pubblicare contenuti di YouTube live tramite DASH

Questo documento fornisce le linee guida per l'utilizzo del formato di pubblicazione Dynamic Adaptive Streaming over HTTP (DASH) per lo streaming di dati in tempo reale su YouTube da un codificatore. Ha lo scopo di aiutare i fornitori di codificatori ad aggiungere il supporto per la pubblicazione DASH ai loro prodotti.

Informazioni su DASH

Nell'elenco seguente sono elencati alcuni attributi e funzionalità DASH principali:

  • In base a standard aperti.
  • basato su HTTP. Di conseguenza, DASH è ottimizzato per l'infrastruttura internet e può attraversare i firewall.
  • Supporta una velocità in bit di trasferimento elevata. 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.
  • Consegna sicura tramite HTTPS.
  • Distribuzione senza perdita di dati tramite HTTP e HTTPS.
  • indipendente dal codec.
  • Supporta MP4 contenenti H264 e AAC e WebM contenenti VP8/VP9 e Vorbis/Opus.

Specifiche

Requisiti

Le seguenti sottosezioni spiegano i requisiti per l'utilizzo di DASH per pubblicare 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 come indicato in HTTP/1.1.
  • I segmenti MPD e Inizializzazione devono essere PUT entro 3 secondi dal primo segmento multimediale. Ti consigliamo di includere il segmento 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 per il caricamento.
  • I segmenti possono essere forniti in ordine non sequenziale in una finestra temporale di circa 3 secondi.
  • I segmenti MPD e Inizializzazione devono essere aggiornati almeno ogni 60 secondi con i valori availabilityStartTime e startNumber aggiornati. Come indicato sopra, il segmento Inizializzazione può essere incluso nel file MPD. in questo caso, una sola richiesta PUT può aggiornare entrambi i segmenti.

Struttura di URL

Il tuo codificatore deve creare 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.

Successivamente, il codificatore può ottenere l'URL di base dell'endpoint a livello di programmazione tramite l'API YouTube Live Streaming. L'URL di base sarà visibile anche nella UI degli eventi dal vivo di YouTube se vuoi fornire manualmente l'URL al codificatore.

La stringa aggiunta all'URL di base può contenere il seguente set 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 MPD deve terminare con .mpd, consentendo al server di YouTube di identificare facilmente il file MPD.Gli URL di altri segmenti non devono terminare con .mpd.

Inizializzazione e URL 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 BMFF ISO 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 specificamente richiesti da YouTube e lo standard DASH potrebbe identificare altri 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 $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 essere più lungo di 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 (gruppi di immagini) chiusi.

  • 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 funzione.

Segmenti di inizializzazione in MPD

Puoi rappresentare il segmento di inizializzazione direttamente nel file MPD utilizzando un URL data:, secondo lo standard RFC 2397. In questo modo si semplifica la configurazione dello stream e si riduce la possibilità che il segmento Inizializzazione non corrisponda al resto dello stream.

L'XPath di questo elemento è:

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

Durate dei segmenti target

Per ottenere buone prestazioni di importazione 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 a partire da questi attributi deve rientrare in un fattore di 2 di tutte le durate effettive dei segmenti, altrimenti il rendimento del flusso di dati potrebbe risentirne.

Tieni presente che la durata target dell'importazione non equivale alla durata del chunk prodotto da YouTube. YouTube transcodifica e suddivide l'input e la durata target dell'output dipende dall'ottimizzazione o meno della qualità dello streaming o della latenza.

Nuovi tentativi e backoff esponenziale

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

Una richiesta PUT del segmento multimediale che non riesce, a causa di un timeout o di altri errori, corrisponde a un intervallo nello stream video. Di conseguenza, ti conviene riprovare qualsiasi richiesta di questo tipo utilizzando un backoff esponenziale binario casuale:

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

Tieni presente che errori ripetuti devono essere segnalati all'operatore encoder poiché corrispondono a un errore di trasmissione.

Codici di risposta HTTP

Le seguenti sezioni spiegano i codici di risposta che YouTube restituisce 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 qualsiasi operazione PUT o POST indica che l'operazione era imprevista e accettata per l'elaborazione differita. Tuttavia, l'operazione differita potrebbe avere esito positivo o negativo, quindi la risposta non garantisce che YouTube sarà effettivamente in grado di elaborare correttamente l'operazione.

Questa risposta si verifica più di frequente quando un segmento viene pubblicato in modo non sequenziale. In genere, YouTube è in grado di elaborare correttamente il segmento accettato dopo aver ricevuto quelli precedenti, senza che tu debba inviare un nuovo segmento.

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

  • Viene ricevuto un segmento di inizializzazione 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 viene ricevuto 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 al ricevimento della richiesta POST o PUT. Ad esempio, si verifica una delle situazioni in cui 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 particolare scenario includendo il segmento Inizializzazione nel file MPD.

400 (Richiesta errata)

Una risposta HTTP 400 (Richiesta non valida) indica che si è verificato 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 (Autorizzazione non autorizzata)

Una risposta HTTP 401 (Autorizzazione non autorizzata) indica che l'URL di base dell'endpoint 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 è in grado di elaborare la richiesta. Ad esempio, questa risposta potrebbe verificarsi se il richiedente ha inviato numerosi segmenti multimediali, ma YouTube continua a non avere il file MPD, il segmento Inizializzazione o entrambi. In questo esempio, il codificatore deve ritrasmettere i segmenti MPD e Inizializzazione prima di riprovare a inviare la richiesta non riuscita.

500 (errore interno del server)

Una risposta HTTP 500 (Internal Server Error) indica che il server non è riuscito a elaborare la richiesta. Per questo errore, ti consigliamo di riprovare a eseguire la richiesta con un backoff esponenziale.

Esempi

Sequenza di URL

La sequenza di URL riportata di seguito mostra una serie di richieste PUT che verrebbero effettuate per pubblicare contenuti tramite DASH. La sequenza presuppone che l'URL di base per l'endpoint DASH di YouTube 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 Inizializzazione può essere rappresentato direttamente nel file MPD ed è consigliata questa pratica. Inoltre, i segmenti MPD e Inizializzazione devono essere aggiornati almeno ogni 60 secondi. Alla fine, gli URL di questi segmenti rispetterebbero questa sequenza e poi sarebbero seguiti dagli URL per 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 file MPD di esempio include un segmento di inizializzazione incorporato in un URL di dati RFC 2397. Ti consigliamo di incorporare il segmento di inizializzazione in questo modo anziché inviarlo separatamente.

Questo esempio è conforme per l'importazione di WebM (VP8 o VP9, Opus) su YouTube. La maggior parte dell'URL dei dati è stata evitata per garantire la 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 file 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 viene mostrato il layout di un segmento di inizializzazione WebM di esempio. Si tratta della parte dello stream WebM fino al primo cluster escluso.

Media

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

Segmenti BMFF ISO

MPD con segmento di inizializzazione incorporato

Il seguente file MPD di esempio include un segmento di inizializzazione incorporato in un URL di 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 evitata per garantire la 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 file MPD di esempio, che non ha un segmento di inizializzazione incorporato, è conforme anche all'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 esempio di segmento di inizializzazione BMFF ISO multiplexed. 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 esempio di segmento multimediale BMFF ISO multiplexed. 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 di lavoro BMFF ISO multiplexed valido e completo.

Limitazioni note

Importazione RTMP e DASH

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