TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290¶
Teil des Perfect Streamer Toolkit — https://pstreamer.tv
Kommandozeilen-Analysator für MPEG-TS-Transportströme mit Konformitätsprüfung nach ETSI TR 101 290 V1.4.1 und Validierung des T-STD-Puffermodells nach ISO/IEC 13818-1.
Liest UDP multicast/unicast oder TS-Dateien, erkennt die PCR-PIDs automatisch über PAT/PMT und gibt einen ausführlichen oder kurzen Bericht auf stdout aus.
Das Werkzeug ist Bestandteil des Pakets pstreamer und liegt nach der Installation unter /opt/pss/tools/ts_analyze — eine separate Installation ist nicht erforderlich.
Was geprüft wird¶
Der Analysator durchläuft jedes TS-Paket und meldet Verletzungen:
Priority 1 (Dekodierbarkeit des TS): TS-Synchronisation, Synchronisationsverlust, Vorhandensein und CRC von PAT/PMT, Kontinuitätszähler, Vorhandensein von PIDs
Priority 2 (empfohlene Überwachung): Übertragungsfehler-Indikator, CRC-Fehler, PCR-Wiederholung / -Genauigkeit / -Diskontinuitäten, PTS-Intervall, Vorhandensein von CAT
Priority 3 (erweiterte Überwachung): NIT/SDT/EIT/TDT-Intervalle, nicht referenzierte PIDs, Überlauf / Unterlauf der T-STD-Puffer
Zusätzlich werden ausgegeben:
PCR-Genauigkeit bis ±500 ns — Regression über Byte-Positionen
PCR-Drift in ppm (nur Live-Modus)
T-STD-Puffermodell für jeden Elementarstrom (Live-Modus)
Validierung der SI-Sektionsgrößen gegen die ISO/EN-Grenzwerte, mit EIT-on-STB-Kompatibilitätswarnungen (>1024 B)
UDP IAT (inter-arrival time) — Jitter-Statistik auf Datagramm-Ebene (nur Live-Modus)
Verwendung¶
ts_analyze [options] <input>
Eingänge¶
Form |
Beschreibung |
|---|---|
|
UDP multicast |
|
UDP multicast auf der angegebenen Schnittstelle |
|
UDP unicast |
|
UDP unicast auf Loopback (Testquelle) |
|
Lokale TS-Datei |
Eine RTP-Kapselung von UDP wird automatisch erkannt und entpackt.
Optionen¶
Option |
Beschreibung |
Standard |
|---|---|---|
|
Analysedauer in Sekunden |
|
|
Kurzer Zusammenfassungsbericht |
– |
|
Vollständiger detaillierter Bericht |
ja |
|
TS-Bitraten-Hinweis für den Dateimodus |
|
|
Nur die angegebene PCR-PID analysieren (dezimal oder |
auto |
|
Grenzwert für den PCR-Wiederholungsfehler in ms |
|
|
EIT-Analyse überspringen — P3.7..P3.10 werden als |
EIT aktiviert |
|
NIT-Analyse überspringen — P3.1, P3.2 werden als |
NIT aktiviert |
|
ANSI-Farben in der Ausgabe deaktivieren |
Farben aktiviert |
|
Strukturiertes XML auf stdout (kein stderr) |
Text |
|
Hilfe anzeigen |
– |
Beispiele¶
# 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
Deaktivieren der EIT- oder NIT-Analyse¶
In manchen Strömen fehlen EIT oder NIT absichtlich (geschlossene Netze, Laborquellen, reine OTT-Zustellung usw.). Die entsprechenden P3-Prüfungen aus TR 101 290 führen dann stets zu FAIL im abschließenden OVERALL-Gate — das ist reines Rauschen.
Verwenden Sie --no-eit und/oder --no-nit, um diese Prüfungen auszuschließen:
Flag |
Übersprungene Prüfungen |
Nebeneffekte |
|---|---|---|
|
P3.7 (EIT actual P/F), P3.8 (EIT other P/F), P3.9 (EIT actual schedule), P3.10 (EIT other schedule) |
EIT-Sektionen werden nicht erfasst, daher ist ihr Anteil an P2.2 (CRC) und an der Übersicht der SI-Sektionsgrößen null. Die EIT-on-STB-Kompatibilitätswarnung wird unterdrückt. |
|
P3.1 (NIT actual), P3.2 (NIT other) |
NIT-Sektionen werden nicht erfasst, daher ist ihr Anteil an P2.2 (CRC) und an der Übersicht der SI-Sektionsgrößen null. |
Übersprungene Prüfungen erscheinen im Bericht als N/A mit dem Vermerk disabled (--no-eit) / disabled (--no-nit), im XML als applicable="false" result="N/A". Im Kurzbericht wird anstelle des Fehlerzählers NIT=off / EIT=off angezeigt.
Die Flags betreffen ausschließlich die Verarbeitung von EIT (PID 0x0012) und NIT (PID 0x0010) — alle übrigen Prüfungen nach TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, PCR-Drift, IAT) werden wie gewohnt ausgeführt.
XML-Ausgabemodus (--xml)¶
--xml veranlasst den Analysator, ein einziges, in sich geschlossenes UTF-8-XML-Dokument auf stdout auszugeben. Sämtliche Nebenausgaben (Banner, „Stream locked“, „PCR PIDs discovered“, die sekündliche Fortschrittsanzeige, die Zusammenfassung der Erfassung, Warnungen zu geringer Dauer) werden unterdrückt; stderr bleibt leer, sofern kein tatsächlicher Fehler auftritt (Eingang konnte nicht geöffnet werden, keine PCR-Daten, Strom zu kurz, Abbruch durch ein Signal). ANSI-Farben werden zwangsweise deaktiviert.
Der Exit-Code ist derselbe wie im Textmodus: 0 bei OVERALL=PASS, 65 bei OVERALL=FAIL, dazu die üblichen Fehler- / Signalcodes (1, 2, 3, 130, 143).
Struktur des XML auf oberster Ebene:
<?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>
Wesentliche Konventionen:
Alle PIDs werden als
0xHHHHformatiert (4-stelliger hex-Wert mit dem Präfix0x).Das Attribut
resultnimmt die WertePASS/FAIL/WARN/N/A/INFO/SKIP/ok/WARN_STBan.Für nicht anwendbare Prüfungen (Dateimodus, fehlendes Scrambling usw.) ist das Element dennoch vorhanden, mit
applicable="false"undresult="N/A", damit Konsumenten des Schemas eine stabile Form vorfinden.<drift>führtverdict_mode="informational"für30 s ≤ T < 300 sundverdict_mode="hard"fürT ≥ 300 s;result="SKIP"bei Läufen von weniger als 30 s.<iat>fehlt bei Läufen im Dateimodus.<overall>spiegelt dasselbe Gate wider wie die Zeile OVERALL im Textbericht und stimmt mit dem Exit-Code des Prozesses überein.
Die Ausgabe ist wohlgeformtes (well-formed) XML (validierbar mit xmllint --noout); sie lässt sich ohne Anpassungen am Parsing direkt an XSLT, Python lxml und Ähnliches übergeben.
Lesen des Berichts¶
Statusfarben¶
Status |
Farbe |
Bedeutung |
|---|---|---|
|
grün |
Die Prüfung entspricht dem Standard |
|
gelb |
Weiche Verletzung, ohne Auswirkung auf OVERALL |
|
rot |
Verletzung des Standards, wirkt sich auf OVERALL aus |
|
Standardfarbe |
Nur informativ |
Verwenden Sie --no-color bei Umleitung in Logdateien oder in Nicht-ANSI-Terminals.
Minimale Analysedauer¶
Dauer |
Abdeckung |
Exit-Code |
|---|---|---|
< 2 s |
Unzureichend — die Analyse wird abgelehnt |
3 (Fehler) |
2–10 s |
P1 + P2 sind belastbar; einigen P3-Prüfungen können die Daten fehlen |
0 + WARN |
10–30 s |
P1 + P2 + der überwiegende Teil von P3; TDT (30 s) wird unter Umständen nicht rechtzeitig erfasst |
0 + NOTE |
≥ 30 s |
Vollständige Abdeckung aller Prüfungen nach TR 101 290 |
0 |
Die Standarddauer beträgt 30 Sekunden und genügt für die vollständige Abdeckung von TR 101 290. Verwenden Sie -t <sec>, um sie zu verlängern (etwa für Abnahmeprüfungen des PCR-Drifts) oder zu verkürzen (schnelle Smoke-Prüfungen).
Während des Laufs aktualisiert der Analysator einmal pro Sekunde eine einzeilige Fortschrittsanzeige auf stderr:
Progress: 47.3% (14.2s / 30.0s, 330614 packets)
Die Zeile verwendet einen Carriage Return (\r), um im Terminal eine einzelne Zeile zu bleiben; leiten Sie stderr um (2>/dev/null), um sie zu unterdrücken.
Verdikt zum PCR-Drift — zweistufiges Fenster¶
Die Toleranz der PCR-Taktfrequenz beträgt nach ISO/IEC 13818-1 §2.4.2.1 und ETSI TR 101 290 ±30 ppm. Der Driftwert im Bericht ergibt sich aus einer linearen Regression der kumulierten PCR-Sekunden gegen die Ankunftszeit nach der Uhr des Messplatzes; der statistische Fehler nimmt mit 1 / T^(3/2) ab, daher muss das Analysefenster lang genug sein, damit das Messrauschen unterhalb der Grenze von ±30 ppm bleibt.
Deshalb macht der Analysator das Verdikt zum Drift von der Analysedauer abhängig:
Fenster |
Verdikt bei Überschreitung der Drift-Toleranz |
Auswirkung auf OVERALL |
|---|---|---|
|
skipped (das Rauschen dominiert gegenüber der Grenze von ±30 ppm) |
keine |
|
WARN — nur informativ |
keine |
|
FAIL |
OVERALL = FAIL, exit 65 |
300 s ist das Abnahmefenster (ein Produktwert; der Standard ETSI TR 101 290 normiert die Messintervalle nicht) — lang genug, damit sich selbst ein bursthafter Zustellpfad bzw. ein Loopback-Pfad unterhalb von 1 ppm Messrauschen ausmittelt und eine Toleranzüberschreitung den Taktgenerator des Encoders und nicht das Netz widerspiegelt. Der vollständige Bericht zeigt die aktuelle Stufe in der Zeile Verdict mode des Blocks PCR DRIFT.
Um ein hartes PASS/FAIL-Verdikt zum Drift zu erhalten, starten Sie den Lauf mit -t 300 oder länger.
Empfehlungen zur Qualität der Quelle (informativ; die Verdikt-Stufen werden dadurch nicht verändert):
Quelle |
Minimales Fenster für ±5 ppm |
Für ±2 ppm |
Abnahme |
|---|---|---|---|
Broadcast-Multicast (CBR-Netz, Jitter < 100 µs) |
30 s |
60 s |
5 min |
Stabiles IP-Netz (Jitter < 200 µs) |
30 s |
2 min |
5–10 min |
Loopback / bursthafter Sender (UDP unicast auf |
5 min |
15 min |
30 min |
Kalibrierung / Labormessung |
— |
30 min |
1+ Stunde |
Beispiele:
# 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
Wird derselbe Strom über mehrere kurze Fenster analysiert und schwankt der Driftwert zwischen den Fenstern um mehr als einige ppm, so ist der Zustell-Jitter der Engpass (das Sendetempo des Senders oder das Netz) und nicht der Taktgenerator des Encoders — vergrößern Sie das Fenster.
Exit-Codes¶
Code |
Bedeutung |
|---|---|
|
Analyse abgeschlossen, OVERALL = PASS |
|
Fehler in den Argumenten oder am Eingang |
|
Im Strom sind keine PCR-Daten vorhanden |
|
Die Dauer des Stroms liegt unter dem Minimum von 2 s, oder es wurden überhaupt keine Daten empfangen (die Quelle sendet nicht, falsche Adresse, kein Multicast-Beitritt erfolgt, Firewall oder falsche Schnittstelle — der Analysator gibt einen Hinweis aus) |
|
Analyse abgeschlossen, OVERALL = FAIL — Verletzung von TR 101 290 / ISO 13818-1 |
|
Abbruch durch SIGINT (Ctrl+C) — die Analyse wird verworfen, es wird kein Bericht ausgegeben |
|
Abbruch durch SIGTERM — die Analyse wird verworfen, es wird kein Bericht ausgegeben |
65 ist EX_DATAERR aus POSIX <sysexits.h>: „die Eingabedaten sind fehlerhaft“. Verwenden Sie ihn in CI / Überwachung als Gate für die Konformität des Stroms:
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
}
Die Codes 130/143 folgen der POSIX-Shell-Konvention 128 + signal_number, daher stimmt $? nach Ctrl+C mit dem überein, was bash für jeden durch SIGINT/SIGTERM beendeten Prozess zurückgibt. Bei einem Abbruch gibt der Analysator eine einzelne Zeile auf stderr aus (Analysis interrupted by signal N — no report produced.) und überspringt die Erzeugung des Berichts vollständig.
Beispielausgabe¶
Vollständiger Bericht (Auszug)¶
========================================================================
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
========================================================================
Kurzbericht¶
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
Anmerkungen¶
Dateimodus: PCR-Drift, das T-STD-Puffermodell und UDP IAT werden nicht gemessen — sie erfordern eine Echtzeitreferenz. Alle übrigen Prüfungen funktionieren in beiden Modi.
Ein einzelner Transportstrom: Es wird jeweils ein MPTS oder SPTS analysiert.