TS Analyze Perfect Streamer Toolkit v2.2 — TR 101 290¶
Partie du Perfect Streamer Toolkit — 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 multicast |
|
UDP multicast sur l’interface spécifiée |
|
UDP unicast |
|
UDP unicast sur loopback (source de test) |
|
Fichier TS local |
L’UDP encapsulé en RTP est détecté et déencapsulé automatiquement.
Options¶
Option |
Description |
Par défaut |
|---|---|---|
|
Durée d’analyse en secondes |
|
|
Rapport de synthèse court |
– |
|
Rapport détaillé complet |
oui |
|
Indication du bitrate TS pour le mode fichier |
|
|
N’analyser qu’un PCR PID donné (décimal ou |
automatique |
|
Limite d’erreur de répétition PCR en ms |
|
|
Ignorer l’analyse EIT — P3.7..P3.10 sont signalées |
EIT activé |
|
Ignorer l’analyse NIT — P3.1, P3.2 sont signalées |
NIT activé |
|
Désactiver les couleurs ANSI dans la sortie |
couleurs activées |
|
XML structuré sur stdout (sans stderr) |
texte |
|
Afficher l’aide |
– |
Exemples¶
# 30-секундная проверка TR 101 290 на multicast-потоке
ts_analyze -t 30 udp://239.10.10.1:1234
# краткая сводка, сохранение в лог (без цвета)
ts_analyze -s --no-color -t 60 udp://239.10.10.1:1234 > report.txt
# анализ TS-файла
ts_analyze -t 30 recording.ts
# анализ только одного PCR PID
ts_analyze -p 0x0100 -t 30 udp://239.10.10.1:1234
# машинно-читаемый XML для CI / мониторинга
ts_analyze --xml -t 30 udp://239.10.10.1:1234 > result.xml
# пропустить анализ EIT/NIT (например, для потоков, где их намеренно нет)
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 |
|---|---|---|
|
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é. |
|
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 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éfixe0x).L’attribut
resultprend les valeursPASS/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"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 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 |
|---|---|---|
|
vert |
La vérification respecte le standard |
|
jaune |
Violation légère, n’affecte pas OVERALL |
|
rouge |
Violation du standard, affecte OVERALL |
|
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 |
|---|---|---|
|
skipped (le bruit domine la limite ±30 ppm) |
aucun |
|
WARN — informatif uniquement |
aucun |
|
FAIL |
OVERALL = FAIL, exit 65 |
300 s est la fenêtre de tests de réception du DVB TR 101 297 — 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 |
5 min |
15 min |
30 min |
Étalonnage / mesure en laboratoire |
— |
30 min |
1+ heure |
Exemples :
# Быстрая проверка дрейфа PCR на реальном вещательном multicast (30 с)
ts_analyze -t 30 -s udp://239.1.1.1:5000
# Надёжная проверка на loopback-источнике (5 мин)
ts_analyze -t 300 -s udp://lo@127.0.0.1:12655
# Лабораторная приёмка (30 мин, полный отчёт в файл)
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 |
|---|---|
|
Analyse terminée, OVERALL = PASS |
|
Erreur d’argument ou d’entrée |
|
Le flux ne contient pas de données PCR |
|
Durée du flux inférieure au minimum de 2 s |
|
Analyse terminée, OVERALL = FAIL — violation TR 101 290 / ISO 13818-1 |
|
Interrompu par SIGINT (Ctrl+C) — analyse annulée, aucun rapport produit |
|
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 :
ts_analyze -s -t 60 udp://239.1.1.1:5000 || {
case $? in
65) echo "поток не соответствует — см. отчёт" >&2 ;;
130) echo "прервано пользователем" >&2 ;;
*) echo "ошибка инструмента" >&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.