Skip to content

HLS

media.ingest.hls

Descripción

Sapsan sigue una playlist HLS ajena en modo cliente (pull): sondea la playlist, descarga los segmentos y entrega fotogramas al pipeline igual que RTSP, SRT o MPEG-TS. Así entrega el stream casi todo agregador, toda CDN ajena y todo socio al que no le han permitido abrir UDP o SRT.

Configuración

Configure el stream mediante la API de central. Fragmento de configuración:

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

Parámetros

Parámetro Por defecto Descripción
url — dirección de la playlist exactamente tal como la escribió el operador
headers ninguno cabeceras añadidas a cada petición a la fuente: playlist, segmentos, claves
variant_mode single single — una variante del master, ladder — toda la escalera
variant_bandwidth ninguno con qué bitrate casar la variante (el más cercano por debajo); sin él gana el mayor BANDWIDTH
skew_threshold_ms 500 el desfase a partir del cual la escalera se declara desincronizada
skew_policy report qué hacer ante un veredicto skewed: report — continuar y mostrarlo, fallback_to_single — retroceder a una sola variante
connect_timeout_ms 5000 tiempo de espera del establecimiento de la conexión
read_timeout_ms 15000 tiempo de espera del cuerpo: playlist, segmento, clave
max_body_bytes 64 MiB límite de tamaño de una única respuesta
peer_timeout_ms global cuánto esperar fotogramas antes de dar la fuente por perdida

Autenticación

Dos formas, y se pueden combinar:

  • cabeceras — headers, por ejemplo Authorization: Bearer <token>; van con la playlist, las variantes, los segmentos init, los segmentos y las claves del mismo origin, y nunca siguen una redirección a un origin ajeno;
  • credenciales en la propia URL — autenticación Basic corriente hecha por el cliente HTTP.

Los valores de las cabeceras jamás llegan al log: solo se imprimen sus nombres. La dirección de la entrada se escribe entera en los logs y la API de gestión la devuelve tal cual: qué parte de esa dirección es el secreto lo sabe solo el operador, y enmascarar a ciegas o dejaría el token en la query o recortaría justo aquello por lo que la entrada se reconoce en el log.

Opciones de transporte

HTTP o HTTPS; listas/manifiestos y segmentos usan solicitudes independientes.

Códecs admitidos

Los códecs admitidos dependen del contenedor de los segmentos. MPEG-TS y fMP4 son contenedores; HLS obtiene playlists y 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 es el contenedor; SRT, RIST, UDP y HTTP son transportes de entrega. La lista describe la extracción de frames de MPEG-TS, no su decodificación ni la compatibilidad del reproductor.

AV1 requiere stream_type 0x06 y el descriptor de registro AV01 en la PMT; cada PES debe contener un temporal unit completo. No se admite AV1 en MPEG-TS sin esta señalización. AAC se analiza como ADTS; reconocer stream_type 0x11 no implica compatibilidad con LATM. Opus se puede identificar en la PMT, pero el analizador PES actual no emite sus 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

Son los códecs que la entrada extrae de fMP4, no una lista de capacidades de decodificación. H.264 usa avc1/avc3, HEVC usa hvc1/hev1 y AV1 usa av01 con av1C. MPEG-2 Video requiere mp4v con configuración MPEG-2; esto no implica compatibilidad con MPEG-4 Visual. JPEG es una pista de imágenes. MPEG Audio se identifica mediante esds o una sample entry MP3; mp4a por sí sola no significa AAC. Opus usa Opus/dOps y G.711 usa alaw/ulaw. Las declaraciones del contenedor deben coincidir con los datos; declarar un códec en el MPD no sustituye un segmento de inicialización válido.

Esta entrada no acepta packed audio (ADTS independiente o ID3+AAC sin MPEG-TS/fMP4).

Comportamiento ante errores

El estado de la entrada y la causa del fallo están en las estadísticas del stream. Ante desconexión o ausencia de fotogramas se aplican los mecanismos de reintento y conmutación a reserva.

Aplicación de cambios

Solo un cambio de url, headers o de los ajustes HTTP (connect_timeout_ms, read_timeout_ms, max_body_bytes) reinicia la entrada: una fuente nueva tiene su propia numeración de pistas, su propio init y su propia posición en la playlist. Todo lo demás — modo de variante, umbral y política de desfase, peer_timeout_ms — se aplica en caliente, sin interrumpir la emisión.

Contadores

Las tablas indican los nombres exactos de los campos de estadísticas del protocolo, incluidos contadores de eventos e indicadores del valor actual. Los campos nulos pueden omitirse. API y Prometheus exponen proyecciones distintas; un único resultado de Admin API no incluye necesariamente toda la lista. El detalle depende de la licencia de contadores.

Totales comunes de entrada: bytes, frames, errors, warnings. Agregan datos del protocolo; no deben sumarse otra vez a los contadores del 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

Otros detalles

Regla de inicio

Todo lo que ya había en la playlist en el momento de conectar es historia. La captura empieza con el primer segmento que aparece después de la conexión, y en una reconexión se comporta igual.

No existe a propósito un ajuste de profundidad de inicio: de lo contrario, cada caída de conexión haría que el stream vaciase por el pipeline, en segundos, la ventana acumulada, en lugar de emitir.

Escalera de calidades y desfase de representaciones

Con variant_mode: ladder se capturan todas las variantes del master. La de mayor BANDWIDTH pasa a ser la referencia, y las demás se comparan con ella segmento a segmento, por número de secuencia de media. El veredicto queda expuesto en la estadística de la entrada, campo hls_ladder:

  • synced — las representaciones van juntas, conmutar entre ellas es seguro;
  • skewed — el desfase superó el umbral o la estructura está rota: la conmutación dará tirones o desincronizará;
  • unmeasurable — no hay con qué comparar, ningún par de segmentos comparte número.

El desfase se mide de dos maneras a la vez. El declarado es la diferencia de EXT-X-PROGRAM-DATE-TIME en el marcado; el real es la diferencia del tiempo de media de los primeros fotogramas. Si los dos no coinciden, lo enfermo es el marcado y no el stream, y quien lo arregla es el dueño de la fuente.

Note

Sapsan no lleva las variantes de la escalera a una escala de tiempos común, y no repara en absoluto el contenido defectuoso: una reparación silenciosa no hace conmutable la escalera, solo esconde el defecto. Por eso el desfase se muestra como número y decide el operador.

La política fallback_to_single baja la captura a una sola variante ante un veredicto skewed — para algunas fuentes es el único modo viable. El retroceso dura hasta que la entrada se reinicia.

Cifrado

Se admiten AES-128 (el segmento entero) y SAMPLE-AES (por fotograma, para H.264 y AAC). La clave la recoge el mismo cliente y con las mismas cabeceras que todo lo demás, y se guarda en caché por dirección, de modo que la rotación de claves en medio de una playlist funciona sola: una clave nueva tiene otra dirección.

Un servidor de claves que calla es un error de entrada con la dirección de la clave y el código de respuesta; el cuerpo del segmento no se descarga en absoluto, pues no habría con qué descifrarlo.

CENC/DRM (Widevine, PlayReady, FairPlay) no está admitido y se rechaza por el nombre de KEYFORMAT.

Qué se admite

Posibilidad Estado
Playlist de media: EXT-X-MEDIA-SEQUENCE, EXTINF, EXT-X-ENDLIST sí
Playlist master: selección de variante, representaciones EXT-X-MEDIA sí
Segmentos fMP4 (EXT-X-MAP) y MPEG-TS sí
EXT-X-BYTERANGE sí
EXT-X-DISCONTINUITY, recreación de la playlist, retraso respecto a la ventana sí
EXT-X-GAP sí, se salta sin error
EXT-X-PROGRAM-DATE-TIME — anclaje del tiempo de media a UTC sí
Cifrado AES-128 y SAMPLE-AES (H.264, AAC) sí
Escalera: captura de todas las variantes, medición del desfase sí
LL-HLS: EXT-X-PART, blocking reload no, las partes se ignoran
CENC/DRM no
Audio «empaquetado»: ADTS puro o ID3+AAC en lugar de un contenedor no, el formato se nombra en el error
Subtítulos TTML y segmentos WebVTT no, la pista se reconoce y se salta
Captura MPEG-DASH no

Comprobación

Abra http://server/streaming/v/chan1/index.m3u8 en un reproductor o pida una captura en http://server/streaming/live-preview-jpeg/chan1.

Más allá de «ya fluyen fotogramas», mire tres cosas:

  • cuánto se retrasa la salida respecto al borde de la playlist — sin eso, la queja «el stream va con retraso» es indistinguible de «la fuente va con retraso», y las dos se arreglan en sitios distintos;
  • los segmentos saltados y su desglose: lavados fuera de la ventana, cancelados en vuelo, declarados con EXT-X-GAP. Lo último no es un error de la fuente, sino su declaración honesta;
  • la costura entre fragmentos vecinos — un defecto silencioso: todos los segmentos se descargaron, sin errores de análisis, y sin embargo el medio de dentro no se une, y el archivo conserva el agujero.

Qué sigue