Skip to content

HLS

media.ingest.hls

Descrição

O Sapsan segue uma playlist HLS de terceiros em modo cliente (pull): sonda a playlist, baixa os segmentos e entrega quadros ao pipeline tal como RTSP, SRT ou MPEG-TS. É assim que entrega o stream quase todo agregador, toda CDN de terceiros e todo parceiro a quem não foi permitido abrir UDP ou SRT.

Configuração

Configure o stream pela API do central. Trecho de configuração:

streams:
  - name: chan1
    inputs:
    - hls:
        url: https://cdn.example.com/live/index.m3u8

Parâmetros

Parâmetro Por padrão Descrição
url — endereço da playlist exatamente como o operador o escreveu
headers nenhum cabeçalhos adicionados a cada requisição à fonte: playlist, segmentos, chaves
variant_mode single single — uma variante do master, ladder — a escada inteira
variant_bandwidth nenhum com qual bitrate casar a variante (o mais próximo abaixo); sem ele vence o maior BANDWIDTH
skew_threshold_ms 500 o desvio a partir do qual a escada é declarada fora de sincronia
skew_policy report o que fazer diante de um veredito skewed: report — continuar e mostrar, fallback_to_single — recuar para uma variante só
connect_timeout_ms 5000 tempo limite de estabelecimento da conexão
read_timeout_ms 15000 tempo limite do corpo: playlist, segmento, chave
max_body_bytes 64 MiB limite de tamanho de uma única resposta
peer_timeout_ms global quanto esperar quadros antes de considerar a fonte perdida

Autenticação

Duas formas, e elas se combinam:

  • cabeçalhos — headers, por exemplo Authorization: Bearer <token>; vão com a playlist, as variantes, os segmentos init, os segmentos e as chaves do mesmo origin, e nunca seguem um redirecionamento para um origin de terceiros;
  • credenciais na própria URL — autenticação Basic comum feita pelo cliente HTTP.

Os valores dos cabeçalhos nunca chegam ao log: só os nomes são impressos. O endereço da entrada é escrito inteiro nos logs e devolvido como está pela API de gerenciamento — qual parte desse endereço é o segredo, só o operador sabe, e uma máscara às cegas ou deixaria o token na query, ou cortaria justamente aquilo pelo que a entrada é reconhecida no log.

Opções de transporte

HTTP ou HTTPS; listas/manifestos e segmentos usam requisições independentes.

Codecs compatíveis

Os codecs aceitos dependem do contêiner dos segmentos. MPEG-TS e fMP4 são contêineres; HLS obtém playlists e segmentos.

Segmentos MPEG-TS:

  • H.264
  • HEVC / H.265
  • AV1
  • JPEG 2000
  • MPEG-2 Video
  • AAC (ADTS)
  • AC-3
  • E-AC-3
  • MPEG Audio (Layer II / III)
  • SMPTE ST 302M

MPEG-TS é o contêiner; SRT, RIST, UDP e HTTP são transportes de entrega. A lista descreve a extração de frames de MPEG-TS, não sua decodificação nem a compatibilidade do reprodutor.

AV1 requer stream_type 0x06 e o descritor de registro AV01 na PMT; cada PES deve conter um temporal unit completo. AV1 em MPEG-TS sem essa sinalização não é aceito. AAC é analisado como ADTS; reconhecer stream_type 0x11 não implica suporte a LATM. Opus pode ser identificado na PMT, mas o analisador PES atual não emite seus frames.

Segmentos fMP4:

  • H.264
  • HEVC / H.265
  • AV1
  • MPEG-2 Video
  • JPEG
  • AAC
  • AC-3
  • E-AC-3
  • MPEG Audio (Layer II / III)
  • Opus
  • G.711 A-law / μ-law

São os codecs que a entrada extrai de fMP4, não uma lista de capacidades de decodificação. H.264 usa avc1/avc3, HEVC usa hvc1/hev1 e AV1 usa av01 com av1C. MPEG-2 Video requer mp4v com configuração MPEG-2; isso não implica suporte a MPEG-4 Visual. JPEG é uma faixa de imagens. MPEG Audio é identificado por esds ou uma sample entry MP3; mp4a por si só não significa AAC. Opus usa Opus/dOps e G.711 usa alaw/ulaw. As declarações do contêiner devem corresponder aos dados; declarar um codec no MPD não substitui um segmento de inicialização válido.

Esta entrada não aceita packed audio (ADTS independente ou ID3+AAC sem MPEG-TS/fMP4).

Comportamento em caso de erro

O estado da entrada e a causa da falha estão nas estatísticas do stream. Desconexão ou ausência de quadros usa os mecanismos de repetição e comutação para reserva.

Aplicação de alterações

Só uma mudança de url, headers ou dos ajustes HTTP (connect_timeout_ms, read_timeout_ms, max_body_bytes) reinicia a entrada: uma fonte nova tem sua própria numeração de faixas, seu próprio init e sua própria posição na playlist. Todo o resto — modo de variante, limite e política de desvio, peer_timeout_ms — é aplicado em tempo real, sem interromper a transmissão.

Contadores

As tabelas mostram os nomes exatos dos campos de estatísticas do protocolo, incluindo contadores de eventos e indicadores do valor atual. Campos zerados podem ser omitidos. API e Prometheus expõem projeções diferentes; uma única resposta da Admin API não contém necessariamente toda a lista. O detalhe depende da licença de contadores.

Totais comuns da entrada: bytes, frames, errors, warnings. Eles agregam dados do protocolo; não devem ser somados novamente aos contadores do protocolo.

Hls

Campo Tipo
segments counter
bytes counter
frames counter
playlist_reloads counter
discontinuities counter
segments_skipped counter
segments_gone counter
segments_cancelled counter
segments_gap counter
errors_playlist counter
errors_segment_network counter
errors_segment_status counter
errors_segment_decode counter
errors_decrypt counter
fragment_gaps counter
fragment_overlaps counter
fragment_seam_error_ms counter
edge_distance_ms counter
playlist_updated_at gauge
frames_emitted_at gauge
memory_bytes gauge
ad_marks counter
errors_ad_marks_dropped counter
warning_ad_mark_descriptors_dropped counter

Outros detalhes

Regra de início

Tudo o que já estava na playlist no momento da conexão é história. A captura começa pelo primeiro segmento que aparece depois da conexão, e numa reconexão ela se comporta igual.

Não existe de propósito ajuste de profundidade de início: caso contrário, a cada queda de conexão o stream despejaria no pipeline, em segundos, a janela acumulada, em vez de transmitir.

Escada de qualidades e desvio das renditions

Com variant_mode: ladder captura-se toda variante do master. A de maior BANDWIDTH passa a ser a referência, e as demais são comparadas com ela segmento a segmento, pelo número de sequência de mídia. O veredito fica exposto na estatística da entrada, campo hls_ladder:

  • synced — as renditions andam juntas, comutar entre elas é seguro;
  • skewed — o desvio passou do limite ou a estrutura está quebrada: a comutação dará trancos ou dessincronizará;
  • unmeasurable — não há com o que comparar, nenhum par de segmentos compartilha número.

O desvio é medido de duas maneiras ao mesmo tempo. O declarado é a diferença de EXT-X-PROGRAM-DATE-TIME na marcação; o real é a diferença do tempo de mídia dos primeiros quadros. Quando os dois discordam, o doente é a marcação, não o stream, e quem conserta é o dono da fonte.

Note

O Sapsan não traz as variantes da escada para uma escala de tempos comum, e não conserta de jeito nenhum um conteúdo ruim: um conserto silencioso não torna a escada comutável, apenas esconde o defeito. Por isso o desvio é mostrado como número, e quem decide é o operador.

A política fallback_to_single derruba a captura para uma variante só diante de um veredito skewed — para algumas fontes é o único modo viável. O recuo dura até a entrada ser reiniciada.

Criptografia

São suportados AES-128 (o segmento inteiro) e SAMPLE-AES (por quadro, para H.264 e AAC). A chave é buscada pelo mesmo cliente e com os mesmos cabeçalhos que todo o resto, e fica em cache por endereço, de modo que a rotação de chaves no meio de uma playlist funciona sozinha — uma chave nova tem outro endereço.

Um servidor de chaves calado é um erro de entrada com o endereço da chave e o código de resposta; o corpo do segmento não é baixado de forma alguma, já que não haveria com o que descriptografá-lo.

CENC/DRM (Widevine, PlayReady, FairPlay) não é suportado e é rejeitado pelo nome do KEYFORMAT.

O que é suportado

Funcionalidade Estado
Playlist de mídia: EXT-X-MEDIA-SEQUENCE, EXTINF, EXT-X-ENDLIST sim
Playlist master: seleção de variante, renditions EXT-X-MEDIA sim
Segmentos fMP4 (EXT-X-MAP) e MPEG-TS sim
EXT-X-BYTERANGE sim
EXT-X-DISCONTINUITY, recriação da playlist, ficar atrás da janela sim
EXT-X-GAP sim, pulado sem erro
EXT-X-PROGRAM-DATE-TIME — ancoragem do tempo de mídia ao UTC sim
Criptografia AES-128 e SAMPLE-AES (H.264, AAC) sim
Escada: captura de toda variante, medição do desvio sim
LL-HLS: EXT-X-PART, blocking reload não, as partes são ignoradas
CENC/DRM não
Áudio «empacotado»: ADTS puro ou ID3+AAC em vez de um contêiner não, o formato é nomeado no erro
Legendas TTML e segmentos WebVTT não, a faixa é reconhecida e pulada
Captura MPEG-DASH não

Verificação

Abra http://server/streaming/v/chan1/index.m3u8 num reprodutor ou peça uma captura de tela em http://server/streaming/live-preview-jpeg/chan1.

Vá além de «os quadros estão fluindo» e olhe três coisas:

  • o quanto a saída atrasa em relação à borda da playlist — sem isso, a reclamação «o stream está atrasado» é indistinguível de «a fonte está atrasada», e as duas se consertam em lugares diferentes;
  • os segmentos pulados e seu detalhamento: lavados para fora da janela, cancelados em voo, declarados com EXT-X-GAP. O último não é um erro da fonte, e sim a sua declaração honesta;
  • a emenda entre fragmentos vizinhos — um defeito silencioso: todos os segmentos foram baixados, sem erros de análise, mas a mídia dentro deles não se encaixa, e o arquivo guarda o buraco.

Próximos passos