---
title: TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290
url: https://doc2.pstreamer.tv/es/manual/toolkit/ts_analyze.html
lang: es
product: Perfect Streamer
version: 2.0.2.362
---

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

Parte del **Perfect Streamer Toolkit** — [https://pstreamer.tv](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://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 | sí |
| `-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

```bash
# 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
<?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:

```bash
# 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:

```bash
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.
