TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290¶
Fait partie du Perfect Streamer Toolkit — https://pstreamer.tv
Analyseur de flux de transport MPEG-TS en ligne de commande, avec contrôle de conformité ETSI TR 101 290 V1.4.1 et validation du modèle de tampons T-STD ISO/IEC 13818-1.
Lit des flux UDP multicast/unicast ou des fichiers TS, détecte automatiquement les PID PCR via PAT/PMT et affiche un rapport détaillé ou abrégé sur stdout.
L’outil fait partie du paquet pstreamer et, une fois celui-ci installé, se trouve dans /opt/pss/tools/ts_analyze — aucune installation distincte n’est nécessaire.
Contrôles effectués¶
L’analyseur parcourt chaque paquet TS et signale les violations :
Priority 1 (décodabilité du TS) : synchronisation TS, perte de synchronisation, présence et CRC des 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 des PCR, intervalle PTS, présence de la CAT
Priority 3 (surveillance étendue) : intervalles NIT/SDT/EIT/TDT, PID non référencés, débordement / sous-alimentation des tampons T-STD
Il fournit en outre :
Précision PCR jusqu’à ±500 ns — régression sur les positions d’octets
Dérive PCR en ppm (mode live uniquement)
Modèle de tampons T-STD pour chaque flux élémentaire (mode live)
Validation des tailles de sections SI par rapport aux limites ISO/EN, avec avertissements de compatibilité EIT-on-STB (>1024 octets)
UDP IAT (inter-arrival time) — statistiques de gigue au niveau des datagrammes (mode live uniquement)
Utilisation¶
ts_analyze [options] <input>
Entrées¶
Forme |
Description |
|---|---|
|
UDP multicast |
|
UDP multicast sur l’interface indiquée |
|
UDP unicast |
|
UDP unicast sur loopback (source de test) |
|
Fichier TS local |
L’encapsulation RTP de l’UDP est détectée et retirée automatiquement.
Options¶
Option |
Description |
Par défaut |
|---|---|---|
|
Durée de l’analyse en secondes |
|
|
Rapport de synthèse abrégé |
– |
|
Rapport détaillé complet |
oui |
|
Indication du débit TS pour le mode fichier |
|
|
N’analyser que le PID PCR indiqué (décimal ou |
auto |
|
Limite d’erreur de répétition PCR en ms |
|
|
Ignorer l’analyse EIT — P3.7..P3.10 sont indiqués comme |
EIT activé |
|
Ignorer l’analyse NIT — P3.1, P3.2 sont indiqués comme |
NIT activée |
|
Désactiver les couleurs ANSI en sortie |
couleurs activées |
|
XML structuré sur stdout (sans stderr) |
texte |
|
Afficher l’aide |
– |
Exemples¶
# 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ésactivation de l’analyse EIT ou NIT¶
Dans certains flux, l’EIT ou la NIT sont volontairement absentes (réseaux fermés, sources de laboratoire, diffusion OTT uniquement, etc.). Les contrôles P3 correspondants de la TR 101 290 donnent alors systématiquement FAIL au verdict global OVERALL — ce n’est que du bruit.
Utilisez --no-eit et/ou --no-nit pour exclure ces contrôles :
Drapeau |
Contrôles ignorés |
Effets de bord |
|---|---|---|
|
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 collectées ; leur contribution à P2.2 (CRC) et au récapitulatif des tailles de sections SI est donc nulle. L’avertissement de compatibilité EIT-on-STB est supprimé. |
|
P3.1 (NIT actual), P3.2 (NIT other) |
Les sections NIT ne sont pas collectées ; leur contribution à P2.2 (CRC) et au récapitulatif des tailles de sections SI est donc nulle. |
Les contrôles ignorés apparaissent dans le rapport sous la forme N/A avec la mention disabled (--no-eit) / disabled (--no-nit), et en XML sous la forme applicable="false" result="N/A". Dans le rapport abrégé, NIT=off / EIT=off s’affiche à la place du compteur d’erreurs.
Ces drapeaux n’affectent que le traitement de l’EIT (PID 0x0012) et de la NIT (PID 0x0010) — tous les autres contrôles TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, dérive PCR, IAT) sont effectués normalement.
Mode de sortie XML (--xml)¶
--xml fait produire à l’analyseur un document XML UTF-8 unique et autonome sur stdout. Toutes les informations de service (bannière, « Stream locked », « PCR PIDs discovered », progression seconde par seconde, récapitulatif de capture, avertissements de durée insuffisante) sont supprimées ; stderr reste vide, sauf en cas de défaillance réelle (entrée impossible à ouvrir, absence de données PCR, flux trop court, interruption par un signal). Les couleurs ANSI sont désactivées de force.
Le code de sortie est le même qu’en mode texte : 0 pour OVERALL=PASS, 65 pour OVERALL=FAIL, plus les codes d’erreur / de signal standard (1, 2, 3, 130, 143).
Structure XML de premier niveau :
<?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>
Conventions principales :
Tous les PID sont formatés en
0xHHHH(hex à 4 chiffres avec le préfixe0x).L’attribut
resultprend les valeursPASS/FAIL/WARN/N/A/INFO/SKIP/ok/WARN_STB.Pour les contrôles non applicables (mode fichier, absence d’embrouillage, etc.), l’élément reste présent, avec
applicable="false"etresult="N/A", afin que les consommateurs du schéma voient une forme stable.<drift>porteverdict_mode="informational"pour30 s ≤ T < 300 setverdict_mode="hard"pourT ≥ 300 s;result="SKIP"pour les exécutions de moins de 30 s.<iat>est absent pour les exécutions en mode fichier.<overall>reflète le même verdict global que la ligne OVERALL du rapport texte et correspond au code de sortie du processus.
La sortie est du XML bien formé (well-formed) (validé par xmllint --noout) ; transmettez-la directement à XSLT, à Python lxml, etc., sans adaptation de l’analyse syntaxique.
Lecture du rapport¶
Couleurs des statuts¶
Statut |
Couleur |
Signification |
|---|---|---|
|
vert |
Le contrôle est conforme à la norme |
|
jaune |
Violation souple, sans effet sur OVERALL |
|
rouge |
Violation de la norme, avec effet sur OVERALL |
|
par défaut |
À titre informatif uniquement |
Utilisez --no-color lors d’une redirection vers des fichiers journaux ou vers des terminaux non ANSI.
Durée d’analyse minimale¶
Durée |
Couverture |
Code de sortie |
|---|---|---|
< 2 s |
Insuffisant — l’analyse est rejetée |
3 (erreur) |
2–10 s |
P1 + P2 fiables ; certains contrôles P3 peuvent manquer de données |
0 + WARN |
10–30 s |
P1 + P2 + la plupart des P3 ; la TDT (30 s) peut ne pas être atteinte à temps |
0 + NOTE |
≥ 30 s |
Couverture complète de tous les contrôles TR 101 290 |
0 |
La durée par défaut est de 30 secondes, ce qui suffit à une couverture complète de la TR 101 290. Utilisez -t <sec> pour l’allonger (par exemple pour des essais de recette portant sur la dérive PCR) ou la raccourcir (contrôles rapides de type smoke test).
Pendant son exécution, l’analyseur met à jour chaque seconde un indicateur de progression sur une seule ligne, sur stderr :
Progress: 47.3% (14.2s / 30.0s, 330614 packets)
La ligne utilise un retour chariot (\r) afin de rester sur une seule ligne dans le terminal ; redirigez stderr (2>/dev/null) pour la supprimer.
Verdict de dérive PCR — fenêtre à deux niveaux¶
La tolérance d’horloge PCR définie par ISO/IEC 13818-1 §2.4.2.1 et ETSI TR 101 290 est de ±30 ppm. La valeur de dérive du rapport est obtenue par régression linéaire des secondes PCR cumulées par rapport à l’instant d’arrivée mesuré sur l’horloge du banc ; l’erreur statistique décroît en 1 / T^(3/2), la fenêtre d’analyse doit donc être assez longue pour que le bruit de mesure reste sous la limite de ±30 ppm.
L’analyseur conditionne donc le verdict de dérive à la durée de l’analyse :
Fenêtre |
Verdict lorsque la dérive dépasse la tolérance |
Effet sur OVERALL |
|---|---|---|
|
skipped (le bruit domine par rapport à la limite de ±30 ppm) |
aucun |
|
WARN — à titre informatif uniquement |
aucun |
|
FAIL |
OVERALL = FAIL, exit 65 |
300 s est la fenêtre de recette (valeur propre au produit ; la norme ETSI TR 101 290 ne normalise pas les intervalles de mesure) — assez longue pour que même un canal de livraison en rafales ou en loopback soit moyenné sous 1 ppm de bruit de mesure et pour qu’un dépassement de la tolérance traduise l’oscillateur d’horloge de l’encodeur et non le réseau. Le rapport complet indique le niveau courant à la ligne Verdict mode du bloc PCR DRIFT.
Pour obtenir un verdict PASS/FAIL ferme sur la dérive, lancez l’analyse avec -t 300 ou plus.
Recommandations selon la qualité de la source (à titre informatif ; elles ne modifient pas les niveaux de verdict) :
Source |
Fenêtre minimale pour ±5 ppm |
Pour ±2 ppm |
Recette |
|---|---|---|---|
Multicast de diffusion (réseau CBR, gigue < 100 µs) |
30 s |
60 s |
5 min |
Réseau IP stable (gigue < 200 µs) |
30 s |
2 min |
5–10 min |
Loopback / émetteur en rafales (UDP unicast sur |
5 min |
15 min |
30 min |
Étalonnage / mesure en laboratoire |
— |
30 min |
1 h et plus |
Exemples :
# 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 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 facteur limitant est la gigue de livraison (cadence d’émission de la source ou réseau) et non l’oscillateur d’horloge de l’encodeur — allongez la fenêtre.
Codes de sortie¶
Code |
Signification |
|---|---|
|
Analyse terminée, OVERALL = PASS |
|
Erreur d’arguments ou d’entrée |
|
Aucune donnée PCR dans le flux |
|
La durée du flux est inférieure au minimum de 2 s, ou aucune donnée n’a été reçue du tout (source qui n’émet pas, adresse erronée, adhésion multicast non effectuée, pare-feu ou interface incorrecte — l’analyseur affiche une indication) |
|
Analyse terminée, OVERALL = FAIL — violation de la TR 101 290 / ISO 13818-1 |
|
Interrompu par SIGINT (Ctrl+C) — analyse annulée, aucun rapport n’est produit |
|
Interrompu par SIGTERM — analyse annulée, aucun rapport n’est produit |
65 correspond à EX_DATAERR de POSIX <sysexits.h> : « les données d’entrée sont incorrectes ». Utilisez-le en intégration continue ou en supervision pour conditionner la validation à la conformité du flux :
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 du shell POSIX 128 + signal_number ; ainsi, $? après Ctrl+C correspond à ce que bash renvoie 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 n’effectue pas du tout la génération du rapport.
Exemple de sortie¶
Rapport complet (extrait)¶
========================================================================
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
========================================================================
Rapport abrégé¶
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
Remarques¶
Mode fichier : la dérive PCR, le modèle de tampons T-STD et l’IAT UDP ne sont pas mesurés — ils exigent une référence temps réel. Les autres contrôles fonctionnent dans les deux modes.
Un seul flux de transport : un seul MPTS ou SPTS est analysé à la fois.