Caricare contenuti dal vivo di YouTube tramite HLS

Questo documento spiega come utilizzare il protocollo HTTP Live Streaming (HLS) per trasmettere in streaming i dati in tempo reale su YouTube da un codificatore. Questo documento è rivolto ai fornitori di codificatori che vogliono aggiungere il supporto dell'importazione HLS ai propri 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 dei diversi protocolli di importazione supportati da YouTube Live Streaming, consulta Confronto dei protocolli di importazione di YouTube Live Streaming.

Per trasmettere in streaming i 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 parte dello stream della durata compresa tra 1 e 4 secondi. Ogni playlist multimediale descrive come ricomporre i segmenti multimediali nell'ordine corretto dello stream.

Requisiti per i formati multimediali

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

  • Il video e l'audio devono essere uniti 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 e viene supportato solo l'audio a traccia singola.

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

HDR

I video HDR (High Dynamic Range) 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 di crominanza 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 di luminanza non costante Rec. 2020.
  • Sono supportati sia i valori di sample con intervallo limitato (o MPEG) sia quelli con intervallo completo (o JPEG). È importante che l'intervallo sia impostato in base all'intervallo di valori di esempio utilizzato dai contenuti. Sono consigliati valori di esempio con 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 dell'API, il campo cdn.ingestionInfo.ingestionAddress specifica l'URL di importazione principale e il campo cdn.ingestionInfo.backupIngestionAddress specifica l'URL di importazione di backup. Per ulteriori dettagli, consulta la documentazione relativa alla risorsa liveStreams.

Ottenere un URL di importazione HLS da YouTube Studio

Nell'interfaccia web di YouTube 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 come segue:

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: sia il nome host sia il parametro copy= sono stati modificati. L'importazione del backup deve inviare un valore del parametro copy= diverso rispetto all'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 una playlist multimediale o di un 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.
  • L'encoder può includere componenti di percorso relativi o assoluti nei nomi file, anche se non è mai obbligatorio. Se il codificatore include un componente del percorso all'interno del nome file di un 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 alle specifiche di HTTP Live Streaming 2ª edizione.

La specifica HLS definisce due tipi di playlist: Media Playlist e Master Playlist. Poiché YouTube transcodifica i contenuti in streaming in risoluzioni e bitrate diversi, l'encoder 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 di varianti, ognuno dei quali descrive una versione diversa degli stessi contenuti.

L'encoder deve:

  • Invia esattamente uno stream codificato con la risoluzione più alta che vuoi offrire agli utenti (una sola risoluzione e codec).
  • mux audio e video.
  • Utilizza HTTPS e una connessione persistente per tutte le richieste.

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

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 aspettarsi e come ordinarli correttamente nello stream ricomposto.

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 monotonico.

  • 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 confermati in ogni playlist multimediale. Questa pratica riduce la probabilità che un segmento venga saltato se una playlist multimediale viene persa lato server. Ad esempio, in ogni playlist multimediale puoi includere fino a due segmenti confermati e fino a cinque segmenti in sospeso.

    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 recuperare rapidamente una playlist multimediale persa.

  • Quando 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

L'elenco seguente mostra un esempio dei file che l'encoder dovrebbe 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 un live streaming. Poiché l'esempio è tratto 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 di media

Il seguente elenco identifica i requisiti per i segmenti di media:

  • 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 dei file dei segmenti multimediali devono essere univoci dopo i riavvii dell'encoder e i riavvii dello stream.
  • Formato
    • I segmenti multimediali devono essere in formato M2TS e devono essere autoinizializzanti.
    • 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 uniti.
    • 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.
    • È consigliabile che i segmenti multimediali abbiano una durata compresa tra 1 e 4 secondi, come spiegato 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 di media

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

Consigliamo una durata del segmento multimediale compresa tra 1 e 4 secondi perché avere segmenti multimediali più piccoli può comportare una latenza inferiore, anche se a un costo di un tasso di buffering 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 della velocità in bit.

Tieni presente che HEVC in genere offre una compressione dei dati superiore del 25-50% con la stessa qualità video rispetto a H.264. Di conseguenza, i valori di velocità in bit 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

  • Gli encoder 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 dei sottotitoli codificati:

  • Invia i sottotitoli codificati utilizzando richieste POST HTTP separate. Questo metodo 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 di Sottotitoli in tempo reale nel Centro assistenza YouTube.

Codici di risposta HTTP

Le sezioni seguenti spiegano i codici di risposta che YouTube restituisce 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 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 rendimento, YouTube consiglia ai client di non inviare comandi DELETE.

202 (Accettato)

Una risposta HTTP 202 (Accettata) indica che il server di YouTube ha ricevuto il segmento multimediale prima di ricevere una playlist multimediale contenente il segmento multimediale. Questo indica al client che deve inviare la playlist multimediale contenente quel 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 media aggiornata per ogni segmento media.

400 (Richiesta non valida)

Una risposta HTTP 400 (Richiesta non valida) 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 HLS di YouTube è danneggiato o scaduto. Il cliente deve aggiornare il parametro cid per poter procedere.

405 (Method Not Allowed)

Una risposta HTTP 405 (Metodo non consentito) 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 è stato in grado di elaborare la richiesta. Per questo errore, ti consigliamo di riprovare la richiesta con il backoff esponenziale.