Este documento explica como usar o protocolo HTTP Live Streaming (HLS) para transmitir dados ao vivo no YouTube usando um codificador. Este documento é destinado a fornecedores de codificadores que querem adicionar suporte à ingestão de HLS aos produtos. A ingestão de HLS é uma boa opção para conteúdo premium que exige alta qualidade e alta resolução com uma latência relativamente maior. Para uma breve comparação dos diferentes protocolos de ingestão compatíveis com o YouTube Live Streaming, consulte Comparação de protocolos de ingestão do YouTube Live Streaming.
Para transmitir dados ao vivo usando HLS, o codificador precisa enviar uma série de playlists de mídia e segmentos de mídia para o endpoint HLS do YouTube usando solicitações HTTP PUT
ou POST
. Do ponto de vista do codificador, o endpoint HLS do YouTube
parece ser um servidor HTTP passivo.
Cada segmento de mídia representa o conteúdo multimídia real de uma pequena parte do stream, com duração entre um e quatro segundos. Cada playlist de mídia descreve como remontar os segmentos de mídia na ordem correta do stream.
Requisitos de formato de mídia
A ingestão de HLS do YouTube tem os seguintes requisitos para conteúdo de vídeo e áudio:
- O vídeo e o áudio precisam ser mixados no formato M2TS.
- Os codecs de vídeo compatíveis são H.264 e HEVC.
- São aceitas taxas de até 60 fps.
- Somente GOP fechado é aceito.
- O codec de áudio compatível é AAC, e apenas áudio de faixa única é aceito.
Consulte os requisitos mais detalhados na seção Segmentos de mídia.
HDR
Os vídeos em High Dynamic Range (HDR) são compatíveis com o codec HEVC e têm os seguintes requisitos adicionais:
- Os padrões de cores compatíveis são PQ e HLG de 10 bits com luminância não constante.
Mais especificamente:
- O formato de croma precisa ser YUV 4:2:0 de 10 bits.
- A função de transferência precisa ser PQ (também conhecida como SMPTE ST 2084) ou HLG (também conhecida como ARIB STD-B67).
- As cores primárias precisam ser Rec. 2020.
- Os coeficientes de matriz precisam ser Rec. 2020 luminância não constante.
- Valores de amostra de intervalo limitado (ou intervalo MPEG) e intervalo completo (ou intervalo JPEG) são aceitos. É importante que o intervalo seja definido de acordo com o intervalo de valores de amostra usado pelo conteúdo. É recomendável usar valores de amostra de intervalo limitado.
Como conseguir um URL de transferência com HLS
Como conseguir um URL de transmissão HLS da API do YouTube
Para receber o URL de ingestão completo, os codificadores podem usar a API YouTube Live Streaming para inserir um recurso liveStream com as seguintes propriedades:
"cdn": {
"ingestionType": "hls",
"frameRate": "variable",
"resolution": "variable"
}
Na resposta da API, o campo cdn.ingestionInfo.ingestionAddress
especifica
o URL de ingestão principal, e o campo cdn.ingestionInfo.backupIngestionAddress
especifica o URL de ingestão de backup. Para mais detalhes, consulte a documentação do
recurso liveStreams
.
Como conseguir um URL de ingestão HLS no YouTube Studio
Na interface da Web do YouTube Studio, depois que o criador de conteúdo clica em "Criar" "Transmissão", o YouTube mostra uma "Chave de transmissão" com caracteres alfanuméricos e hífens. Essa chave secreta identifica o criador de conteúdo e a transmissão para o YouTube.
Você pode criar um URL HLS com base nessa chave de stream da seguinte maneira:
https://a.upload.youtube.com/http_upload_hls?cid=$STREAM_KEY©=0&file=
... em que $STREAM_KEY
é a chave de transmissão exibida na interface da Web.
Por exemplo:
https://a.upload.youtube.com/http_upload_hls?cid=abcd-efgh-ijkl-mnop-qrst©=0&file=
Para aumentar a confiabilidade, transmita uma segunda cópia redundante da ingestão para este URL de backup:
https://b.upload.youtube.com/http_upload_hls?cid=$STREAM_KEY©=1&file=
Observe que o backup tem duas diferenças em relação ao URL principal: o nome do host e o parâmetro copy=
foram alterados. A ingestão de backup precisa enviar
um valor de parâmetro copy=
diferente da ingestão principal para evitar
corromper o fluxo.
Como preencher o URL de transferência com HLS
Os URLs obtidos usando qualquer um dos métodos são modelos incompletos. Cada um termina com um parâmetro de consulta file=
vazio. Para formar o URL final, o codificador precisa
anexar o nome de arquivo de uma lista de reprodução de mídia ou de um segmento de mídia ao final do URL,
concluindo assim o parâmetro file=
.
As seguintes regras se aplicam ao valor do parâmetro file=
:
- O codificador pode criar um nome de arquivo de lista de reprodução de mídia ou segmento de mídia com caracteres alfanuméricos, sublinhados, barras, hífens e pontos. Nenhum outro caractere é aceito.
- O codificador não pode codificar o nome do arquivo por URL.
- O codificador pode incluir componentes de caminho relativo ou absoluto em nomes de arquivos, mas isso nunca é necessário. Se o codificador incluir um componente de caminho em um nome de arquivo de segmento de mídia, ele precisará referenciar o mesmo caminho na entrada de playlist correspondente.
Requisitos do protocolo HLS
As listas de reprodução de mídia e os segmentos de mídia enviados pelo codificador precisam estar em conformidade com a especificação do HTTP Live Streaming, 2ª edição.
A especificação HLS define dois tipos de playlist: playlist de mídia e playlist principal. Como o YouTube transcodifica o conteúdo transmitido para diferentes resoluções e taxas de bits, o codificador não precisa enviar conteúdo com taxas de bits diferentes para o YouTube. Por isso, o YouTube só aceita playlists de mídia para ingestão de HLS, e as playlists master são ignoradas. Uma playlist principal fornece um conjunto de fluxos de variantes, cada um descrevendo uma versão diferente do mesmo conteúdo.
O codificador precisa:
- envie exatamente um stream codificado com a resolução mais alta que você quer oferecer aos usuários (resolução e codec únicos).
- multiplexar áudio e vídeo.
- usar HTTPS e uma conexão persistente para todas as solicitações.
As seções a seguir contêm requisitos mais específicos para playlists e segmentos de mídia.
Playlists de mídia
Uma playlist de mídia contém uma lista de segmentos de mídia que podem ser concatenados para representar um stream multimídia contínuo e decodificável. A lista de reprodução de mídia informa ao servidor quais segmentos de mídia esperar e como ordená-los corretamente no fluxo remontado.
Requisitos
O nome do arquivo da playlist de mídia precisa terminar com
.m3u8
ou.m3u
.A primeira lista de reprodução de mídia enviada para um stream precisa começar com o número de sequência
0
, e esse número precisa aumentar de forma monotônica.A tag
EXT-X-MEDIA-SEQUENCE
precisa identificar o número de sequência do primeiro segmento de mídia listado na playlist.Uma playlist de mídia não pode ter mais de cinco segmentos pendentes. Um segmento está pendente se o servidor não o recebeu ou não confirmou o recebimento dele.
Além dos segmentos pendentes, inclua também alguns segmentos reconhecidos em cada playlist de mídia. Assim, é menos provável que um segmento seja ignorado se uma playlist de mídia for perdida no lado do servidor. Por exemplo, é possível incluir até dois segmentos confirmados e até cinco pendentes em cada playlist de mídia.
O servidor confirma o recebimento de um segmento de mídia retornando uma resposta
200
(OK
) ou202
(Accepted
) no upload desse segmento. Uma resposta202
indica que o servidor recebeu o segmento antes de uma playlist que o identificava.Envie uma playlist de mídia atualizada para todos os segmentos de mídia para que o servidor possa se recuperar rapidamente se uma playlist de mídia for perdida.
À medida que o servidor confirma o recebimento dos segmentos de mídia, é possível aumentar o valor da tag
EXT-X-MEDIA-SEQUENCE
para evitar que a playlist de mídia fique muito longa. Por exemplo, se o servidor já tiver confirmado o recebimento dos nove primeiros segmentos de mídia, a próxima lista de reprodução de mídia poderá listar o oitavo, nono e décimo segmentos de mídia.As tags
EXT-X-KEY
eEXT-X-SESSION-KEY
não são compatíveis.
Exemplos
A lista a seguir mostra um exemplo dos arquivos que o codificador precisa enviar:
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
...
O exemplo a seguir mostra uma lista de reprodução de mídia enviada no meio de uma transmissão de vídeo ao vivo. Como o exemplo é do meio de um stream, a tag
EXT-X-MEDIA-SEQUENCE
tem um valor diferente de 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
Segmentos de mídia
A lista a seguir identifica os requisitos para segmentos de mídia:
- Nomes de arquivos
- Os nomes de arquivo do segmento de mídia no URL precisam ter a extensão
.ts
e corresponder aos nomes de arquivo na playlist. - Os nomes dos arquivos de segmento de mídia precisam ser exclusivos em reinicializações do codificador e reinícios de stream.
- Os nomes de arquivo do segmento de mídia no URL precisam ter a extensão
- Formato
- Os segmentos de mídia precisam estar no formato M2TS e ser autoinicializados.
- Cada segmento M2TS precisa conter um único programa MPEG-2.
- O segmento M2TS precisa conter uma PAT e uma PMT, e os dois primeiros pacotes de stream de transporte em um segmento precisam ser uma PAT e uma PMT.
- Conteúdo
- O vídeo e o áudio precisam ser mixados.
- Os codecs de vídeo compatíveis são H.264 e HEVC.
- O HDR com HEVC é compatível (consulte os requisitos de HDR).
- São aceitas taxas de até 60 fps.
- Somente GOP fechado é aceito.
- O codec de áudio compatível é AAC, e apenas áudio de faixa única é compatível.
- Recomendamos que os segmentos de mídia tenham uma duração entre um e quatro segundos, conforme discutido na seção a seguir. Os segmentos de mídia não podem ter uma duração maior que 5 segundos.
- Os segmentos de mídia só podem ser criptografados na camada TLS/SSL com HTTPS. Outros mecanismos de criptografia não são compatíveis.
Duração do segmento de mídia
Esperamos que a ingestão de HLS seja usada para conteúdo premium que exige alta qualidade e alta resolução. A ingestão de HLS geralmente tem latência maior do que as ingestões baseadas em RTMP e WebRTC porque é baseada em segmentos.
Recomendamos uma duração de segmento de mídia de um a quatro segundos, porque ter segmentos menores pode resultar em latência mais baixa, embora com um custo de taxa de rebuffer mais alta e eficiência de codificação mais baixa. Como observado na seção anterior, os segmentos de mídia não podem ter mais de cinco segundos.
Taxas de bits
A Central de Ajuda do YouTube oferece diretrizes para configurações de taxa de bits.
O HEVC geralmente gera de 25% a 50% mais compactação de dados com a mesma qualidade de vídeo em comparação com o H.264. Assim, os valores de taxa de bits na extremidade inferior dos intervalos sugeridos podem ser usados com HEVC para economizar largura de banda, o que é especialmente útil para conteúdo 4K.
Outros requisitos
Os codificadores precisam definir o cabeçalho
User-Agent
na solicitação HTTP usando a seguinte sintaxe, que inclui o nome do fabricante, o nome do modelo e a versão:User-Agent: <manufacturer> / <model> / <version>
Closed captions
A ingestão de HLS oferece duas opções para envio de legendas descritivas:
- Envie legendas descritivas usando solicitações HTTP POST separadas. Isso funciona para todas as transmissões HLS.
- As legendas ocultas 608/708 incorporadas funcionam com ingestões HLS que usam o codec de vídeo H264, mas não com ingestões que usam o codec de vídeo HEVC. Para mais detalhes, consulte os requisitos de legendas instantâneas na Central de Ajuda do YouTube.
Códigos de resposta HTTP
As seções a seguir explicam os códigos de resposta que o YouTube retorna em resposta a segmentos de mídia e playlists de mídia entregues usando HLS.
- 200 (OK)
Em resposta a uma solicitação PUT ou POST, uma resposta HTTP 200 (OK) indica que o servidor do YouTube recebeu uma operação esperada e a processou com sucesso.
Em resposta a uma solicitação DELETE, uma resposta HTTP 200 (OK) indica que o servidor do YouTube recebeu e ignorou a solicitação. O servidor do YouTube não exige que o cliente exclua nenhum recurso no stream e ignora solicitações de exclusão. Por motivos de desempenho, o YouTube recomenda que os clientes não enviem comandos DELETE.
- 202 (Aceito)
Uma resposta HTTP 202 (Aceito) indica que o servidor do YouTube recebeu o segmento de mídia antes de receber uma playlist de mídia que o contenha. Isso indica ao cliente que ele precisa enviar a lista de reprodução de mídia contendo esse segmento de mídia o mais rápido possível para evitar um atraso no processamento dele. Isso não será um problema se o codificador enviar uma lista de reprodução de mídia atualizada para cada segmento de mídia.
- 400 (Solicitação inválida)
Uma resposta HTTP 400 (solicitação inválida) indica que um dos seguintes problemas ocorreu:
- O URL está incorreto
- Não é possível analisar a playlist ou ela contém tags sem suporte
- 401 (Não autorizado)
Uma resposta HTTP 401 (Não autorizado) indica que o parâmetro "cid" no URL base do endpoint HLS do YouTube está corrompido ou expirou. O cliente precisa atualizar o parâmetro
cid
para continuar.- 405 (Método não permitido)
Uma resposta HTTP 405 (Method Not Allowed) indica que a solicitação não era POST, PUT ou DELETE.
- 500 (erro interno do servidor)
Uma resposta HTTP 500 (erro interno do servidor) indica que o servidor não conseguiu processar a solicitação. Para esse erro, recomendamos que você tente de novo com espera exponencial.