TS Analyze Perfect Streamer Toolkit v2.2 — TR 101 290¶
Teil des Perfect Streamer Toolkit — https://pstreamer.tv
Konsolen-Analyzer für MPEG-TS-Transportströme mit Konformitätsprüfung nach ETSI TR 101 290 V1.4.1 und Validierung des T-STD-Puffermodells aus ISO/IEC 13818-1.
Liest UDP-Multicast/-Unicast oder TS-Dateien, erkennt PCR-PIDs automatisch über PAT/PMT und gibt einen ausführlichen oder kurzen Bericht auf stdout aus.
Was geprüft wird¶
Der Analysator durchläuft jedes TS-Paket und meldet Verstöße:
Priority 1 (TS-Dekodierbarkeit): TS-Sync, Sync-Verlust, Vorhandensein und CRC von PAT/PMT, Continuity Counter, PID-Vorhandensein
Priority 2 (empfohlenes Monitoring): TEI-Indikator, CRC-Fehler, PCR-Wiederholung/-Genauigkeit/-Diskontinuität, PTS-Intervall, CAT-Vorhandensein
Priority 3 (erweitertes Monitoring): Intervalle NIT/SDT/EIT/TDT, unreferenzierte PIDs, Über-/Unterlauf der T-STD-Buffer
Zusätzlich werden ausgegeben:
PCR-Genauigkeit bis ±500 ns — Regression über Byte-Positionen
PCR-Drift in ppm (nur Live-Modus)
T-STD-Pufferspeichermodell für jeden Elementarstream (Live-Modus)
Validierung der SI-Sektionsgrößen gegen ISO/EN-Grenzwerte mit Warnungen zur EIT-on-STB-Kompatibilität (>1024 B)
UDP IAT (Inter-Arrival Time) — Jitter-Statistik auf Datagramm-Ebene (nur Live-Modus)
Nutzung¶
ts_analyze [options] <input>
Eingänge¶
Formular |
Beschreibung |
|---|---|
|
UDP multicast |
|
UDP-Multicast auf der angegebenen Schnittstelle |
|
UDP unicast |
|
UDP-Unicast auf Loopback (Testquelle) |
|
Lokale TS-Datei |
RTP-gekapseltes UDP wird automatisch erkannt und entpackt.
Optionen¶
Option |
Beschreibung |
Standard |
|---|---|---|
|
Analysedauer in Sekunden |
|
|
Zusammenfassender Kurzbericht |
– |
|
Ausführlicher Bericht |
ja |
|
TS-Bitrate-Hinweis für den Dateimodus |
|
|
Nur die angegebene PCR-PID analysieren (dezimal oder |
automatisch |
|
PCR-Wiederholungsfehler-Limit 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 (ohne stderr) |
Text |
|
Hilfe anzeigen |
– |
Beispiele¶
# 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
EIT- oder NIT-Analyse deaktivieren¶
In manchen Streams werden EIT oder NIT bewusst weggelassen (geschlossene Netze, Lab-Quellen, OTT-only contribution etc.). Die entsprechenden P3-Prüfungen aus TR 101 290 ergeben dann immer FAIL beim OVERALL-Gate — das ist nur Rauschen.
Verwenden Sie --no-eit und/oder --no-nit, um diese Prüfungen zu deaktivieren:
Flag |
Übersprungene Prüfungen |
Nebenwirkungen |
|---|---|---|
|
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 zusammengesetzt, ihr Beitrag zu P2.2 (CRC) und zur SI-Sektionsgrößen-Summe ist null. Die Warnung zur EIT-on-STB-Kompatibilität wird unterdrückt. |
|
P3.1 (NIT actual), P3.2 (NIT other) |
NIT-Sektionen werden nicht zusammengesetzt, ihr Beitrag zu P2.2 (CRC) und zur Sektionsgrößen-Summe ist daher null. |
Übersprungene Prüfungen erscheinen im Bericht als N/A mit der Markierung disabled (--no-eit) / disabled (--no-nit), im XML als applicable="false" result="N/A". Im Kurzbericht wird statt eines Fehlerzählers NIT=off / EIT=off angezeigt.
Die Flags betreffen nur die Verarbeitung von EIT (PID 0x0012) und NIT (PID 0x0010) — alle anderen TR-101-290-Prüfungen (P1.x, P2.x, SDT, TDT, CAT, T-STD, PCR-Drift, IAT) laufen wie gewohnt.
XML-Ausgabemodus (--xml)¶
--xml veranlasst den Analyzer, ein einziges, eigenständiges UTF-8-XML-Dokument auf stdout auszugeben. Sämtliche begleitende Information (Banner, «Stream locked», «PCR PIDs discovered», sekündlicher Fortschritt, Capture-Zusammenfassung, Warnung bei kurzer Laufzeit) wird unterdrückt; stderr bleibt leer, sofern kein echter Fehler auftritt (Eingang nicht öffenbar, keine PCR-Daten, Stream zu kurz, Unterbrechung durch Signal). ANSI-Farben werden zwingend deaktiviert.
Der Exit-Code entspricht dem im Textmodus: 0 bei OVERALL=PASS, 65 bei OVERALL=FAIL, dazu die Standardfehler-/Signalcodes (1, 2, 3, 130, 143).
XML-Struktur der obersten Ebene:
<?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>
Wichtige Konventionen:
Alle PIDs werden als
0xHHHH(4-stelliger Hex mit Präfix0x) formatiert.Das Attribut
resultnimmt die WertePASS/FAIL/WARN/N/A/INFO/SKIP/ok/WARN_STBan.Für nicht anwendbare Prüfungen (Datei-Modus, kein Scrambling etc.) erscheint das Element dennoch mit
applicable="false"undresult="N/A", damit Schema-Konsumenten eine stabile Form sehen.<drift>trägtverdict_mode="informational"für30 s ≤ T < 300 sundverdict_mode="hard"fürT ≥ 300 s;result="SKIP"für Läufe unter 30 s.<iat>fehlt bei Läufen im Dateimodus.<overall>spiegelt dasselbe Gate wie die OVERALL-Zeile im Textbericht wider und entspricht dem Prozess-Exit-Code.
Die Ausgabe ist wohlgeformtes XML (validierbar mit xmllint --noout); kann ohne Parser-Anpassung direkt in XSLT, Python lxml usw. eingespeist werden.
Bericht lesen¶
Statusfarben¶
Status |
Farbe |
Wert |
|---|---|---|
|
grün |
Prüfung entspricht dem Standard |
|
gelb |
Weiche Verletzung, beeinflusst OVERALL nicht |
|
rot |
Standardverletzung, beeinflusst OVERALL |
|
standardmäßig |
Nur informativ |
Verwenden Sie --no-color beim Umleiten in Log-Dateien oder Nicht-ANSI-Terminals.
Mindestanalysedauer¶
Dauer |
Abdeckung |
Exit-Code |
|---|---|---|
< 2 s |
Zu wenig — Analyse wird abgelehnt |
3 (Fehler) |
2–10 s |
P1 + P2 sind verlässlich; einigen P3-Prüfungen können Daten fehlen |
0 + WARN |
10–30 s |
P1 + P2 + die meisten P3; TDT (30 s) reicht ggf. nicht |
0 + NOTE |
≥ 30 s |
Vollständige Abdeckung aller TR-101-290-Prüfungen |
0 |
Die Standardlaufzeit beträgt 30 Sekunden — ausreichend für vollständige TR-101-290-Abdeckung. Verwenden Sie -t <sec> zur Verlängerung (z. B. für Abnahmetests bei PCR-Drift) oder Verkürzung (schnelle smoke-Prüfungen).
Während der Analyse aktualisiert der Analyzer jede Sekunde eine einzeilige Fortschrittsanzeige auf stderr:
Progress: 47.3% (14.2s / 30.0s, 330614 packets)
Die Zeile nutzt Carriage-Return (\r), um in einem Terminal als eine Zeile zu bleiben; mit 2>/dev/null lässt sich stderr unterdrücken.
PCR-Drift-Verdikt — zweistufiges Fenster¶
Die PCR-Taktfrequenztoleranz nach ISO/IEC 13818-1 §2.4.2.1 und ETSI TR 101 290 beträgt ±30 ppm. Der Drift-Wert im Bericht entsteht durch lineare Regression der kumulativen PCR-Sekunden gegenüber der Wanduhr-Eintreffzeit; der statistische Fehler nimmt wie 1 / T^(3/2) ab — daher muss das Analysefenster lang genug sein, dass das Messrauschen deutlich unterhalb der ±30-ppm-Grenze liegt.
Daher koppelt der Analysator das Drift-Verdikt an die Analysedauer:
Fenster |
Verdikt bei Drift außerhalb der Toleranz |
Auswirkung auf OVERALL |
|---|---|---|
|
skipped (Rauschen dominiert die Grenze von ±30 ppm) |
keine |
|
WARN — nur informativ |
keine |
|
FAIL |
OVERALL = FAIL, exit 65 |
300 s ist das Abnahmetest-Fenster nach DVB TR 101 297 — lang genug, damit selbst ein bursty/loopback-Lieferpfad unter 1 ppm Messrauschen mittelt; ein Out-of-Spec-Ergebnis spiegelt dann den Encoder-Takt wider, nicht das Netz. Der vollständige Bericht zeigt die aktuelle Stufe in der Zeile Verdict mode des PCR-DRIFT-Blocks.
Für ein hartes PASS/FAIL-Verdikt zur Drift mit -t 300 oder länger ausführen.
Empfehlungen zur Quellenqualität (informativ; Verdiktstufen ändern sich nicht):
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 / bursty Sender (UDP-Unicast auf |
5 min |
15 min |
30 min |
Kalibrierung / Labormessung |
— |
30 min |
1+ Stunde |
Beispiele:
# Быстрая проверка дрейфа 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
Wenn derselbe Stream in mehreren kurzen Fenstern analysiert wird und der Drift-Wert zwischen den Fenstern um mehr als wenige ppm variiert, liegt der Engpass im Delivery-Jitter (Pacing des Senders oder Netz), nicht am Encoder-Takt — Fenster vergrößern.
Exit-Codes¶
Code |
Wert |
|---|---|
|
Analyse abgeschlossen, OVERALL = PASS |
|
Argument- oder Eingabefehler |
|
Stream enthält keine PCR-Daten |
|
Streamdauer unter dem Minimum von 2 s |
|
Analyse abgeschlossen, OVERALL = FAIL — Verstoß gegen TR 101 290 / ISO 13818-1 |
|
Abgebrochen durch SIGINT (Ctrl+C) — Analyse abgebrochen, kein Bericht |
|
Abgebrochen durch SIGTERM — Analyse abgebrochen, kein Bericht |
65 ist EX_DATAERR aus POSIX <sysexits.h> — „input data was incorrect“. In CI/Monitoring nutzbar als Gate für die Stream-Konformität:
ts_analyze -s -t 60 udp://239.1.1.1:5000 || {
case $? in
65) echo "поток не соответствует — см. отчёт" >&2 ;;
130) echo "прервано пользователем" >&2 ;;
*) echo "ошибка инструмента" >&2 ;;
esac
}
Die Codes 130/143 folgen der POSIX-Shell-Konvention 128 + signal_number, sodass $? nach Ctrl+C mit dem übereinstimmt, was bash für jeden durch SIGINT/SIGTERM beendeten Prozess zurückgibt. Bei Unterbrechung gibt der Analyzer eine Zeile auf stderr aus (Analysis interrupted by signal N — no report produced.) und überspringt die Berichtserzeugung vollständig.
Beispielausgabe¶
Vollständiger Bericht (Auszug)¶
========================================================================
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
========================================================================
Kurzbericht¶
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
Anmerkungen¶
Dateimodus: PCR-Drift, T-STD-Puffermodell und UDP IAT werden nicht gemessen — sie erfordern eine Echtzeitreferenz. Alle anderen Prüfungen funktionieren in beiden Modi.
Ein Transportstream: pro Lauf wird ein MPTS oder SPTS analysiert.