Caricare contenuti dal vivo di YouTube tramite HLS

Questo documento spiega come utilizzare il protocollo HTTP Live Streaming (HLS) per trasmettere in streaming dati in tempo reale su YouTube da un codificatore. Questo documento è destinato ai fornitori di codificatori che vogliono aggiungere il supporto per l'inserimento HLS ai loro prodotti. L'importazione HLS è una buona scelta per i contenuti premium che richiedono alta qualità e alta risoluzione a una latenza relativamente più elevata. 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 in streaming dati in tempo reale utilizzando HLS, il codificatore deve inviare una serie di playlist multimediali e segmenti multimediali all'endpoint HLS di YouTube utilizzando 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 del flusso.

Requisiti per il formato dei contenuti multimediali

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

  • Video e audio 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 singola traccia.

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

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 e HLG a 10 bit 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 valori di esempio sia a intervallo limitato (o intervallo MPEG) sia 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 valori campione a intervallo limitato.

Ottenere un URL di importazione HLS

Ottenere un URL di importazione HLS dall'API 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 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 saperne di più, consulta la documentazione relativa alla risorsa liveStreams.

Ottenere un URL di caricamento HLS da YouTube Creator Studio

Nell'interfaccia web di YouTube Creator Studio, dopo che il creator ha fatto 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 l'hostname sia il parametro copy=. L'importazione del backup deve inviare un valore del parametro copy= diverso rispetto all'importazione principale per evitare di danneggiare lo stream.

Completamento dell'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 segmento multimediale o playlist 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.
  • L'encoder può includere componenti di percorso relativi o assoluti nei nomi file, anche se non è mai necessario. 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 di playlist corrispondente.

Requisiti del protocollo HLS

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

La specifica HLS definisce due tipi di playlist: playlist multimediale e playlist principale. Poiché YouTube esegue la transcodifica dei 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. Un elenco principale fornisce un insieme di flussi delle varianti, ognuno dei quali descrive una versione diversa dello stesso contenuto.

L'encoder deve:

  • invia esattamente un flusso codificato con la risoluzione più alta che vuoi mostrare agli utenti (codec e risoluzione singoli).
  • mux 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 un flusso multimediale continuo e decodificabile. La playlist multimediale indica al server quali segmenti multimediali aspettarsi e come ordinarli correttamente nel flusso riassemblato.

Requisiti

  • Il nome del 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 confermato la ricezione.

    Oltre ai segmenti in sospeso, includi anche alcuni segmenti riconosciuti in ogni playlist di contenuti multimediali. Questa pratica riduce la probabilità che un segmento venga ignorato 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 di contenuti multimediali.

    Tieni presente che il server conferma 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 ripristinare rapidamente una playlist multimediale in caso di perdita.

  • Man mano che il server conferma 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à confermato 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 l'encoder 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 dalla metà 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 di contenuti multimediali

Il seguente elenco identifica i requisiti per i segmenti media:

  • Nomi dei file
    • I nomi dei file dei segmenti multimediali nell'URL devono avere l'estensione del nome file .ts e devono corrispondere ai nomi dei file nella playlist.
    • I nomi dei file dei segmenti multimediali devono essere univoci nei riavvii del codificatore e nei riavvii dello stream.
  • Formato
    • I segmenti multimediali devono essere in formato M2TS e devono essere auto-inizializzati.
    • 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
    • Video e audio devono essere muxati.
    • I codec video supportati sono H.264 e HEVC.
    • L'HDR con HEVC è supportato (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.
    • Si consiglia di impostare una durata compresa tra uno e quattro secondi per i segmenti multimediali, come descritto nella sezione seguente. I segmenti multimediali non devono durare più di 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'inserimento HLS venga utilizzato per i contenuti premium che richiedono alta qualità e alta risoluzione. L'importazione HLS in genere ha una latenza maggiore rispetto alle importazioni basate su RTMP e WebRTC perché si basa su segmenti.

Consigliamo una durata del segmento multimediale compresa tra 1 e 4 secondi, perché segmenti multimediali più piccoli possono comportare una latenza inferiore, anche se a costo di un tasso di rebuffer più elevato e di un'efficienza di codifica inferiore. Come indicato nella sezione precedente, i segmenti multimediali non devono durare più di 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 superiore del 25-50% a parità di qualità video rispetto a H.264. Pertanto, i valori di 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'inserimento HLS supporta due opzioni per l'invio dei sottotitoli codificati:

  • Invia i sottotitoli codificati utilizzando richieste POST HTTP separate. Questa operazione 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 ulteriori dettagli, consulta i requisiti per i sottotitoli in tempo reale 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 pubblicati utilizzando HLS.

200 (OK)

In risposta a una richiesta PUT o POST, una risposta HTTP 200 (OK) indica che il server 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 YouTube ha ricevuto e ignorato la richiesta. Il server YouTube non richiede al client di eliminare alcuna risorsa nel flusso e ignora le richieste DELETE. Per motivi di rendimento, YouTube consiglia ai clienti di non inviare eliminazioni.

202 (Accettato)

Una risposta HTTP 202 (Accettato) indica che il server YouTube ha ricevuto il segmento multimediale prima di ricevere una playlist multimediale contenente quel segmento multimediale. Questo indica al client di inviare l'elenco di riproduzione multimediale contenente il segmento multimediale il prima possibile per evitare ritardi nell'elaborazione di questo segmento. Tieni presente che questo non sarà un problema se il codificatore invia un elenco di riproduzione multimediale aggiornato per ogni segmento multimediale.

400 (Richiesta errata)

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

  • Formato URL non valido
  • La playlist non può essere analizzata o contiene tag non supportati
401 (Non autorizzato)

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

405 (Method Not Allowed)

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.