TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290¶
Parte del Perfect Streamer Toolkit — https://pstreamer.tv
Analizador de flujo de transporte MPEG-TS de línea de comandos, con verificación de conformidad con ETSI TR 101 290 V1.4.1 y validación del modelo de búferes T-STD de ISO/IEC 13818-1.
Lee UDP multicast/unicast o archivos TS, detecta automáticamente los PCR PID mediante PAT/PMT e imprime un informe detallado o breve en stdout.
La herramienta forma parte del paquete pstreamer y, una vez instalada, reside en /opt/pss/tools/ts_analyze — no es necesario instalar nada por separado.
Qué se comprueba¶
El analizador recorre cada paquete TS e informa de las infracciones:
Priority 1 (decodificabilidad del TS): sincronización TS, pérdida de sincronización, presencia y CRC de PAT/PMT, contador de continuidad, presencia de PID
Priority 2 (monitorización recomendada): indicador de errores de transporte, errores de CRC, repetición / precisión / discontinuidades de PCR, intervalo PTS, presencia de CAT
Priority 3 (monitorización ampliada): intervalos de NIT/SDT/EIT/TDT, PID no referenciados, desbordamiento / subdesbordamiento de los búferes T-STD
Adicionalmente informa de:
Precisión de PCR de hasta ±500 ns — regresión sobre las posiciones de byte
Deriva de PCR en ppm (solo en modo live)
Modelo de búferes T-STD para cada flujo elemental (modo live)
Validación de los tamaños de las secciones SI frente a los límites ISO/EN, con advertencias de compatibilidad EIT-on-STB (>1024 B)
UDP IAT (inter-arrival time) — estadísticas de jitter a nivel de datagrama (solo en modo live)
Uso¶
ts_analyze [options] <input>
Entradas¶
Forma |
Descripción |
|---|---|
|
UDP multicast |
|
UDP multicast en la interfaz indicada |
|
UDP unicast |
|
UDP unicast en loopback (fuente de prueba) |
|
Archivo TS local |
La encapsulación RTP sobre UDP se detecta y se desencapsula automáticamente.
Opciones¶
Opción |
Descripción |
Valor predeterminado |
|---|---|---|
|
Duración del análisis en segundos |
|
|
Informe resumido breve |
– |
|
Informe completo detallado |
sí |
|
Valor orientativo del bitrate TS para el modo archivo |
|
|
Analizar únicamente el PCR PID indicado (decimal o |
automático |
|
Límite del error de repetición de PCR en ms |
|
|
Omitir el análisis de EIT — P3.7..P3.10 se muestran como |
EIT habilitado |
|
Omitir el análisis de NIT — P3.1, P3.2 se muestran como |
NIT habilitado |
|
Deshabilitar los colores ANSI en la salida |
colores habilitados |
|
XML estructurado en stdout (sin stderr) |
texto |
|
Mostrar la ayuda |
– |
Ejemplos¶
# 30-second TR 101 290 check on a multicast stream
ts_analyze -t 30 udp://239.10.10.1:1234
# short summary, save to log (no color)
ts_analyze -s --no-color -t 60 udp://239.10.10.1:1234 > report.txt
# analyze a TS file
ts_analyze -t 30 recording.ts
# analyze only a single PCR PID
ts_analyze -p 0x0100 -t 30 udp://239.10.10.1:1234
# machine-readable XML for CI / monitoring
ts_analyze --xml -t 30 udp://239.10.10.1:1234 > result.xml
# skip EIT/NIT analysis (e.g. for streams where they are intentionally absent)
ts_analyze --no-eit --no-nit -t 30 udp://239.10.10.1:1234
Desactivación del análisis de EIT o NIT¶
En algunos flujos, EIT o NIT están ausentes de forma intencionada (redes cerradas, fuentes de laboratorio, entrega exclusivamente OTT, etc.). Las comprobaciones P3 correspondientes de TR 101 290 darán entonces siempre FAIL en la puerta final OVERALL, lo que es puro ruido.
Utilice --no-eit o --no-nit (o ambos) para excluir estas comprobaciones:
Indicador |
Comprobaciones omitidas |
Efectos secundarios |
|---|---|---|
|
P3.7 (EIT actual P/F), P3.8 (EIT other P/F), P3.9 (EIT actual schedule), P3.10 (EIT other schedule) |
Las secciones EIT no se recopilan, por lo que su contribución a P2.2 (CRC) y al resumen de tamaños de las secciones SI es nula. La advertencia de compatibilidad EIT-on-STB queda suprimida. |
|
P3.1 (NIT actual), P3.2 (NIT other) |
Las secciones NIT no se recopilan, por lo que su contribución a P2.2 (CRC) y al resumen de tamaños de las secciones SI es nula. |
Las comprobaciones omitidas aparecen en el informe como N/A con la marca disabled (--no-eit) / disabled (--no-nit), y en el XML como applicable="false" result="N/A". En el informe breve se muestra NIT=off / EIT=off en lugar del contador de errores.
Los indicadores afectan únicamente al procesamiento de EIT (PID 0x0012) y NIT (PID 0x0010): todas las demás comprobaciones de TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, deriva de PCR, IAT) se realizan de la forma habitual.
Modo de salida XML (--xml)¶
--xml hace que el analizador emita un único documento XML UTF-8 autocontenido en stdout. Toda la información auxiliar (el banner, «Stream locked», «PCR PIDs discovered», el progreso por segundo, el resumen de la captura, las advertencias de duración corta) queda suprimida; stderr permanece vacío salvo que se produzca un fallo real (no se ha podido abrir la entrada, no hay datos de PCR, el flujo es demasiado corto, interrupción por señal). Los colores ANSI se deshabilitan de forma forzada.
El código de salida es el mismo que en el modo texto: 0 con OVERALL=PASS, 65 con OVERALL=FAIL, más los códigos estándar de error / señal (1, 2, 3, 130, 143).
Estructura XML de nivel superior:
<?xml version="1.0" encoding="UTF-8"?>
<ts_analyze version="2.3">
<source>udp://239.1.1.1:5000</source>
<timestamp>2026-04-30T12:00:00+0300</timestamp>
<duration_s>30.00</duration_s>
<packets total="..." null="..."/>
<ts_bitrate_mbps>20.012</ts_bitrate_mbps>
<programs>
<program number="1" pmt_pid="0x0100" pcr_pid="0x0101">
<es pid="0x0101" stream_type="0x1b" name="H.264/AVC"/>
<es pid="0x0102" stream_type="0x03" name="MPEG-2 Audio"/>
</program>
</programs>
<tr101290>
<check id="1.1" name="TS Sync Byte Error" applicable="true" errors="0" result="PASS"/>
...
<check id="2.3" name="PCR Repetition Error"
applicable="true" errors="0" result="PASS" soft_violations="3"/>
...
<check id="3.4" name="Unreferenced PIDs" applicable="true" count="2" result="INFO"/>
...
</tr101290>
<si_section_size oversize_total="0" eit_stb_warn_total="12">
<table name="EIT_actual_pf" max_bytes="1380" std_limit="4096"
oversize="0" eit_stb_warn="12" result="WARN_STB"/>
...
</si_section_size>
<iat datagrams="33252" intervals="33251" min_ms="0.002" max_ms="5.009"
avg_ms="0.150" stddev_ms="0.295" p95_ms="0.872" p99_ms="1.076"
max_jitter_ms="4.272" gap_threshold_ms="100.0" gaps_over_threshold="0"/>
<pcr_pids>
<pcr_pid value="0x0101" sid="1" pcr_count="1500" discontinuities="0"
estimated_bitrate_mbps="18.750">
<interval samples="1499" min_ms="19.812" max_ms="20.195"
avg_ms="20.001" p95_ms="20.102"
iso_hard_violations="0" tr_soft_violations="0"
rec_violations="0" result="PASS"/>
<accuracy samples="1499" min_ns="-148.3" max_ns="201.7" abs_max_ns="201.7"
avg_ns="2.1" stddev_ns="45.6" p95_ns="102.3"
violations="0" result="PASS"/>
<drift measured="true" ppm="0.618" limit_ppm="30"
verdict_mode="informational" result="PASS"/>
<tstd overflows="0" underflows="0" max_fill_bytes="34218" result="PASS">
<es_buffer es_pid="0x0101" stream_type="0x1b"
capacity_bytes="3000000" measuring="true"
es_bitrate_mbps="15.200" max_fill_bytes="34218"
overflows="0" underflows="0"/>
</tstd>
</pcr_pid>
</pcr_pids>
<unreferenced_pids count="2">
<pid value="0x01ff"/>
<pid value="0x0200"/>
</unreferenced_pids>
<overall result="PASS"/>
</ts_analyze>
Convenciones principales:
Todos los PID se formatean como
0xHHHH(hex de 4 dígitos con el prefijo0x).El atributo
resulttoma los valoresPASS/FAIL/WARN/N/A/INFO/SKIP/ok/WARN_STB.Para las comprobaciones no aplicables (modo archivo, ausencia de scrambling, etc.) el elemento sigue estando presente, con
applicable="false"yresult="N/A", de modo que los consumidores del esquema vean una forma estable.<drift>llevaverdict_mode="informational"para30 s ≤ T < 300 syverdict_mode="hard"paraT ≥ 300 s;result="SKIP"para ejecuciones de menos de 30 s.<iat>no está presente en las ejecuciones en modo archivo.<overall>refleja la misma puerta que la línea OVERALL del informe de texto y coincide con el código de salida del proceso.
La salida es XML bien formado (well-formed) y se valida con xmllint --noout; introdúzcala directamente en XSLT, en lxml de Python, etc., sin adaptaciones del análisis sintáctico.
Lectura del informe¶
Colores de los estados¶
Estado |
Color |
Significado |
|---|---|---|
|
verde |
La comprobación cumple el estándar |
|
amarillo |
Infracción leve, no afecta a OVERALL |
|
rojo |
Infracción del estándar, afecta a OVERALL |
|
predeterminado |
Solo informativo |
Utilice --no-color al redirigir la salida a archivos de registro o a terminales que no admiten ANSI.
Duración mínima del análisis¶
Duración |
Cobertura |
Código de salida |
|---|---|---|
< 2 s |
Insuficiente — el análisis se rechaza |
3 (error) |
2–10 s |
P1 + P2 son fiables; algunas comprobaciones P3 pueden carecer de datos |
0 + WARN |
10–30 s |
P1 + P2 + la mayoría de P3; TDT (30 s) puede no llegar a tiempo |
0 + NOTE |
≥ 30 s |
Cobertura completa de todas las comprobaciones de TR 101 290 |
0 |
La duración predeterminada es de 30 segundos, suficiente para una cobertura completa de TR 101 290. Utilice -t <sec> para aumentarla (por ejemplo, para pruebas de aceptación de la deriva de PCR) o para reducirla (comprobaciones rápidas de tipo smoke).
Durante la ejecución, el analizador actualiza una vez por segundo un indicador de progreso de una sola línea en stderr:
Progress: 47.3% (14.2s / 30.0s, 330614 packets)
La línea utiliza un retorno de carro (\r) para permanecer en una sola línea del terminal; redirija stderr (2>/dev/null) para suprimirla.
Veredicto de la deriva de PCR — ventana de dos niveles¶
La tolerancia del reloj PCR según ISO/IEC 13818-1 §2.4.2.1 y ETSI TR 101 290 es de ±30 ppm. El valor de deriva del informe se obtiene mediante regresión lineal de los segundos acumulados de PCR frente al tiempo de llegada medido por el reloj del banco de pruebas; el error estadístico decrece como 1 / T^(3/2), por lo que la ventana de análisis debe ser lo bastante larga para que el ruido de medición quede por debajo del límite de ±30 ppm.
Por ello, el analizador hace que el veredicto de deriva dependa de la duración del análisis:
Ventana |
Veredicto cuando la deriva supera la tolerancia |
Efecto sobre OVERALL |
|---|---|---|
|
skipped (el ruido domina frente al límite de ±30 ppm) |
ninguno |
|
WARN — solo informativo |
ninguno |
|
FAIL |
OVERALL = FAIL, exit 65 |
300 s es la ventana de aceptación (un valor de producto; el estándar ETSI TR 101 290 no normaliza los intervalos de medición), lo bastante larga para que incluso una vía de entrega a ráfagas o de loopback se promedie por debajo de 1 ppm de ruido de medición, de modo que una desviación fuera de tolerancia refleje el oscilador del codificador y no la red. El informe completo muestra el nivel actual en la línea Verdict mode del bloque PCR DRIFT.
Para obtener un veredicto estricto PASS/FAIL sobre la deriva, ejecute con -t 300 o más.
Recomendaciones sobre la calidad de la fuente (informativas; no modifican los niveles del veredicto):
Fuente |
Ventana mínima para ±5 ppm |
Para ±2 ppm |
Aceptación |
|---|---|---|---|
Multicast de difusión (red CBR, jitter < 100 µs) |
30 s |
60 s |
5 min |
Red IP estable (jitter < 200 µs) |
30 s |
2 min |
5–10 min |
Loopback / emisor a ráfagas (UDP unicast en |
5 min |
15 min |
30 min |
Calibración / medición de laboratorio |
— |
30 min |
1+ hora |
Ejemplos:
# Quick PCR drift check on a real broadcast multicast (30 s)
ts_analyze -t 30 -s udp://239.1.1.1:5000
# Reliable check on a loopback source (5 min)
ts_analyze -t 300 -s udp://lo@127.0.0.1:12655
# Lab acceptance (30 min, full report to file)
ts_analyze -t 1800 -f --no-color udp://239.1.1.1:5000 > acceptance.txt
Si un mismo flujo se analiza en varias ventanas cortas y el valor de deriva fluctúa más de unos pocos ppm entre ellas, el cuello de botella es el jitter de entrega (el ritmo de envío del emisor o la red) y no el oscilador del codificador: amplíe la ventana.
Códigos de salida¶
Código |
Significado |
|---|---|
|
Análisis finalizado, OVERALL = PASS |
|
Error en los argumentos o en la entrada |
|
No hay datos de PCR en el flujo |
|
La duración del flujo es inferior al mínimo de 2 s, o no se ha recibido dato alguno (la fuente no emite, dirección incorrecta, no se ha realizado la unión multicast, cortafuegos o interfaz incorrecta — el analizador imprime una sugerencia) |
|
Análisis finalizado, OVERALL = FAIL — infracción de TR 101 290 / ISO 13818-1 |
|
Interrumpido por SIGINT (Ctrl+C) — el análisis se cancela, no se genera ningún informe |
|
Interrumpido por SIGTERM — el análisis se cancela, no se genera ningún informe |
65 es EX_DATAERR de POSIX <sysexits.h>: «los datos de entrada son incorrectos». Utilícelo en CI / monitorización como puerta de conformidad del flujo:
ts_analyze -s -t 60 udp://239.1.1.1:5000 || {
case $? in
65) echo "stream does not conform — see report" >&2 ;;
130) echo "interrupted by user" >&2 ;;
*) echo "tool error" >&2 ;;
esac
}
Los códigos 130/143 siguen la convención del shell POSIX 128 + signal_number, por lo que $? tras Ctrl+C coincide con lo que bash devuelve para cualquier proceso terminado por SIGINT/SIGTERM. Al ser interrumpido, el analizador escribe una única línea en stderr (Analysis interrupted by signal N — no report produced.) y omite por completo la generación del informe.
Ejemplo de salida¶
Informe completo (fragmento)¶
========================================================================
MPEG-TS ANALYZER v2.3 — TR 101 290 FULL REPORT
Perfect Streamer Toolkit https://pstreamer.tv
========================================================================
Source : udp://239.1.1.1:5000
Timestamp : 2026-04-30 12:00:00
Duration : 30.00 s
Packets : 398936 total, 12045 null
TS bitrate : 20.012 Mbit/s
------------------------------------------------------------------------
========================================================================
TR 101 290 — PRIORITY 1 (TS decodability)
========================================================================
| 1.1 TS Sync Byte : 0 PASS
| 1.4 Continuity Count : 0 PASS
| 1.6 PID Absence (5s) : 0 PASS
...
========================================================================
TR 101 290 — PRIORITY 2 (recommended monitoring)
========================================================================
| 2.3 PCR Repetition : 0 PASS
| 2.5 PCR Accuracy : 0 PASS
...
========================================================================
OVERALL COMPLIANCE: PASS — stream is TR 101 290 compliant
========================================================================
Informe breve¶
MPEG-TS Analyzer v2.3 | Perfect Streamer Toolkit https://pstreamer.tv
TR 101 290 Summary | udp://239.1.1.1:5000 | 30.0s | 2026-04-30 12:00:00
----------------------------------------------------------------------------------------------------
P1: sync=0 CC=0 PAT=0 PMT=0 PID=0 P2: TEI=0 CRC=0 PTS=0 P3: NIT=0 SDT=0 EIT=0 TDT=0 unref=2
IAT: dgrams=33252 avg=0.150 ms max=5.009 ms stddev=0.295 ms p99=1.076 ms gaps>100.000 ms=0
----------------------------------------------------------------------------------------------------
PCR PID SID Count Intv max Jitter max Drift Interval Accuracy T-STD
----------------------------------------------------------------------------------------------------
0x0101 1 1500 20.195 ms 76.4 ns 0ppm PASS PASS PASS
----------------------------------------------------------------------------------------------------
OVERALL: PASS
Notas¶
Modo archivo: la deriva de PCR, el modelo de búferes T-STD y el UDP IAT no se miden, ya que requieren una referencia de tiempo real. El resto de las comprobaciones funcionan en ambos modos.
Un solo flujo de transporte: se analiza un MPTS o un SPTS a la vez.