TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290

Teil des Perfect Streamer Toolkithttps://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://239.1.1.1:1234

UDP multicast

udp://eth0@239.1.1.1:1234

UDP multicast auf der angegebenen Schnittstelle

udp://192.168.1.100:1234

UDP unicast

udp://lo@127.0.0.1:12655

UDP unicast auf Loopback (Testquelle)

/path/to/file.ts

Lokale TS-Datei

Eine RTP-Kapselung von UDP wird automatisch erkannt und entpackt.

Optionen

Option

Beschreibung

Standard

-t, --time <sec>

Analysedauer in Sekunden

30

-s, --short

Kurzer Zusammenfassungsbericht

-f, --full

Vollständiger detaillierter Bericht

ja

-b, --bitrate <Mbps>

TS-Bitraten-Hinweis für den Dateimodus

38.8

-p, --pcr-pid <pid>

Nur die angegebene PCR-PID analysieren (dezimal oder 0xHHHH)

auto

-l, --pcr-limit <ms>

Grenzwert für den PCR-Wiederholungsfehler in ms

40

--no-eit

EIT-Analyse überspringen — P3.7..P3.10 werden als N/A ausgewiesen, der EIT-Anteil an P2.2 / an der Summe der Sektionsgrößen entfällt

EIT aktiviert

--no-nit

NIT-Analyse überspringen — P3.1, P3.2 werden als N/A ausgewiesen, der NIT-Anteil an P2.2 / an der Summe der Sektionsgrößen entfällt

NIT aktiviert

--no-color

ANSI-Farben in der Ausgabe deaktivieren

Farben aktiviert

--xml

Strukturiertes XML auf stdout (kein stderr)

Text

-h, --help

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

--no-eit

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.

--no-nit

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 0xHHHH formatiert (4-stelliger hex-Wert mit dem Präfix 0x).

  • Das Attribut result nimmt die Werte PASS / FAIL / WARN / N/A / INFO / SKIP / ok / WARN_STB an.

  • Für nicht anwendbare Prüfungen (Dateimodus, fehlendes Scrambling usw.) ist das Element dennoch vorhanden, mit applicable="false" und result="N/A", damit Konsumenten des Schemas eine stabile Form vorfinden.

  • <drift> führt verdict_mode="informational" für 30 s T < 300 s und verdict_mode="hard" für T 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

PASS / ok

grün

Die Prüfung entspricht dem Standard

WARN / WARNING / WARN(STB)

gelb

Weiche Verletzung, ohne Auswirkung auf OVERALL

FAIL / ERROR

rot

Verletzung des Standards, wirkt sich auf OVERALL aus

INFO / NOTE / N/A

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

T < 30 s

skipped (das Rauschen dominiert gegenüber der Grenze von ±30 ppm)

keine

30 s T < 300 s

WARN — nur informativ

keine

T 300 s

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 lo)

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

0

Analyse abgeschlossen, OVERALL = PASS

1

Fehler in den Argumenten oder am Eingang

2

Im Strom sind keine PCR-Daten vorhanden

3

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)

65

Analyse abgeschlossen, OVERALL = FAIL — Verletzung von TR 101 290 / ISO 13818-1

130

Abbruch durch SIGINT (Ctrl+C) — die Analyse wird verworfen, es wird kein Bericht ausgegeben

143

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.