×

⊳ Muxer

MPTS · TSDuck · PSI/SI

MPTS-Multiplexer & Adaptiver Hybrid-Statmux

Stream Manager Mux montiert mehrere SPTS-Streams in eine CBR MPTS-Ausgabe (DVB/IPTV). Adaptive Hybrid Statmux kombiniert einen CBR-Kern-Fill mit VBR-balancierten Encodern für konstante Mux-Ausgabe.

1. Encoder-Schicht (FFmpeg pro Stream)

Wenn der Parent Mux Statmux aktiviert hat, läuft jeder FFmpeg Encoder mit Cap-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>. VBV Buffer = 2× max ergibt ~2 s Peak-Headroom. Statmux Streams erhalten auch einen deterministischen GOP-Offset (-force_key_frames) pro stream_id, damit I-Frame-Peaks nicht über Kanäle hinweg zusammenfallen.

2. Mux-Schicht (TSDuck tsp-Pipeline)

tsp -I null (∞ NULL-Pakete @ line rate) → -P merge tsp -I ip <stream> (überlagert echte Pakete) → -P continuity (Drop-Alarm) → -P pcradjust --bitrate X (schreibt PCRs neu) → -P pcrverify --jitter-max 500µs → -P bitrate_monitor (Rate-Alarm ±5 %) → -P regulate --bitrate X --packet-burst 32 → -O ip <out> --packet-burst 7 --enforce-burst.

3. Ausgabeschicht (UDP)

regulate Plugin emittiert exakt mux.bitrate bps auf dem Draht. Inputs hinterherhinken → NULL-Pakete füllen die Lücke. Inputs peaken → interner FIFO-Buffer (4096 Pakete ≈ 0,3 s @ 19 Mbps) nimmt auf. --enforce-burst erzwingt 7 TS-Pakete pro UDP-Datagramm (1316 B, IPTV-Standard).

Empfohlene Dimensionierung (Σ min / avg / max vs mux.bitrate)

Mux-Topbar zeigt 3 Summen mit Farbstatus. Regeln:

Σ avg ≤ 85 % mux.bitrate – durchschnittliches Zielsum über alle Kanäle plus Audio. Das ist das Mux-'Budget'. Die 15 % statistische Reserve schützen vor Peak-Koinzidenz. Grün ≤ 85 %, Orange ≤ 100 %, Rot > 100 %.

Σ max ≤ 160 % mux.bitrate — Spitzenwert-Summenobergrenze. Darf die Kapazität überschreiten (das ist der Punkt von Statmux — Spitzenwerte fallen selten zusammen). Grün ≤ 160 %, amber ≤ 200 %, rot > 200 % (Drops bei dauerhaftem Spitzenwert).

Σ min ≤ 50 % mux.bitrate — Encoder-Untergrenze-Summe. Eine sichere Untergrenze stellt sicher, dass der Encoder bei ruhigen Szenen nicht auf unnötig niedrige Qualität abfällt. Grün ≤ 50 %, amber ≤ 90 %, rot > 90 %.

Beispiel: 4 HD-Kanäle in einem 19 Mbps DVB-T Mux

Verfügbares Budget nach PSI/SI/EIT: ~18,5 Mbps. Σ avg = 4 × 4,0 = 16 Mbps (86 % — amber, grenzwertig, weiter senken). Σ max = 4 × 6,0 = 24 Mbps (130 % — grün, OK). Σ min = 4 × 3,0 = 12 Mbps (65 % — amber, OK). Ziel: avg ~85 % des Budgets, max ≤ 160 %.

Diagnose & Alarme

Auf ≥ 10 Alarme in 60s blinkt eine Flash-Benachrichtigung in der Mux-UI auf und empfiehlt eine Bitrate-Reduzierung. Auto-Back-Off ist NICHT aktiv – der Operator entscheidet.

-P bitrate_monitor --periodic 60 --min/max ±5% — Alarm wenn Istrate um mehr als ±5 % vom Ziel abweicht. Bedeutet, dass regulate verhungert (Eingabe gestorben).

-P continuity – verfolgt TS-Kontinuitätszähler. Protokolliert eine Warnung bei jedem Drop (Überabonnement, FFmpeg-Crash, NIC-Jitter).

-P pcrverify --jitter-max 500000 – DVB erlaubt PCR-Jitter ≤ 500 µs. Alarm = pcradjust kann nicht mithalten oder Quelle hat kaputte PCRs.

Glitches und ihre Ursachen

GOP-Koinzidenz — alle Encoder senden gleichzeitig I-Frames aus, Spitzenkoinzidenz. Fix: GOP-Versatz (bereits für Statmux aktiv, hash(stream_id) mod gop_size).

Eingabe-Signalverlust – einzelner Kanal wird schwarz, Mux läuft weiter (dank -I null Basis). Dauer ~3-8 s für FFmpeg-Neustart.

Überzeichnung (anhaltende Spitzen > Kapazität) — Blöcke/Audio-Stottern ~50–200 ms. Fix: Stream-Durchschnitt um 5–10 % senken oder einen Kanal entfernen.

PCR-Drift – STB-Stottern alle paar Sekunden. Fix: pcradjust in der Pipeline (bereits vorhanden), pcrverify Alarme beobachten.

STB VBV-Underrun — STB verliert Synchronisation und stellt sie wieder her (~2–3 s). Fix: Encoder bufsize = 2 × maxrate (bereits vorhanden), maxrate senken.

tsp-Pipeline-Parameter (mux_worker.ex)

--max-input-packets 4096 / --max-flushed-packets 4096 (interner FIFO ≈ 0,3 s @ 19 Mbps). --receive-buffer-size 16777216 (16 MB UDP-Empfangspuffer pro Eingabe). --packet-burst 32 (regulate) / 7 (Ausgang, IPTV-Standard). --enforce-burst (jedes UDP-Datagramm hat genau 7 Pakete).

Empirische Kapazitätsberechnung (CLT)

Top-Bar-Badge `📐 rec X.XM` zeigt die empfohlene Mux-Kapazität abgeleitet vom Zentralgrenzwertsatz. Die Summe unabhängiger VBR-Streams nähert sich einer Normalverteilung, also Mux = μ_total + z·σ_total + Rand. σ_i wird aus dem VBR-Bereich jedes Inputs als (max−min)/4 geschätzt (unter der Annahme, dass der Bereich ±2σ abdeckt). Der Rand = 10 % von μ_total kompensiert PSI/SI-Overhead, Encoder Rate-Control Jitter und Stream-Korrelation, die reine CLT unterschätzt.

Badge-Farbe: 🟢 grün = cap ≥ 99,7 % Empf. (konservativ) · 🟡 amber = zwischen 99 % und 99,7 % · 🔴 rot = cap < 99 % (unterdimensioniert, Drop-Risiko) · 🔵 blau = cap nicht gesetzt.

z-Score pro Abdeckungsziel: 90 % z=1,28 · 95 % z=1,65 · 99 % z=2,33 · 99,7 % z=3,00 (Standard) · 99,99 % z=3,72 (Broadcast-Qualität). Der Badge-Tooltip listet alle Stufen auf; Klicken wendet die 99,7 %-Empfehlung auf mux.bitrate an (Mux-Neustart erforderlich).

σ_eff = σ_total × statmux_factor (statmux_factor = 0,7 wenn Statmux AN, sonst 1,0)

Empfohlene Werte pro Kanal (HD H.264)

1080p25 HD-Kanal: avg = 4000–5000 kbps, min = avg × 0,75 (~3000–3750), max = avg × 1,5 (~6000–7500). UI füllt min/max automatisch aus avg aus. Statmux-UI füllt avg automatisch aus dem Transkodierprofil des Streams. SD-Kanal: avg = 2000–2500 kbps. UHD: avg = 12000–18000 kbps.

Adaptiver Hybrid-Statmux

Adaptiver Hybrid-Statmux ist ein Laufzeitmechanismus, der ungenutzte Kapazität von Core-Streams (geschützt, voller VBR) zu Balanced-Streams (opferbar) verschiebt. 'Hybrid', weil zwei unterschiedliche Ratekontroll-Regime nebeneinander laufen (CBR Core-Füll + VBR Balanced); 'adaptiv', weil der Router einmal pro Sekunde aus einer HLS-Lookahead-Vorhersage neu bewertet. Der Operator markiert Streams über das rechte Kontrollkästchen als Balanced; das System pre-enkodiert sie in drei Stufen (HIGH/MED/MIN), und der Router tauscht den Symlink atomisch basierend auf dem verbleibenden Headroom nach der Vorhersage von Core-Spitzen aus.

Kapazität – wie Bitrate aufgeteilt wird

Mux-Kapazität 38 Mbps
  ┌──────────────────────────────────────────────────────────────────┐
  │█████████████████████████████████████████████████████░░░░░░░░░░░░│
  └──────────────────────────────────────────────────────────────────┘
   ◀────── core_max (aus 6 HLS-Segmenten vorhergesagt) ─▶◀── balanciert ──▶
                                                       per_balanced
                                                       = (cap − core_max
                                                          − SI-Overhead
                                                          − audio) / N

  Beispiel: cap=38000  core_max=29000  SI=200  audio_total=1280  N_balanced=2
           remaining = 38000 − 29000 − 200 − 1280 = 7520 kbps
           per_balanced_max = 7520 / 2 = 3760 kbps
           clamp(3760, 500, 3000) = 3000 kbps  ← Obergrenze für balanced VBR

Praktischer Gewinn (10 Streams × 3 Mbps Durchschn., 4 Mbps Max)

Ohne Adaptive Hybrid Statmux müssen Sie den Mux für das Worst-Case Σ max dimensionieren. Mit Adaptive Hybrid Statmux dimensionieren Sie rund Σ avg + einen statistischen Buffer (Broadcast-Korrelation ρ=0,15). Echter Gewinn ~5 Mbps auf einem 38 Mbps Mux, oder +1 Stream mit der gleichen Cap.

Reines CBR (Encoder fest)

VBR ohne Statmux

Adaptiver Hybrid-Statmux EIN

URL ↔ Statmux-Exklusivität

Benutzerdefinierte URL-Eingabe-Überschreibung und Statmux schließen sich gegenseitig aus. Mit aktiviertem Statmux verlässt sich der Balanced-Transcoder auf das lokale Encoder-HLS zur Bitratensteuerung. Eine externe URL würde diese Steuerungsschleife umgehen. Die UI erzwingt dies in beide Richtungen — das Kontrollkästchen sperrt, wenn eine widersprüchliche Kombination vorliegt, und der Tooltip zeigt, welcher Stream blockiert.

Pipeline (Encoder → Balanced-Transcoder → Mux FFmpeg → tsp)

┌─────────────────────────┐
          │  Encoder (NVDEC→NVENC)  │ ← UDP-Satellit
   STREAM │  /dev/shm/stream_X/h264/│
          │  → muxed.m3u8 + Segmente│
          └────────────┬────────────┘
                       │
              ┌────────┴────────┐
              │                 │
        role="core"        role="balanced"
        (geschützt)        (opferbar)
              │                 │
              │                 ▼
              │     ┌───────────────────────────┐
              │     │  BalancedTranscoder       │
              │     │  ffmpeg p1 NVENC VBR      │
              │     │  -maxrate dynamisch       │ ← Adaptiver Hybrid-Router
              │     │  /dev/shm/stream_X_       │   1s-Tick (Vorhersage aus
              │     │   balanced/h264/...m3u8   │   6 HLS-Segmenten, atomarer
              │     └───────────┬───────────────┘   Symlink-Tausch HIGH/MED/MIN)
              │                 │
              ▼                 ▼
          ┌─────────────────────────┐
          │  ffmpeg-als-Mux         │ ← /dev/shm/mux_X/pipe.sh
          │  -f mpegts pipe:1       │
          │  -muxrate <cap>         │
          └────────────┬────────────┘
                       │ Shell-Pipe
                       ▼
          ┌─────────────────────────┐
          │  tsp -I file -          │
          │  continuity → regulate  │
          │  → pcradjust → bitrate_ │
          │     monitor             │
          │  -P nit -P sdt -P inject│
          │     (DVB-SI-Tabellen)   │
          └────────────┬────────────┘
                       │
                       ▼ UDP-Multicast
                  239.x.x.x:1234

Core-VBR min/avg/max für Statmux dimensionieren

Statistischer Gewinn tritt nur auf, wenn Encoder einen breiten VBR-Bereich haben — wenn max ≈ avg ist der Encoder effektiv CBR und der Router hat nichts umzuverteilen. min/avg/max pro Stream so konfigurieren, dass Σmax deutlich über der Mux-Kapazität liegt (Überzeichnung = Headroom für statistischen Gewinn), während Σavg komfortabel darunter bleibt.

Beispiel — 38-Mbps-Mux, 10 HD Core + 2 Balanced:

  Alt (CBR-gesperrt):       min=2000  avg=3000  max=4000
     Σmax = 10×4000 + 2×7600 = 55200 kbps  (1,45× cap — kleiner Gewinn)
     σ_pro_stream = (4000−2000)/4 = 500 kbps  (trivial — flach)
     Σ statistischer Headroom ≈ 1,5 Mbps

  Empfohlen (breites VBR): min=1500  avg=3000  max=6000
     Σmax = 10×6000 + 2×7600 = 75200 kbps  (1,98× cap — guter Gewinn)
     Σavg = 10×3000 + 2×3000 =  36000 kbps  (95 % cap — komfortabel)
     Σmin = 10×1500 + 2×500  =  16000 kbps  (42 % cap — komfortable Untergrenze)
     σ_pro_stream = (6000−1500)/4 = 1125 kbps  (signifikant)
     Σ statistischer Headroom ≈ 4 Mbps

  Realer Nutzen: Bei Actionszenen piekt Core auf 5−6 Mbps (HD-Detail), der
  Router reduziert Balanced auf MIN-Stufe, der Gesamtdraht bleibt bei 38 Mbps.
Empfohlener Bereich pro Core-Stream:

  • min  ≈ avg × 0,5  (Encoder kann bei ruhigen Szenen fallen)
  • avg  = Nominales Ziel nach Auflösung (HD ≈ 3 Mbps, FullHD ≈ 5 Mbps, UHD ≈ 12 Mbps)
  • max  ≈ avg × 2,0  (Encoder piekt bei Action — Sport, Actionfilm)

Mux-Kapazitätssicherungen (müssen gelten):

  • Σ avg core + Σ avg balanced  ≤  mux.bitrate × 0,85   (komfortables Ziel)
  • Σ max core + Σ max balanced  ≤  mux.bitrate × 2,0    (Überzeichnungsgewinn)
  • Σ min core + Σ min balanced  ≤  mux.bitrate × 0,6    (Worst-Case-Untergrenze)

σ_pro_stream = (max − min) / 4  (nimmt ±2σ-Bereich an)
σ_total = √((1−ρ) · Σσ²ᵢ + ρ · (Σσᵢ)²)   ρ = 0,15 Broadcast-typisch
σ_eff = σ_total × 0,7                     (Statmux-Faktor wenn EIN)
Mux_99,7% = μ_total + 3 · σ_eff           (in Balken-📐-Empfehlung angezeigt)

Tipps & Fehlerbehebung

Mindestens 1 ausgewogener Stream – ohne einen hat der Adaptive Hybrid Router nichts zu quetschen bei Peaks, also Gewinn = 0

Musik- und Infikanäle sind die besten Kandidaten – 90 %+ Toleranz für Ratenreduzierung

Über [balance-router]-Log-Einträge verfolgen — zeigt core_max, remaining, Stufenübergänge für jeden 1-s-Tick

Wenn core_max > capacity (CORE OVERPEAK-Warnung im Log), Core-Stream-Anzahl reduzieren oder Encoder-maxrate senken

Bedienungsablauf

Streams zum Mux hinzufügen (Kanalzuordnung bleibt manuell)

Statmux am Mux-Header umschalten (gelber Chip). Wenn aktiviert, wechseln alle Encoder zu VBR und starten neu

Opferbare Streams über das rechte orange Kontrollkästchen markieren — typischerweise Musik-/Infokanäle, bei denen Ratenabsenkung unsichtbar ist

Fertig. Der adaptive Hybrid-Router liest alle 1 s eine 6-Segment-HLS-Vorhersage aus Core-Streams und tauscht den Balanced-Symlink atomisch zwischen HIGH/MED/MIN-Stufen aus

StatMux — natives statistisches Multiplex

Mehrere Kanäle mit variabler Bitrate teilen einen festen Transportstrom (MPTS). Bits werden dynamisch nach Inhaltskomplexität umverteilt — eine anspruchsvolle Szene bekommt mehr, eine statische weniger — sodass Qualität ausgeglichen bleibt und die Summe die Drahtkapazität nie überschreitet.

Klasse: geschlossener Feedback-Statmux mit C1-Lookahead (Feedforward) über VBR-Encoder — Broadcast-Statmux-Prinzip, gesteuert von Quellkomplexität.

Architektur & Datenfluss

Architecture diagram

UDP-Multicast SSM, pro Kanal

Encoder

Quellkomplexität

Loopback – codet Mux-Ausgabe für Feedback neu.

eigene Leitung / Stream

Allokator (Σ ≤ Pool)

Puffer

Null-Padding → CBR

CBR-Draht bei Cap

komplexe Szene vor dem Einbruch antizipieren

gemessener Draht — Kalibrierung

Zielbitrate

Jeder Kanal läuft auf seiner eigenen Leitung bis zum Mux (separater Encoder + Loopback-Verbindung), wo alle zu einem MPTS-Multicast-Strom mit exakt fester Bitrate zusammenfließen. Der Allokator ist das zentrale Gehirn (1 GenServer pro Mux), Tick ~0,85 s.

Gehirn: Feedback + C1-Lookahead

Der Allokator kombiniert zwei Signale — eine Vorhersage aus Quellkomplexität (vorwärts) und den gemessenen Draht (rückwärts). Dies nähert sich Broadcast-Statmuxes an, die die Kosten eines Frames vor der Codierung kennen.

C1 misst Inhaltskomplexität am Decoder — was dem Encoder-Ausgang um die Pipeline-Latenz voraus ist. Die relative Komplexitätsänderung (Korrelation r≈0,92 mit Bits) wird auf die Zielbitrate in BEIDE Richtungen BEVOR der Encoder sie produziert angewendet: eine steigende Szene wird vorab zugeteilt (kein Einbruch), eine fallende gibt Bits frühzeitig für andere frei.

Gemessener Draht (Feedback)

Exakte pro-Stream-Bits, die vom Mux ausgesandt werden (senderseitige Zähler), kalibrieren das Komplexitäts-Bitraten-Mapping und halten die Summe exakt beim Pool. Bodenwahrheitsanker — die C1-Vorhersage ist nicht perfekt (r 0,92), der nacheilende Draht korrigiert sie.

Lieferfähigkeit

Der Anspruch eines Streams basiert darauf, was der Encoder tatsächlich produziert (× Spitzenheadroom). Ein einfacher Kanal kann keine Bandbreite horten, die er nicht verbrauchen kann — er gibt sie an die Hungrigen frei.

Gleichmäßige Qualität

Das Ziel ist nicht gleiche Bitrate, sondern gleiche Qualität — kontinuierlicher Druck verschiebt Bits von qualitativ hochwertigen Kanälen (niedriges QP) zu qualitativ minderwertigen (hohes QP).

Prädiktive Umverteilung

Wenn C1 einen sinkenden Kanal signalisiert, wird seine Bandbreite im gleichen Tick an die anderen übergeben — sie rampen auf, bevor der Abfall den Draht erreicht.

Pro-Kanal-Gewicht = complexity_q12 × max_bps (Action-Szene + höheres Max ⇒ mehr Bits).

Pro-Stream-Budget = globales Budget × Gewicht / Σgewichte, Sperre [min_bps, max_bps], alle 10 ms neu berechnet.

Proportionale Pool-Zuteilung nach Bedarf, begrenzt auf [min, max] aus dem Videoprofil; freie Bandbreite geht an die Hungrigen.

Encoder-Ziel = Zuteilung / Kalibrierung (pro-Stream-EMA gemessen/Ziel); mit Schwellwert (Δ≥3 %/1 s) und Slew-Limit gegen Überdrehung ausgeliefert.

Buffer-Hold-Servo hält den Warteschlangenpegel bei ~1 s (Band), Notfall-Backstop bei Überlastung; Null-Padding füllt den Rest auf CBR auf.

CBR-Draht: Puffer + Null-Padding + Pacing

Der Ausgang ist ein exakter CBR-Stream beim konfigurierten Cap. Drei Schichten garantieren dies:

Stehender Puffer ~1 s

Die Sendewarteschlange hält einen stehenden Pegel von ~1 s Draht, der subsekunden-GOP-Dips absorbiert (zwischen I-Frames). Aus der Aufzeichnung verifiziert: 0,5–1 s absorbiert 88–91 % der Dips.

Null-Padding

Wenn Inhalt unter Cap liegt, wird die Differenz mit MPEG-TS-Null-Paketen (PID 0x1FFF) aufgefüllt. Der Draht trifft IMMER den Cap — DVB-konform.

Exaktes Pacing

Egress wird auf den exakten Cap eingetaktet (Busy-Spin ABSTIME); ein 12-ms-Schulden-Clamp verhindert Aufhol-Bursts nach einer kurzen Stauung → kein PCR-Jitter, keine Über-Cap-Spitzen.

Ausgangs-Chart (Fluss)

Ein Live-Stapelgraph des echten Drahtes — jedes Band ist ein Kanal, der glatt von rechts fließt. Daten werden auf dem Draht gemessen (tsp-Probe + NIF-Zähler), nicht geschätzt.

Farbige Bänder

Jeder Kanal hat eine stabile Farbe; Dicke = seine momentane Bitrate. Overhead (PSI/EIT) ist grau am unteren Rand, Null-Padding ist strukturiert weiß oben.

Cap / Max-Linie

Die gestrichelte Linie oben = konfigurierter Cap (Draht-Obergrenze). Inhalt + Null-Padding liegen stets darunter.

Null-Band

Das gepunktete weiße Band oben = Null-Padding (freie Kapazität). Je dünner, desto voller der Draht; es verschwindet bei anspruchsvollem Inhalt.

Drop-Markierungen

Rote Markierungen auf der Zeitachse = Sendewarteschlangen-Überlauf (Drop). Null im Dauerbetrieb; Bursts nur beim Start/Flut.

Bereich (30s–30m)

Schaltflächen wechseln das Zeitfenster sofort (clientseitig), das aktive hat grünen Hintergrund. Der Graph sammelt 30 Min. im Browser.

Tooltip: zeigt Bitraten und Fehlerzahlen pro Stream

Hover zeigt Kanal-Bitrate, QP und Qualitätsindex zu diesem Zeitpunkt (historischer Wert, nicht live).

Maximale Bitrate (kbps) – harte Grenze für den Stream.

Aktueller Pool-Regulierungspegel (pool/(pool−trim)). >100 % = Überdruck (Puffer füllt sich), <100 % = Trimmen.

Reserve (Schieberegler)

Toleranzband über Cap — wie viel als Null-Reserve gehalten werden soll. 0 = genau N füllen; positiv = größere Reserve (sicherer); negativ = leichte Überfüllung.

Puffer (Drops)

Der Header zeigt Sendewarteschlangen-Auslastung % und kumulative Drops. Die Schaltfläche 'Drops löschen' setzt den Zähler zurück.

GOP-Größe (Frames) – Keyframe-Intervall.

Gemeinsame GOP-Länge für alle Kanäle im Mux (beim Start in Videoprofile gesperrt). Wall-Stagger verteilt I-Frames zeitlich, damit sie nicht kollidieren.

VBV-Puffergröße (ms) – Video Buffer Verifier.

Encoder VBV-Puffergröße (ms). Kleiner glättet I-Frames (gut für Bewegungskanäle), größer ergibt detailliertere I-Frames. Standard 850; pro Stream überschreibbar.

Stream-Karten & Zustände

Der Abschnittskopf hat einen 'Alle einklappen / Ausklappen'-Schalter. Erweitern Sie eine Karte durch Klicken oder Klick auf ihre Farbband im Diagramm. Der linke farbige Streifen mit Kontrollkästchen = Kanalmitgliedschaft im Mux.

Läuft — Kanal enkodiert und fließt zum Draht.

Startet — Encoder dreht hoch / stabilisiert sich.

Grau + gedimmt = Aus/Fehler und Kontrollkästchen AUS (absichtlich deaktiviert – kein Alarm)

Fehler — Eingabe verloren / Encoder abgestürzt.

PSI/SI-Tabellen (vollständiger DVB-Satz)

StatMux generiert den vollständigen Satz obligatorischer MPEG-TS / DVB-Tabellen direkt im NIF-Mux — kein externer SI-Inserter. Tabellen werden gleichmäßig in den Stream eingetaktet, damit ein STB PSI/SI nach dem Umstimmen schnell erfasst.

Tabelle

PID-Zuordnung für PSI/SI-Deskriptoren.

Intervall

Zweck / Quelle

EIT ↔ EPG: Vollintegration

EIT (Event Information Table, PID 0x12) ist nicht statisch — sie ist vollständig mit dem EPG-System der Anwendung verdrahtet. Der Operator weist jedem Kanal im Mux einen EPG-Dienst (eit_epg_service_id) zu, und der Mux generiert Live-EIT aus seinen geplanten Ereignissen.

Dimensionierung / Empfehlungen

min = untere Grenze (statische Szene). Empfohlen avg × 0,5–0,75. Niedrig genug setzen, um bei ruhigen Inhalten für andere zu sparen.

avg = Zielniveau. Σ avg aller Kanäle ≈ Videopool (Cap − Overhead − Audio).

max = Obergrenze (VBR-Headroom für Spitzen/Schnitte). Empfohlen avg × 1,5. Nicht auf avg begrenzen — VBR braucht Raum für Spitzen.

Beispiele (avg): SD 1,5–2,5M · HD 2,5–4M · FHD 4–6M · UHD 12–18M. Für Statmux einen vernünftigen Spread beibehalten, damit der Pool umverteilt werden kann.

Verhältnis zu Broadcast-Statmuxes

Wir machen echtes statistisches Multiplexing — dynamische Bitumverteilung über VBR-Kanäle, die einen festen Draht teilen, mit Qualitätsausgleich. Mechanisch sind wir professionellen Headend-Statmuxes nah (Cap-Ausrichtung, 1-s-Puffer, Null-Padding, GOP/B-Frames, Untergrenze-Überschreibung).

Was wir haben

CBR-Draht bei Cap · 1-s-Puffer · pro-Stream proportionale Zuteilung · C1-Lookahead-Feedforward · Qualitätsausgleich · prädiktive Umverteilung · Null-Padding · exaktes Pacing.

Wo wir uns unterscheiden

Ein Broadcast-Statmux verwendet die Rate-Distortion-Schätzung des Encoders (exakte Frame-Kosten, der Encoder ist Sklave des Allokators). Wir verwenden C1-Quellkomplexität (r≈0,92) + einen VBR-Encoder, der sein eigenes QP wählt — eine Hardware-Einschränkung, kein Designfehler. Klasse: Feedback + Lookahead statt reinem Feedforward.

Fehlerbehebung

TS-Symbolrate – Transport-Stream-Bitrate.

Ursache / Lösung

Lücken / Null-Spitzen (5–7M) im Chart

Inhaltsdips — entweder GOP zwischen I-Frames (vom 1-s-Puffer absorbiert) oder kollektiver Inhaltstillstand (durch Umverteilung behandelt). C1-Lookahead hat diese erheblich reduziert.

Drops > 0 steigen

Sendewarteschlange läuft über — Inhalt über Cap. Reserve (Schieberegler), Auslastung prüfen und sicherstellen, dass der Allokator nicht hängt (Tick läuft). Boot-Bursts sind normal.

Ein Kanal bleibt bei niedriger Bitrate / hohem QP

Entweder statischer Inhalt (korrekt — er gibt Bandbreite frei) oder zu niedriges max im Profil. min/avg/max und die echte Quellkomplexität prüfen.

Chart stockt / linke Kante wird gelöscht

Clientseitig — Harten Reload (Strg+Umschalt+R) für das neue JS-Bundle. Daten fließen via inkrementellen Push, Achse = ausgewählter Bereich.

cap % / Puffer ändert sich nach Bearbeitung nicht

Keine Live-Samples (Mux gestoppt oder Encoder nicht aktiv) – überprüfen Sie sowohl den Mux als auch den Stream-Status.

Architektur (Ende-zu-Ende)

SAT UDP SSM ─┐
             ├─ gst_encoder.py(K1)  CBR ─ TCP127 ─┐        ZMQ-Komplexität
   (pro      ├─ gst_encoder.py(K2)  CBR ─ TCP127 ─┤            ▲   │
   Kanal)    └─ gst_encoder.py(Kn)  CBR ─ TCP127 ─┤            │   ▼
                                                  ▼     BalanceRouter
                                   ┌─────── NIF StatMux ───────┐  │ set_bitrate
                                   │ pro-Eingabe Ring (drop-alt) │◄─┘
                                   │ 2-Pass Drain (A Priorität, V)│
                                   │ Allocator: w=cmplx×max     │
                                   │ ×headroom% (Schieber 78-90) │
                                   │ Stale-Ausschluss (>2s)     │
                                   │ NULL Pad -> Wire Cap CBR    │
                                   │ PCR Pass-Through           │
                                   └────────────┬──────────────┘
                                                ▼
                                   MPTS  UDP Multicast (CBR Cap)

gst_encoder.py pro Stream: SAT UDP SSM-Eingang → nvh264enc rc-mode=cbr. Bitrate wird vom BalanceRouter via set_bitrate gesteuert. Szenenkomplexität (SAD/px) über ZMQ an den Allokator gemeldet.

Pro-Eingabe Ring (TCP Loopback vom Encoder), 2-Pass Drain (Audio-Priorität, Video vollständig), proportionaler Allocator, NULL Pad genau zur Wire-Cap (CBR), PCR Pass-Through vom Encoder.

Ein MPTS (PAT/PMT/SDT vom NIF generiert) → UDP-Multicast auf dem Ausgangs-VLAN. Draht ist strikt CBR bei mux.bitrate (NULL-Stuffing).

Zeile 1: ⚠ (Validierungsprobleme) · PNR · Name in einem Rahmen (Farbe = Zustand).

Zeile 2+: min·avg·max kbps · vorhergesagte Komplexität Δ niedrig/mittel/hoch/Spitze · EINGABE VERLOREN · ⚙URL · Encoder Mbps · SID · service_type.

Namensfarbe = Stream-Zustand:

Mbps
 37 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌  <= cap 37,0 Mbit (rot, Draht-CBR-Obergrenze)
    · · · · · · · · · · · · · · · · ·     <= freier Platz = NULL-Padding
    ·· grau · schwarze Punkte · Reserve ··       (ungenutzte Kapazität)
 31 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  <= Headroom 85 % · 31,5 Mbit (orange,
    ▓▓▓▓ JOJ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     Encoder-Ziele liegen hier)
    ▒▒▒▒ Markíza ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ░░░░ TA3 ░░░░░░░░░░░░░░░░░░░░░░░░░░  <= Band anklicken -> Karte erweitern
  0 └──────────────────────────────────
        Zeit ->           10m │ 1h │ 24h     CC0 PCR0 BR0 OVF0

Rote 'Cap'-Linie: Wire CBR Decke (mux.bitrate) – NULL füllt bis hier.

Orange 'Headroom N%'-Linie: = Cap × Headroom-Schieber / 100. Encoder set_bitrate zielt hier hin. Bewegt sich mit dem Schieber.

Grauer Bereich mit schwarzen Punkten zwischen Inhalt und Cap = NULL-Polsterung (unbenutzter Reserve). Mehr Punkte = mehr Reserve.

Klick auf ein Kanal-Farbband → erweitert automatisch die Karte dieses Kanals unten.

Zeitplan

MuxEitAdapter liest Ereignisse aus dem EPG-System pro Dienst, erstellt DVB-EIT-Abschnitte (Name, Zeit, Dauer, Beschreibung, Genre) und paketiert sie auf PID 0x12. Abschnittsversionen erhöhen sich bei EPG-Änderung — der STB holt das Update ab.

EIT wird direkt im NIF-Mux injiziert, gleichmäßig IN den Null-Raum (1 Paket / N Ausgang + p/f periodisch) — ersetzt den bursty externen tsp-Kaskadenansatz. Peak/avg ≈ 1,1, keine Inhaltsauslagerung, Cap hält.

Tabelle 0x4E — das aktuell laufende + nächste Ereignis. Alle ≤2 s injiziert für sofortige 'Jetzt/Weiter'-Aktualität am STB.

Der Mux regeneriert die EIT-.bin aus EPG periodisch (~15 s) — eine EPG-Zeitplanänderung erreicht den Draht ohne Neustart. Der Mux-Header zeigt 'EIT ✓' wenn aktiv.

Tabellen 0x50/0x51 — der vollständige Zeitplan Stunden/Tage voraus (Segmente). Gleichmäßig in den Stream verteilt.

Diff-Anzeige (über dem Chart)

Indikator für echten Fluss vs. Cap. Mitte = Cap (0). Markierung links (grün) = Reserve (Σ Inhalt unter Cap); rechts (rot) = Überlauf. Live, bewegt sich jeden Tick.

-5 Mbps CAP 37000 kbps +5 Mbps

[#### grün = Reserve ####│::: rot = über Cap :::]

^ -3200k

(Σ Inhalt ~3,2 Mbps unter Cap = gesunde Reserve)

Headroom-Schieberegler (78–90 %, Standard 85)

Niedriger (→78): mehr NULL-Reserve, sicherer, weniger straffe Cap-Auslastung.

Höher (→90): straffer Cap-Auslastung, weniger NULL.

⚠ ≥88 %: Schieberegler wird gelb — nahe an der Ring-Overflow-Freeze-Obergrenze. Festklemmen 78–90 (kann 100 nicht erreichen — Schutz gegen eingefrorenes Video).

Asymmetrie: Senken fügt zuverlässig Reserve hinzu; Erhöhen ist begrenzt durch pro-Stream max_bps Sperre (Allocator drückt einen Kanal nicht über sein Max → sicher).

Steuert, wie viel der Cap die Encoder anstreben: Encoder-Ziel = Budget × Headroom % / 100 (orange Linie im Diagramm). Änderungen sind live (Effekt ab dem nächsten 10-ms-Tick), beständig in SystemConfig.

Signalverlust / Kanalausfall (Isolation)

Ein Kanal fällt aus (Encoder-Absturz / Signalverlust) ⇒ der Mux läuft weiter, andere Kanäle unberührt, Draht hält Cap (NULL absorbiert den Ausfall), CC=0 bei Überlebenden. Pro-Eingabe-Ring-Threads sind unabhängig. Der ausgefallene Kanal zeigt einen rot blinkenden Namen + EINGABE VERLOREN-Badge; der Encoder wird überwacht-neugestartet und der Kanal erholt sich selbst.

PCR / Timing

PCR und PES PTS/DTS werden vom Encoder durchgelassen (einzelne Zeitdomäne ⇒ kohärent, kein Drift). Residuales PCR-Jitter ~Zehner ms ist inhärent (10 ms Output-Tick + UDP) – STB/VLC PLL toleriert es, CC=0. Hard DVB-S2 Modulator Compliance ist außerhalb des Geltungsbereichs für den aktuellen IPTV-Anwendungsfall.

CAT — Conditional Access (nur bei Scrambling / ECM).

EIT — Ereignisinformationen (EPG) — aus dem EPG-System, siehe unten.

NIT — Netzwerkinfo (Netzwerk-ID, Name, Transportstrom).

PAT — Programmliste (ordnet PNR → PMT-PID zu).

PMT — pro Programm: Video-/Audio-/PCR-PIDs, Codecs, Deskriptoren.

SDT — Dienstnamen und Anbieter (was der STB in der Liste anzeigt).

TDT/TOT — Datum und Uhrzeit + lokaler Versatz (STB-Uhr).