Caricare contenuti dal vivo di YouTube tramite HLS

Questo documento spiega come utilizzare il protocollo HTTP Live Streaming (HLS) per trasmettere dati in live streaming su YouTube da un codificatore. Questo documento è destinato ai fornitori di codificatori che vogliono aggiungere il supporto per l'importazione HLS ai loro prodotti. L'importazione HLS è una buona scelta per i contenuti premium che richiedono alta qualità e alta risoluzione con una latenza relativamente maggiore. Per un breve confronto tra i diversi protocolli di importazione supportati da YouTube Live Streaming, consulta Confronto tra i protocolli di importazione di YouTube Live Streaming.

Per trasmettere dati in live streaming utilizzando HLS, il codificatore deve inviare una serie di playlist multimediali e segmenti multimediali all'endpoint HLS di YouTube utilizzando le richieste HTTP PUT o POST. Dal punto di vista del codificatore, l'endpoint HLS di YouTube sembra essere un server HTTP passivo.

Ogni segmento multimediale rappresenta i contenuti multimediali effettivi per una breve porzione dello stream della durata compresa tra uno e quattro secondi. Ogni playlist multimediale descrive come riassemblare i segmenti multimediali nell'ordine corretto dello stream.

Requisiti di formato multimediale

L'importazione HLS di YouTube presenta i seguenti requisiti per i contenuti audio e video:

  • Audio e video devono essere muxati in formato M2TS.
  • I codec video supportati sono H.264 e HEVC.
  • Sono supportate frequenze fotogrammi fino a 60 fps.
  • È supportato solo il GOP chiuso.
  • Il codec audio supportato è AAC ed è supportato solo l'audio a traccia singola.

Per requisiti più dettagliati, consulta la sezione Segmenti multimediali.

HDR

I video High Dynamic Range (HDR) sono supportati utilizzando il codec HEVC e presentano i seguenti requisiti aggiuntivi:

  • Gli standard di colore supportati sono PQ a 10 bit e HLG con luminanza non costante. Più nello specifico:
    • Il formato Chroma deve essere YUV 4:2:0 a 10 bit.
    • La funzione di trasferimento deve essere PQ (nota anche come SMPTE ST 2084) o HLG (nota anche come ARIB STD-B67).
    • I colori primari devono essere Rec. 2020.
    • I coefficienti della matrice devono essere Rec. 2020 luminanza non costante.
  • Sono supportati sia i valori di esempio a intervallo limitato (o intervallo MPEG) sia quelli a intervallo completo (o intervallo JPEG). È importante che l'intervallo sia impostato in base all'intervallo di valori di esempio utilizzato dai contenuti. Sono consigliati i valori di esempio a intervallo limitato.

Ottenere un URL di importazione HLS

Ottenere un URL di importazione HLS dall'API di YouTube

Per ottenere l'URL di importazione completo, i codificatori possono utilizzare l'API YouTube Live Streaming per inserire una risorsa liveStream con le seguenti proprietà:

"cdn": {
  "ingestionType": "hls",
  "frameRate": "variable",
  "resolution": "variable"
}

Nella risposta dell'API, il campo cdn.ingestionInfo.ingestionAddress specifica l'URL di importazione principale, mentre il campo cdn.ingestionInfo.backupIngestionAddress specifica l'URL di importazione di backup. Per maggiori dettagli, consulta la documentazione per la risorsa liveStreams.

Ottenere un URL di importazione HLS da YouTube Creator Studio

Nell'interfaccia web di YouTube Creator Studio, dopo che il creator fa clic su "Crea stream", YouTube mostra una "chiave stream" composta da caratteri alfanumerici e trattini. Questa chiave segreta identifica sia il creator sia lo stream su YouTube.

Puoi creare un URL HLS da questa chiave stream nel seguente modo:

https://a.upload.youtube.com/http_upload_hls?cid=$STREAM_KEY&copy=0&file=

... dove $STREAM_KEY è la chiave stream visualizzata nell'interfaccia web. Ad esempio: https://a.upload.youtube.com/http_upload_hls?cid=abcd-efgh-ijkl-mnop-qrst&copy=0&file=

Per una maggiore affidabilità, puoi trasmettere una seconda copia ridondante dell'importazione a questo URL di backup:

https://b.upload.youtube.com/http_upload_hls?cid=$STREAM_KEY&copy=1&file=

Tieni presente che il backup presenta due differenze rispetto all'URL principale: sono cambiati sia il nome host sia il parametro copy=. L'importazione di backup deve inviare un copy= valore parametro diverso da quello dell'importazione principale per evitare di danneggiare lo stream.

Completare l'URL di importazione HLS

Gli URL ottenuti utilizzando uno dei due metodi sono modelli incompleti; ognuno termina con un parametro di query file= vuoto. Per formare l'URL finale, il codificatore deve aggiungere il nome file di una playlist multimediale o di un segmento multimediale alla fine dell'URL, completando così il parametro file=.

Al valore del parametro file= si applicano le seguenti regole:

  • Il codificatore può creare un nome file di playlist multimediale o segmento multimediale da caratteri alfanumerici, trattini bassi, barre, trattini e punti; non sono supportati altri caratteri.
  • Il codificatore non deve codificare l'URL del nome file.
  • Il codificatore può includere componenti di percorso relativi o assoluti nei nomi file, anche se non è mai obbligatorio. Se il codificatore include un componente di percorso all'interno di un nome file di segmento multimediale, deve fare riferimento allo stesso percorso nella voce della playlist corrispondente.

Requisiti del protocollo HLS

Le playlist multimediali e i segmenti multimediali inviati dal codificatore devono essere conformi a la specifica HTTP Live Streaming 2nd Edition.

La specifica HLS definisce due tipi di playlist: playlist multimediale e playlist principale. Poiché YouTube transcodifica i contenuti in streaming a diverse risoluzioni e bitrate, il codificatore non deve inviare contenuti con bitrate diversi a YouTube. Di conseguenza, YouTube supporta solo le playlist multimediali per l'importazione HLS, mentre le playlist principali vengono ignorate. (Una playlist principale fornisce un insieme di stream varianti, ognuno dei quali descrive una versione diversa degli stessi contenuti.)

Il codificatore deve:

  • inviare esattamente uno stream codificato con la risoluzione più alta che vuoi offrire agli utenti (risoluzione e codec singoli).
  • muxare audio e video.
  • utilizzare HTTPS e una connessione persistente per tutte le richieste.

Le sezioni seguenti contengono requisiti più specifici per le playlist multimediali e i segmenti multimediali.

Playlist multimediali

Una playlist multimediale contiene un elenco di segmenti multimediali che possono essere concatenati per rappresentare uno stream multimediale continuo e decodificabile. La playlist multimediale indica al server quali segmenti multimediali prevedere e come ordinarli correttamente nello stream riassemblato.

Requisiti

  • Il nome file della playlist multimediale deve terminare con .m3u8 o .m3u.

  • La prima playlist multimediale inviata per uno stream deve iniziare con il numero di sequenza 0 e il numero di sequenza deve aumentare in modo monotono.

  • Il tag EXT-X-MEDIA-SEQUENCE deve identificare il numero di sequenza del primo segmento multimediale elencato nella playlist.

  • Una playlist multimediale non deve contenere più di cinque segmenti in sospeso. Un segmento è in sospeso se il server non lo ha ricevuto o non ne ha riconosciuto la ricezione.

    Oltre ai segmenti in sospeso, includi anche alcuni segmenti riconosciuti in ogni playlist multimediale. In questo modo, è meno probabile che un segmento venga saltato se una playlist multimediale viene persa sul lato server. Ad esempio, puoi includere fino a due segmenti riconosciuti e fino a cinque segmenti in sospeso in ogni playlist multimediale.

    Tieni presente che il server riconosce la ricezione di un segmento multimediale restituendo una risposta 200 (OK) o 202 (Accepted) al caricamento del segmento. Una risposta 202 indica che il server ha ricevuto il segmento prima di una playlist che lo identifica.

  • Invia una playlist multimediale aggiornata per ogni segmento multimediale in modo che il server possa eseguire rapidamente il ripristino in caso di perdita di una playlist multimediale.

  • Man mano che il server riconosce la ricezione dei segmenti multimediali, puoi incrementare il valore del tag EXT-X-MEDIA-SEQUENCE per evitare che la playlist multimediale diventi troppo lunga. Ad esempio, se il server ha già riconosciuto la ricezione dei primi nove segmenti multimediali, la playlist multimediale successiva potrebbe elencare l'ottavo, il nono e il decimo segmento multimediale.

  • I tag EXT-X-KEY e EXT-X-SESSION-KEY non sono supportati.

Esempi

Il seguente elenco mostra un esempio dei file che il codificatore deve inviare:

Media Playlist file with seqnum #0
Media Segment file #0
Media Playlist file with seqnum #0-#1
Media Segment file #1
Media Playlist file with seqnum #0-#2
Media Segment file #2
Media Playlist file with seqnum #1-#3
Media Segment file #3
...

L'esempio seguente mostra una playlist multimediale inviata nel mezzo di uno stream video live. Poiché l'esempio proviene dal centro di uno stream, il tag EXT-X-MEDIA-SEQUENCE ha un valore diverso da zero.

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:2680

#EXTINF:3.975,
fileSequence2680.ts
#EXTINF:3.941,
fileSequence2681.ts
#EXTINF:3.975,
fileSequence2682.ts

Segmenti multimediali

Il seguente elenco identifica i requisiti per i segmenti multimediali:

  • Nomi file
    • I nomi file dei segmenti multimediali nell'URL devono avere l'estensione .ts e devono corrispondere ai nomi file nella playlist.
    • I nomi file dei segmenti multimediali devono essere univoci tra i riavvii del codificatore e i riavvii dello stream.
  • Formato
    • I segmenti multimediali devono essere in formato M2TS e devono essere auto-inizializzanti.
    • Ogni segmento M2TS deve contenere un singolo programma MPEG-2.
    • Il segmento M2TS deve contenere un PAT e un PMT e i primi due pacchetti Transport Stream in un segmento devono essere un PAT e un PMT.
  • Contenuti
    • Audio e video devono essere muxati.
    • I codec video supportati sono H.264 e HEVC.
    • È supportato l'HDR con HEVC (vedi Requisiti HDR).
    • Sono supportate frequenze fotogrammi fino a 60 fps.
    • È supportato solo il GOP chiuso.
    • Il codec audio supportato è AAC ed è supportato solo l'audio a traccia singola.
    • È consigliabile che i segmenti multimediali abbiano una durata compresa tra uno e quattro secondi, come descritto nella sezione seguente. I segmenti multimediali non devono avere una durata superiore a 5 secondi.
    • I segmenti multimediali devono essere criptati solo nel livello TLS/SSL con HTTPS. Non sono supportati altri meccanismi di crittografia.

Durata del segmento multimediale

Prevediamo che l'importazione HLS venga utilizzata per i contenuti premium che richiedono alta qualità e alta risoluzione. L'importazione HLS di solito ha una latenza maggiore rispetto alle importazioni basate su RTMP e WebRTC perché è basata su segmenti.

Consigliamo una durata del segmento multimediale compresa tra uno e quattro secondi, perché segmenti multimediali più piccoli possono comportare una latenza inferiore, anche se a costo di una frequenza di rebuffer maggiore e di una minore efficienza di codifica. Come indicato nella sezione precedente, i segmenti multimediali non devono avere una durata superiore a 5 secondi.

Bitrate

Il Centro assistenza YouTube fornisce linee guida per le impostazioni del bitrate.

Tieni presente che HEVC in genere produce una compressione dei dati dal 25% al 50% in più con la stessa qualità video rispetto a H.264. Di conseguenza, i valori del bitrate nella parte inferiore degli intervalli suggeriti possono essere utilizzati con HEVC per risparmiare larghezza di banda, il che è particolarmente utile per i contenuti 4K.

Altri requisiti

  • I codificatori devono impostare l'intestazione User-Agent nella richiesta HTTP utilizzando la seguente sintassi, che include il nome del produttore, il nome del modello e la versione:

    User-Agent: <manufacturer> / <model> / <version>
    

Sottotitoli codificati

L'importazione HLS supporta due opzioni per l'invio di sottotitoli codificati:

  • Invia i sottotitoli codificati utilizzando richieste POST HTTP separate. Questa opzione funziona per tutte le importazioni HLS.
  • I sottotitoli codificati 608/708 incorporati funzionano con le importazioni HLS che utilizzano il codec video H264 , ma non con le importazioni che utilizzano il codec video HEVC. Per maggiori dettagli, consulta i Requisiti per i sottotitoli live nel Centro assistenza YouTube.

Codici di risposta HTTP

Le sezioni seguenti spiegano i codici di risposta restituiti da YouTube in risposta ai segmenti multimediali e alle playlist multimediali forniti utilizzando HLS.

200 (OK)

In risposta a una richiesta PUT o POST, una risposta HTTP 200 (OK) indica che il server di YouTube ha ricevuto un'operazione prevista e l'ha gestita correttamente.

In risposta a una richiesta DELETE, una risposta HTTP 200 (OK) indica che il server di YouTube ha ricevuto e ignorato la richiesta. Il server di YouTube non richiede al client di ELIMINARE alcuna risorsa nello stream e ignora le richieste DELETE. Per motivi di prestazioni, YouTube consiglia ai client di non inviare DELETE.

202 (Accettato)

Una risposta HTTP 202 (Accepted) indica che il server di YouTube ha ricevuto il segmento multimediale prima di ricevere una playlist multimediale contenente quel segmento multimediale. Questo indica al client che deve inviare la playlist multimediale contenente il segmento multimediale il prima possibile per evitare un ritardo nell'elaborazione del segmento. Tieni presente che questo non sarà un problema se il codificatore invia una playlist multimediale aggiornata per ogni segmento multimediale.

400 (Richiesta non valida)

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

  • Formato URL non valido
  • Impossibile analizzare la playlist o contiene tag non supportati
401 (Non autorizzato)

Una risposta HTTP 401 (Unauthorized) indica che il parametro cid nell'URL di base per l'endpoint HLS di YouTube è danneggiato o scaduto. Il client deve aggiornare il parametro cid per continuare.

405 (Metodo non consentito)

Una risposta HTTP 405 (Method Not Allowed) indica che la richiesta non era una richiesta POST, PUT o DELETE.

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.