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 ejemploAuthorization: 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.