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

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

RTP-gekapseltes UDP wird automatisch erkannt und entpackt.

Optionen

Option

Beschreibung

Standard

-t, --time <sec>

Analysedauer in Sekunden

30

-s, --short

Zusammenfassender Kurzbericht

-f, --full

Ausführlicher Bericht

ja

-b, --bitrate <Mbps>

TS-Bitrate-Hinweis für den Dateimodus

38.8

-p, --pcr-pid <pid>

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

automatisch

-l, --pcr-limit <ms>

PCR-Wiederholungsfehler-Limit in ms

40

--no-eit

EIT-Analyse überspringen — P3.7..P3.10 werden als N/A ausgewiesen; EIT-Beitrag zu P2.2 und Sektionsgrößen-Summe entfällt

EIT aktiviert

--no-nit

NIT-Analyse überspringen — P3.1, P3.2 werden als N/A ausgewiesen; NIT-Beitrag zu P2.2 und Sektionsgrößen-Summe entfällt

NIT aktiviert

--no-color

ANSI-Farben in der Ausgabe deaktivieren

Farben aktiviert

--xml

Strukturiertes XML auf stdout (ohne stderr)

Text

-h, --help

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

--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 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.

--no-nit

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äfix 0x) formatiert.

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

  • Für nicht anwendbare Prüfungen (Datei-Modus, kein Scrambling etc.) erscheint das Element dennoch mit applicable="false" und result="N/A", damit Schema-Konsumenten eine stabile Form sehen.

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

PASS / ok

grün

Prüfung entspricht dem Standard

WARN / WARNING / WARN(STB)

gelb

Weiche Verletzung, beeinflusst OVERALL nicht

FAIL / ERROR

rot

Standardverletzung, beeinflusst OVERALL

INFO / NOTE / N/A

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

T < 30 s

skipped (Rauschen dominiert die 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 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 lo)

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

0

Analyse abgeschlossen, OVERALL = PASS

1

Argument- oder Eingabefehler

2

Stream enthält keine PCR-Daten

3

Streamdauer unter dem Minimum von 2 s

65

Analyse abgeschlossen, OVERALL = FAIL — Verstoß gegen TR 101 290 / ISO 13818-1

130

Abgebrochen durch SIGINT (Ctrl+C) — Analyse abgebrochen, kein Bericht

143

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.