---
title: TS Analyze Perfect Streamer Toolkit v2.2 — TR 101 290
url: https://doc.pstreamer.tv/fr/manual/ts_analyze.html
lang: fr
product: Perfect Streamer
version: 1.13.3.445
---

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

Partie du **Perfect Streamer Toolkit** — [https://pstreamer.tv](https://pstreamer.tv)

**Analyseur console de flux de transport MPEG-TS** avec vérification de conformité **ETSI TR 101 290 V1.4.1** et validation du modèle de buffer T-STD **ISO/IEC 13818-1**.

Lit du **UDP multicast/unicast** ou des **fichiers TS**, détecte automatiquement les PCR PID via PAT/PMT et émet un rapport détaillé ou résumé sur stdout.

## Ce qui est vérifié

L’analyseur parcourt chaque paquet TS et signale les violations :

- **Priority 1** (décodabilité TS) : sync TS, perte de sync, présence et CRC PAT/PMT, compteur de continuité, présence des PID
- **Priority 2** (surveillance recommandée) : indicateur d’erreur de transport, erreurs CRC, répétition / précision / discontinuités PCR, intervalle PTS, présence CAT
- **Priority 3** (surveillance étendue) : intervalles NIT/SDT/EIT/TDT, PID non référencés, dépassement / sous-utilisation des buffers T-STD

En plus, sont émis :

- **Précision PCR** à ±500 ns — régression sur les positions d’octet
- **Dérive PCR** en ppm (mode live uniquement)
- **Modèle de buffer T-STD** pour chaque flux élémentaire (mode live)
- Validation des **tailles des sections SI** vis-à-vis des limites ISO/EN avec avertissements de compatibilité EIT-on-STB (>1024 o)
- **UDP IAT** (inter-arrival time) — statistiques de jitter au niveau du datagramme (mode live uniquement)

## Utilisation

```
ts_analyze [options] <input>
```

### Entrées

| Forme | Description |
| --- | --- |
| `udp://239.1.1.1:1234` | UDP multicast |
| `udp://eth0@239.1.1.1:1234` | UDP multicast sur l’interface spécifiée |
| `udp://192.168.1.100:1234` | UDP unicast |
| `udp://lo@127.0.0.1:12655` | UDP unicast sur loopback (source de test) |
| `/path/to/file.ts` | Fichier TS local |

L’UDP encapsulé en RTP est détecté et déencapsulé automatiquement.

### Options

| Option | Description | Par défaut |
| --- | --- | --- |
| `-t, --time <sec>` | Durée d’analyse en secondes | `30` |
| `-s, --short` | Rapport de synthèse court | – |
| `-f, --full` | Rapport détaillé complet | oui |
| `-b, --bitrate <Mbps>` | Indication du bitrate TS pour le mode fichier | `38.8` |
| `-p, --pcr-pid <pid>` | N’analyser qu’un PCR PID donné (décimal ou `0xHHHH`) | automatique |
| `-l, --pcr-limit <ms>` | Limite d’erreur de répétition PCR en ms | `40` |
| `--no-eit` | Ignorer l’analyse EIT — P3.7..P3.10 sont signalées `N/A` ; la contribution EIT à P2.2 et au résumé des tailles SI est retirée | EIT activé |
| `--no-nit` | Ignorer l’analyse NIT — P3.1, P3.2 sont signalées `N/A` ; la contribution NIT à P2.2 et au résumé des tailles SI est retirée | NIT activé |
| `--no-color` | Désactiver les couleurs ANSI dans la sortie | couleurs activées |
| `--xml` | XML structuré sur stdout (sans stderr) | texte |
| `-h, --help` | Afficher l’aide | – |

### Exemples

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

### Désactiver l’analyse EIT ou NIT

Dans certains flux, EIT ou NIT sont délibérément absents (réseaux fermés, sources de laboratoire, contribution OTT-only, etc.). Les vérifications P3 correspondantes du TR 101 290 produisent alors toujours un FAIL au verdict OVERALL — ce n’est que du bruit.

Utilisez `--no-eit` et/ou `--no-nit` pour désactiver ces vérifications :

| Drapeau | Vérifications ignorées | Effets secondaires |
| --- | --- | --- |
| `--no-eit` | P3.7 (EIT actual P/F), P3.8 (EIT other P/F), P3.9 (EIT actual schedule), P3.10 (EIT other schedule) | Les sections EIT ne sont pas assemblées ; leur contribution à P2.2 (CRC) et au résumé des tailles SI est nulle. L’avertissement de compatibilité EIT-on-STB est supprimé. |
| `--no-nit` | P3.1 (NIT actual), P3.2 (NIT other) | Les sections NIT ne sont pas assemblées, leur contribution à P2.2 (CRC) et au résumé des tailles SI est donc nulle. |

Les vérifications ignorées apparaissent dans le rapport comme `N/A` avec la marque `disabled (--no-eit)` / `disabled (--no-nit)`, et dans le XML comme `applicable="false" result="N/A"`. Dans le rapport résumé, à la place du compteur d’erreurs, `NIT=off` / `EIT=off` est affiché.

Les drapeaux n’affectent que le traitement de l’EIT (PID `0x0012`) et du NIT (PID `0x0010`) — toutes les autres vérifications TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, dérive PCR, IAT) s’exécutent normalement.

### Mode de sortie XML (`--xml`)

`--xml` force l’analyseur à émettre un unique document XML UTF-8 autonome sur **stdout**. Toutes les informations annexes (bannière, « Stream locked », « PCR PIDs discovered », progression seconde par seconde, résumé de capture, avertissement de durée trop courte) sont supprimées ; **stderr reste vide**, sauf en cas de panne réelle (entrée non ouvrable, pas de données PCR, flux trop court, interruption par signal). Les couleurs ANSI sont forcément désactivées.

Le code de sortie est identique à celui du mode texte : `0` pour OVERALL=PASS, `65` pour OVERALL=FAIL, plus les codes d’erreur / signaux standard (1, 2, 3, 130, 143).

Structure XML de premier niveau :

```xml
<?xml version="1.0" encoding="UTF-8"?>
<ts_analyze version="2.2">
  <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>
```

Conventions clés :

- Tous les PID sont formatés en `0xHHHH` (hex à 4 chiffres avec préfixe `0x`).
- L’attribut `result` prend les valeurs `PASS` / `FAIL` / `WARN` / `N/A` / `INFO` / `SKIP` / `ok` / `WARN_STB`.
- Pour les vérifications non applicables (mode fichier, absence de scrambling, etc.), l’élément apparaît néanmoins avec `applicable="false"` et `result="N/A"` afin que les consommateurs du schéma voient une forme stable.
- `<drift>` porte `verdict_mode="informational"` pour `30 s ≤ T < 300 s` et `verdict_mode="hard"` pour `T ≥ 300 s` ; `result="SKIP"` pour des exécutions inférieures à 30 s.
- `<iat>` est absent pour les exécutions en mode fichier.
- `<overall>` reflète la même porte que la ligne OVERALL du rapport texte et coïncide avec le code de sortie du processus.

La sortie est du XML bien formé (validable via `xmllint --noout`) ; on peut l’envoyer directement à XSLT, Python `lxml`, etc., sans adaptation de parsing.

## Lecture du rapport

### Couleurs des statuts

| État | Couleur | Valeur |
| --- | --- | --- |
| `PASS` / `ok` | vert | La vérification respecte le standard |
| `WARN` / `WARNING` / `WARN(STB)` | jaune | Violation légère, n’affecte pas OVERALL |
| `FAIL` / `ERROR` | rouge | Violation du standard, affecte OVERALL |
| `INFO` / `NOTE` / `N/A` | par défaut | Informatif uniquement |

Utilisez `--no-color` lors de la redirection vers des fichiers de log ou des terminaux non-ANSI.

### Durée minimale d’analyse

| Durée | Couverture | Code de sortie |
| --- | --- | --- |
| **< 2 s** | Insuffisant — analyse refusée | **3** (erreur) |
| **2–10 s** | P1 + P2 fiables ; certaines vérifications P3 peuvent manquer de données | 0 + WARN |
| **10–30 s** | P1 + P2 + la plupart des P3 ; TDT (30 s) peut manquer de données | 0 + NOTE |
| **≥ 30 s** | Couverture complète de toutes les vérifications TR 101 290 | 0 |

La durée par défaut est de **30 secondes** — suffisant pour une couverture complète du TR 101 290. Utilisez `-t <sec>` pour étendre (par ex. pour des tests de réception sur le drift PCR) ou raccourcir (vérifications smoke rapides).

Pendant l’analyse, l’analyseur met à jour chaque seconde un indicateur de progression d’une ligne sur stderr :

```
Progress: 47.3%  (14.2s / 30.0s, 330614 packets)
```

La ligne utilise un retour chariot (`\r`) pour rester sur une seule ligne dans un terminal ; redirigez stderr (`2>/dev/null`) pour la masquer.

### Verdict de dérive PCR — fenêtre à deux niveaux

La tolérance de la fréquence d’horloge PCR selon **ISO/IEC 13818-1 §2.4.2.1** et **ETSI TR 101 290** est de **±30 ppm**. La valeur de drift dans le rapport est obtenue par régression linéaire des secondes PCR cumulatives par rapport à l’horodatage d’arrivée selon l’horloge du banc ; l’erreur statistique décroît en 1 / T^(3/2), donc la fenêtre d’analyse doit être suffisamment longue pour que le bruit de mesure soit nettement inférieur à la limite de ±30 ppm.

L’analyseur conditionne donc le verdict de dérive à la durée d’analyse :

| Fenêtre | Verdict si la dérive sort de la tolérance | Impact sur OVERALL |
| --- | --- | --- |
| `T < 30 s` | **skipped** (le bruit domine la limite ±30 ppm) | aucun |
| `30 s ≤ T < 300 s` | **WARN** — informatif uniquement | aucun |
| `T ≥ 300 s` | **FAIL** | OVERALL = FAIL, exit 65 |

`300 s` est la fenêtre d’acceptation (une valeur du produit ; le standard **ETSI TR 101 290** ne normalise pas les intervalles de mesure) — assez longue pour que même un chemin de livraison bursty/loopback soit moyenné en dessous de 1 ppm de bruit de mesure ; un résultat hors spécification reflète alors l’horloge de l’encoder, pas le réseau. Le rapport complet montre le niveau actuel sur la ligne `Verdict mode` du bloc PCR DRIFT.

Pour obtenir un verdict PASS/FAIL strict sur la dérive, lancer avec `-t 300` ou plus.

Recommandations sur la qualité de la source (informatif ; les niveaux de verdict ne changent pas) :

| Source | Fenêtre minimale pour ±5 ppm | Pour ±2 ppm | Acceptation |
| --- | --- | --- | --- |
| Multicast de diffusion (réseau CBR, jitter < 100 µs) | **30 s** | 60 s | 5 min |
| Réseau IP stable (jitter < 200 µs) | **30 s** | 2 min | 5–10 min |
| Loopback / émetteur en rafale (UDP unicast sur `lo`) | **5 min** | 15 min | 30 min |
| Étalonnage / mesure en laboratoire | — | 30 min | 1+ heure |

Exemples :

```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 le même flux est analysé sur plusieurs fenêtres courtes et que la valeur de dérive varie de plus de quelques ppm d’une fenêtre à l’autre, le goulet d’étranglement est le jitter de livraison (cadence d’envoi ou réseau) et non l’horloge de l’encodeur — agrandir la fenêtre.

### Codes de sortie

| Code | Valeur |
| --- | --- |
| `0` | Analyse terminée, **OVERALL = PASS** |
| `1` | Erreur d’argument ou d’entrée |
| `2` | Le flux ne contient pas de données PCR |
| `3` | Durée du flux inférieure au minimum de 2 s |
| `65` | Analyse terminée, **OVERALL = FAIL** — violation TR 101 290 / ISO 13818-1 |
| `130` | Interrompu par **SIGINT** (Ctrl+C) — analyse annulée, aucun rapport produit |
| `143` | Interrompu par **SIGTERM** — analyse annulée, aucun rapport produit |

`65` correspond à `EX_DATAERR` de POSIX `<sysexits.h>` (« input data was incorrect »). À utiliser en CI / supervision comme porte de conformité du flux :

```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
}
```

Les codes 130/143 suivent la convention POSIX shell `128 + signal_number`, donc `$?` après `Ctrl+C` correspond à ce que bash retourne pour tout processus tué par SIGINT/SIGTERM. En cas d’interruption, l’analyseur écrit une seule ligne sur stderr (`Analysis interrupted by signal N — no report produced.`) et saute entièrement la génération du rapport.

## Exemple de sortie

### Rapport complet (extrait)

```
========================================================================
  MPEG-TS ANALYZER v2.2 — TR 101 290 FULL REPORT
========================================================================
  Source     : udp://239.1.1.1:5000
  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 Error            :        0 errors  PASS
  |  1.4   Continuity Count Error        :        0 errors  PASS
  |  1.6   PID Error (5s absence)        :        0 errors  PASS
  ...

========================================================================
  TR 101 290 — PRIORITY 2 (recommended monitoring)
========================================================================
  |  2.3   PCR Repetition Error          :        0 errors  PASS
  |  2.5   PCR Accuracy Error            :        0 errors  PASS
  ...

========================================================================
  OVERALL COMPLIANCE: PASS  — stream is TR 101 290 compliant
========================================================================
```

### Rapport court

```
MPEG-TS Analyzer v2.2
TR 101 290 Summary | udp://239.1.1.1:5000 | 30.0s
----------------------------------------------------------------------------------------------------
  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 p99=1.076 ms gaps>100ms=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
```

## Notes

- **Mode fichier** : la dérive PCR, le modèle de buffer T-STD et l’UDP IAT ne sont pas mesurés — ils nécessitent une référence temps réel. Les autres vérifications fonctionnent dans les deux modes.
- **Un seul flux de transport** : un MPTS ou SPTS est analysé à la fois.
