TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290

Parte del Perfect Streamer Toolkithttps://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://239.1.1.1:1234

UDP multicast

udp://eth0@239.1.1.1:1234

UDP multicast en la interfaz indicada

udp://192.168.1.100:1234

UDP unicast

udp://lo@127.0.0.1:12655

UDP unicast en loopback (fuente de prueba)

/path/to/file.ts

Archivo TS local

La encapsulación RTP sobre UDP se detecta y se desencapsula automáticamente.

Opciones

Opción

Descripción

Valor predeterminado

-t, --time <sec>

Duración del análisis en segundos

30

-s, --short

Informe resumido breve

-f, --full

Informe completo detallado

-b, --bitrate <Mbps>

Valor orientativo del bitrate TS para el modo archivo

38.8

-p, --pcr-pid <pid>

Analizar únicamente el PCR PID indicado (decimal o 0xHHHH)

automático

-l, --pcr-limit <ms>

Límite del error de repetición de PCR en ms

40

--no-eit

Omitir el análisis de EIT — P3.7..P3.10 se muestran como N/A, la contribución de EIT a P2.2 / al total de tamaños de sección queda excluida

EIT habilitado

--no-nit

Omitir el análisis de NIT — P3.1, P3.2 se muestran como N/A, la contribución de NIT a P2.2 / al total de tamaños de sección queda excluida

NIT habilitado

--no-color

Deshabilitar los colores ANSI en la salida

colores habilitados

--xml

XML estructurado en stdout (sin stderr)

texto

-h, --help

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

--no-eit

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.

--no-nit

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 prefijo 0x).

  • El atributo result toma los valores PASS / 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" y result="N/A", de modo que los consumidores del esquema vean una forma estable.

  • <drift> lleva verdict_mode="informational" para 30 s T < 300 s y verdict_mode="hard" para T 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

PASS / ok

verde

La comprobación cumple el estándar

WARN / WARNING / WARN(STB)

amarillo

Infracción leve, no afecta a OVERALL

FAIL / ERROR

rojo

Infracción del estándar, afecta a OVERALL

INFO / NOTE / N/A

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

T < 30 s

skipped (el ruido domina frente al límite de ±30 ppm)

ninguno

30 s T < 300 s

WARN — solo informativo

ninguno

T 300 s

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 lo)

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

0

Análisis finalizado, OVERALL = PASS

1

Error en los argumentos o en la entrada

2

No hay datos de PCR en el flujo

3

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)

65

Análisis finalizado, OVERALL = FAIL — infracción de TR 101 290 / ISO 13818-1

130

Interrumpido por SIGINT (Ctrl+C) — el análisis se cancela, no se genera ningún informe

143

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.