---
title: TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290
url: https://doc2.pstreamer.tv/de/manual/toolkit/ts_analyze.html
lang: de
product: Perfect Streamer
version: 2.0.2.362
---

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

Teil des **Perfect Streamer Toolkit** — [https://pstreamer.tv](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://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

```bash
# 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
<?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:

```bash
# 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:

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