TSDuck-based MPEG Transport Stream multiplexer with full PSI/SI support


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.
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.
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.
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).
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 %.
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 %.
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.
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.
--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).
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)
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 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.
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 VBROhne 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
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.
┌─────────────────────────┐
│ 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:1234Statistischer 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)
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
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
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.
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.
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.
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.
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.
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).
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.
Der Ausgang ist ein exakter CBR-Stream beim konfigurierten Cap. Drei Schichten garantieren dies:
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.
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.
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.
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.
Jeder Kanal hat eine stabile Farbe; Dicke = seine momentane Bitrate. Overhead (PSI/EIT) ist grau am unteren Rand, Null-Padding ist strukturiert weiß oben.
Die gestrichelte Linie oben = konfigurierter Cap (Draht-Obergrenze). Inhalt + Null-Padding liegen stets darunter.
Das gepunktete weiße Band oben = Null-Padding (freie Kapazität). Je dünner, desto voller der Draht; es verschwindet bei anspruchsvollem Inhalt.
Rote Markierungen auf der Zeitachse = Sendewarteschlangen-Überlauf (Drop). Null im Dauerbetrieb; Bursts nur beim Start/Flut.
Schaltflächen wechseln das Zeitfenster sofort (clientseitig), das aktive hat grünen Hintergrund. Der Graph sammelt 30 Min. im Browser.
Hover zeigt Kanal-Bitrate, QP und Qualitätsindex zu diesem Zeitpunkt (historischer Wert, nicht live).
Aktueller Pool-Regulierungspegel (pool/(pool−trim)). >100 % = Überdruck (Puffer füllt sich), <100 % = Trimmen.
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.
Der Header zeigt Sendewarteschlangen-Auslastung % und kumulative Drops. Die Schaltfläche 'Drops löschen' setzt den Zähler zurück.
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.
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.
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.
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 (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.
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.
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).
CBR-Draht bei Cap · 1-s-Puffer · pro-Stream proportionale Zuteilung · C1-Lookahead-Feedforward · Qualitätsausgleich · prädiktive Umverteilung · Null-Padding · exaktes Pacing.
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.
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.
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 OVF0Rote '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.
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.
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)
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.
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 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).