×

⊳ Muxer

MPTS · TSDuck · PSI/SI

MPTS-kertoja & adaptiivinen hybridimukauttaja

Stream Manager mux yhdistää useita SPTS-virtoja yhdeksi CBR MPTS -tulokseksi (DVB/IPTV). Adaptiivinen hybridmukauttaja yhdistää CBR-ytimen täyttämisen VBR-tasapainotettujen enkooderin vakiomukauttajatulosteelle.

1. Enkooderikerros (FFmpeg per stream)

Kun päämukauttajalla on statmux käytössä, jokainen FFmpeg-enkooderi toimii kiinni VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>. VBV-puskuri = 2 × max antaa ~2 s huipun puskuri. Statmux-virrat saavat myös determinismin GOP-siirtymän (-force_key_frames) per stream_id niin I-frame-huiput eivät ole yhdenaikaisia kanavien välillä.

2. Mux-kerros (TSDuck tsp -putki)

tsp -I null (∞ NULL-paketit @ line rate) → -P merge tsp -I ip <stream> (peittää todelliset paketit) → -P jatkuvuus (pudotushälytys) → -P pcradjust --bitrate X (uudelleenkirjoittaa PCR:t) → -P pcrverify --jitter-max 500µs → -P bitrate_monitor (nopeus hälytys ±5%) → -P regulate --bitrate X --packet-burst 32 → -O ip <out> --packet-burst 7 --enforce-burst.

3. Tuloskerros (UDP)

regulate-laajennus lähettää täsmälleen mux.bitrate bps:n langalle. Jälkeen jäävät syötteet → NULL-paketit täyttävät tyhjän. Piikkiä ottavat syötteet → sisäinen FIFO-puskuri (4096 pakettia ≈ 0,3 s @ 19 Mbps) absorboi. --enforce-burst pakottaa 7 TS-pakettia per UDP-datagrammi (1316 B, IPTV-standardi).

Suositeltu koko (Σ min / avg / max vs mux.bitrate)

Mux ylärivi näyttää 3 summaa värin tilalla. Säännöt:

Σ avg ≤ 85 % mux.bitrate - keskimääräinen tavoitesumma kaikissa kanavissa ja äänessä. Tämä on mukauttajan 'budjetti'. 15 % tilastollinen varanto suojaa huippujen samanaikaisuutta vastaan. Vihreä ≤ 85 %, amber ≤ 100 %, punainen > 100 %.

Σ max ≤ 160% mux.bitrate — huippurajasumma. Saa ylittää kapasiteetin (siinä on statmuxin pointti — huiput harvoin osuvat yhtaikaa). Vihreä ≤ 160%, keltainen ≤ 200%, punainen > 200% (putoamisia jatkuvalla huipulla).

Σ min ≤ 50% mux.bitrate — enkooderin lattiarajasumma. Turvallinen lattia varmistaa, että hiljaisissa kohtauksissa enkooderi ei laske tarpeettoman alhaiselle laadulle. Vihreä ≤ 50%, keltainen ≤ 90%, punainen > 90%.

Esimerkki: 4 HD-kanavaa 19 Mbps DVB-T mux:ssa

Käytettävissä oleva budjetti PSI/SI/EIT:n jälkeen: ~18,5 Mbps. Σ ka = 4 × 4,0 = 16 Mbps (86% — keltainen raja, laske edelleen). Σ max = 4 × 6,0 = 24 Mbps (130% — vihreä, OK). Σ min = 4 × 3,0 = 12 Mbps (65% — keltainen, OK). Tavoite: ka ~85% budjetista, max ≤ 160%.

Diagnostiikka ja hälytykset

≥ 10 hälytystä 60 sekunnissa vilkkuva ilmoitus näkyy Mux-käyttöliittymässä, joka suosittelee bitnopeuden pienentämistä. Automaattinen takainen päällä EI ole aktiivinen - operaattori päättää.

-P bitrate_monitor --periodic 60 --min/max ±5% — hälytys, jos todellinen nopeus poikkeaa yli ±5% tavoitteesta. Tarkoittaa, että regulate on nälkiintynyt (syöttö kuollut).

-P jatkuvuus - jäljittää TS-jatkuvuus laskurit. Lokaa varoitus jokaisesta pudotuksesta (liian suuri tilaus, FFmpeg-kaatuminen, NIC-värinä).

-P pcrverify --jitter-max 500000 - DVB sallii PCR-värähtelyä ≤ 500 µs. Hälytys = pcradjust ei pidä perässä tai lähde on rikkoutuneet PCR:t.

Hiomot ja niiden syyt

GOP-yhteensattuma — kaikki enkooderiet lähettävät I-kehykset samanaikaisesti, huippuyhteensattuma. Korjaus: GOP-offset (jo käytössä statmuxille, hash(stream_id) mod gop_size).

Tulon signaalin menetys - yksittäinen kanava muuttuu mustaksi, mukauttaja jatkaa (kiitos -I null base). Kesto ~3-8 s FFmpeg-käynnistykselle.

Ylimerkintä (jatkuvat huiput > kapasiteetti) — lohkot/äänen katkeilu ~50–200 ms. Korjaus: laske streamin ka 5–10% tai poista kanava.

PCR-ajautuminen - STB-paikalleen joka muutaman sekunnin välein. Korjaus: pcradjust putkessa (jo siellä), katsele pcrverify-hälytyksiä.

STB VBV-alijuoksu — STB menettää synkronoinnin ja hankkii sen uudelleen (~2–3 s). Korjaus: enkooderin bufsize = 2 × maxrate (jo käytössä), laske maxrate.

tsp-putken parametrit (mux_worker.ex)

--max-input-packets 4096 / --max-flushed-packets 4096 (sisäinen FIFO ≈ 0,3 s @ 19 Mbps). --receive-buffer-size 16777216 (16 MB UDP-vastaanotuspuskuri per syöttö). --packet-burst 32 (regulate) / 7 (lähtö, IPTV-standardi). --enforce-burst (jokainen UDP-datagrammi on täsmälleen 7 pakettia).

Empiirinen kapasiteettilaskenta (CLT)

Ylärivi-merkki `📐 rec X.XM` näyttää suositellun mukauttajan kapasiteetin, joka on johdettu keskiraja-lauseesta. Riippumattomien VBR-virtojen summa lähestyy normaalijakaumaa, joten Mux = μ_total + z·σ_total + marginaali. σ_i arvioidaan jokaisen tulon VBR-alueesta (max−min)/4 (olettaen alueen peittävät ±2σ). Marginaali = 10% μ_total: stä kompensoi PSI/SI yleiskustannukset, enkooderin nopeus-hallinta-tärinä ja virran korrelaatio, jota puhdas CLT aliarvioi.

Merkin väri: 🟢 vihreä = cap ≥ 99,7% suositus (konservatiivinen) · 🟡 keltainen = välillä 99% ja 99,7% · 🔴 punainen = cap < 99% (alimitoitettu, putoamisen riski) · 🔵 sininen = cap asettamatta.

z-arvo kattavuustavoitteen mukaan: 90% z=1,28 · 95% z=1,65 · 99% z=2,33 · 99,7% z=3,00 (oletus) · 99,99% z=3,72 (lähetyslaatu). Merkin vihje listaa kaikki tasot; klikkaaminen soveltaa 99,7% suosituksen mux.bitrate:lle (mux-uudelleenkäynnistys vaaditaan).

σ_eff = σ_total × statmux_factor (statmux_factor = 0,7 kun Statmux on PÄÄLLÄ, muuten 1,0)

Suositellut arvot per kanava (HD H.264)

1080p25 HD-kanava: ka = 4000–5000 kbps, min = ka × 0,75 (~3000–3750), max = ka × 1,5 (~6000–7500). Käyttöliittymä täyttää min/max automaattisesti ka:n jälkeen. Statmux-käyttöliittymä täyttää ka:n automaattisesti streamin transkooderprofiilista. SD-kanava: ka = 2000–2500 kbps. UHD: ka = 12000–18000 kbps.

Adaptiivinen hybridi-Statmux

Adaptiivinen hybridi-Statmux on suoritusaikainen mekanismi, joka siirtää käyttämätöntä kapasiteettia ydinstreameistä (suojattu, täysi VBR) tasapainotettuihin streameihin (uhri). "Hybridi" tarkoittaa, että kaksi eri nopeudensäätöregiimiä toimivat rinnakkain (CBR-ytimen täyttö + VBR-tasapainotettu); "adaptiivinen" tarkoittaa, että reititin arvioi uudelleen kerran sekunnissa HLS-esikatselu-ennusteen perusteella. Operaattori merkitsee streamit tasapainotetuksi oikeanpuoleisen valintaruudun kautta; järjestelmä enkoodaa ne kolmeen tasoon (HIGH/MED/MIN) ja reititin vaihtaa atomisesti symlinkin jäljellä olevan tilauksen perusteella ydinhuippujen ennustamisen jälkeen.

Kapasiteetti - kuinka bitrate jaetaan

Mux-kapasiteetti 38 Mbps
  ┌──────────────────────────────────────────────────────────────────┐
  │█████████████████████████████████████████████████████░░░░░░░░░░░░│
  └──────────────────────────────────────────────────────────────────┘
   ◀────── core_max (ennustettu 6 HLS-segmentistä) ─▶◀── tasapainotettu ──▶

Käytännön voitto (10 virtaa × 3 Mbps keskiarvo, 4 Mbps max)

Ilman adaptiivista hybridimukauttajaa sinun on mitoitettava mukauttaja pahimmalle Σ max:lle. Adaptiivisella hybridimukauttajalla mitoitus tehdään Σ avg + tilastollisen puskurin ympärille (lähetysyhteys ρ=0,15). Todellinen voitto ~5 Mbps 38 Mbps mukauttajassa tai +1 virta samalla ylärajalla.

Puhdas CBR (enkooderi kiinteä)

VBR ilman Statmuxia

Adaptiivinen hybridi-Statmux PÄÄLLÄ

URL ↔ Statmux-eksklusiivisuus

Mukautettu URL-syöttökorvaaja ja Statmux ovat toisiaan poissulkevia. Statmuxin ollessa päällä, tasapainotettu transkooderi luottaa paikallisen enkooderin HLS:ään bitnopeuden hallintaan. Ulkoinen URL ohittaisi tämän hallintasilmukan. Käyttöliittymä pakottaa tämän molempiin suuntiin — valintaruutu lukittuu, kun on ristiriitainen yhdistelmä, ja vihjeessä näkyy mikä stream estää.

Putki (enkooderi → tasapainotettu transkooderi → mux ffmpeg → tsp)

┌─────────────────────────┐
          │  Enkooderi (NVDEC→NVENC)  │ ← UDP-satelliitti
   STREAM │  /dev/shm/stream_X/h264/│
          │  → muxed.m3u8 + segmentit│
          └────────────┬────────────┘
                       │
              ┌────────┴────────┐
              │                 │
        rooli="ydin"       rooli="tasapainotettu"
        (suojattu)         (uhri)
              │                 │
              │                 ▼
              │     ┌───────────────────────────┐
              │     │  BalancedTranscoder       │
              │     │  ffmpeg p1 NVENC VBR      │
              │     │  -maxrate dynaaminen      │ ← Adaptiivinen hybridi-reititin
              │     └───────────────────────────┘

Ydin-VBR min/ka/max mitoittaminen statmuxia varten

Tilastollinen hyöty syntyy vain, kun enkoodereilla on laaja VBR-alue — kun max ≈ ka, enkooderi on käytännössä CBR eikä reitittimellä ole mitään jaettavaa. Konfiguroi `min/ka/max` per stream niin, että Σmax on mukavasti yli mux-cap:n (ylimerkintä = tilaa tilastolliseen hyötyyn), kun taas Σka on mukavasti sen alapuolella.

Laskettu esimerkki — 38 Mbps mux, 10 HD-ydin + 2 tasapainotettu:

Vanha (CBR-lukittu): min=2000 ka=3000 max=4000

Suositeltu (laaja VBR): min=1500 ka=3000 max=6000

Suositellut arvot per ydinstream:

  • min ≈ ka × 0,5 (enkooderi voi laskea hiljaisissa kohtauksissa)
  • ka = nimellinen tavoite resoluution mukaan
  • max ≈ ka × 2,0 (enkooderi voi piikittää toimintakohtauksissa)

Vinkit ja vianmääritys

Vähintään 1 tasapainotettu virta - ilman sitä adaptiivinen hybridi-reititin ei ole mitään murskattavaa huippujen aikana, joten voitto = 0

Musiikki- ja info-kanavat ovat parhaat kandidaatit - 90 %+ sietävyys hinnan pudotukselle

Seuraa `[balance-router]`-lokimerkinnöillä — näyttää `core_max`, `remaining`, tier-siirtymät jokaiselle 1 s tikille

Jos `core_max > capacity` (CORE OVERPEAK -varoitus lokissa), vähennä ydinstream-lukumäärää tai laske enkooderin maxrate

Operaattorin työnkulku

Lisää streamit muxiin (kanavamääritys pysyy manuaalisena)

Vaihda Statmux mukauttaja-otsikossa (keltainen siru). Kun käytössä, kaikki enkooderit vaihtavat VBR:iin ja käynnistyvät uudelleen

Merkitse uhristreatit oikeanpuoleisella oranssilla valintaruudulla — yleensä musiikki-/infokanavia, joissa nopeuden pudottaminen ei näy

Valmis. Adaptiivinen hybridi-reititin lukee 6-segmentin HLS-ennusteen ydinstreameistä joka 1 s ja vaihtaa atomisesti tasapainotetun symlinkin HIGH/MED/MIN-tasovälillä

StatMux — natiivi tilastollinen multipleksointi

The mux runs on a native C NIF (single-host, replaced the old gst_mux.py). Each channel has its own CBR encoder; the NIF demultiplexes them, statistically allocates bitrate by scene complexity, pads with NULL packets to a fixed wire cap, and emits one MPTS UDP multicast. This help describes the current UI: chart, headroom slider, diff gauge, channel cards.

Luokka: suljetun silmukan palautestatmux C1-ennakoinnilla (eteenpäinsyöttö) VBR-enkoodereiden yli — lähetystatmux-periaate, jota ohjataan lähteen monimutkaisuudesta.

Arkkitehtuuri ja tietovuo

Architecture diagram

UDP-multicast SSM, per kanava

Enkoodereet

lähteen monimutkaisuus

Takaisinkytkentä

oma linja / stream

allokointimotiori (Σ ≤ pool)

puskuri

tyhjätäyte → CBR

CBR-johto ylärajalla

ennakoi monimutkainen kohtaus ennen notkahdusta

mitattu johto — kalibrointi

kohde-bittinopeus

Jokainen kanava kulkee omalla linjallaan muxiin (erillinen enkooderi + loopback-yhteys), jossa kaikki yhdistyvät yhdeksi MPTS-multicast-linjaksi tarkasti kiinteällä bittinopeudella. Allokointimotiori on keskeinen aivot (1 GenServer per mux), tik ~0,85 s.

Aivot: palaute + C1-ennakointi

Allokointimotiori yhdistää kaksi signaalia — ennustuksen lähteen monimutkaisuudesta (eteenpäin) ja mitatun johdon (taaksepäin). Tämä lähestyy lähetystatmuxeja, jotka tietävät ruudun hinnan ennen enkoodausta.

C1 mittaa sisällön monimutkaisuuden dekooderissa — mikä johtaa enkooderin lähtöä pipelineviiveellä. Suhteellinen monimutkaisuuden muutos (korrelaatio r≈0,92 bittien kanssa) käytetään kohdebiittinopeuteen MOLEMPIIN suuntiin ENNEN kuin enkooderi tuottaa sen: nouseva kohtaus ennakoidaan (ei notkahdusta), laskeva vapauttaa bittejä aikaisin muille.

Mitattu johto (palaute)

Muxin tarkkaan lähettämät per-stream-bitit (lähetyspuolen laskurit) kalibroivat monimutkaisuuden → bittinopeus-yhdistämisen ja pitävät summan tarkasti poolissa. Totuuden pohja-ankkuri — C1-ennustus ei ole täydellinen (r 0,92), loppupäässä oleva johto korjaa sen.

Toimitettavuus

Streamin vaatimus perustuu siihen, mitä enkooderi todella tuottaa (× piikin otsaketila). Helppo kanava ei voi hamstrata kaistanleveyttä, jota se ei käytä — se vapauttaa sen nälkäisille.

Tasapainotettu laatu

Tavoitteena ei ole tasavertainen bittinopeus vaan tasavertainen laatu — jatkuva paine siirtää bittejä korkealaatuisilta kanavilta (matala QP) matalan laadun kanaville (korkea QP).

Ennakoiva uudelleenjakelu

Kun C1 ilmoittaa kanavan laskusta, sen kaistanleveys siirretään muille samassa tikissä — ne nopeuttavat ennen kuin lasku todella saavuttaa johdon.

Per-kanava paino = complexity_q12 × max_bps (toimintakohtaus + suurempi max ⇒ enemmän bittejä).

Per-virran budjetti = globaali budjetti × paino / Σpainot, kiinnitetty [min_bps, max_bps], laskettu uudelleen joka 10 ms.

×headroom % (slider) on the encoder target → Σ real encoder < wire cap ⇒ rings drain empty ⇒ clean video.

Stale-exclusion: a dead input (no receive > 2 s) is dropped from the splitter — its share goes to live channels, not wasted; re-included automatically on recovery.

NULL pad fills the difference to the wire cap (strictly CBR). Encoder feedback: ZMQ complexity → BalanceRouter → set_bitrate.

CBR-johto: puskuri + tyhjätäyte + tahdistus

Lähtö on tarkka CBR-stream konfiguroituun ylärajaan. Kolme kerrosta takaavat sen:

Pysyvä puskuri ~1 s

Lähetysjono pitää pysyvän tason ~1 s johtoa, joka absorboi sub-sekunnin GOP-notkahdukset (I-ruutujen välillä). Tallenteesta todennettu: 0,5–1 s absorboi 88–91% notkahduksista.

Tyhjätäyte

Kun sisältö on ylärajan alapuolella, ero täytetään MPEG-TS-tyhjäpaketeilla (PID 0x1FFF). Johto siis AINA saavuttaa ylärajan — DVB-yhteensopiva.

Tarkka tahdistus

Egress tahdistetaan tarkasti ylärajaan (busy-spin ABSTIME); 12 ms:n velkarajoitin estää kiinnikuromisen purkaantumiset lyhyen pysähtymisen jälkeen → ei PCR-jitausta, ei yli-ylärajan piikkejä.

Bitrate chart (main)

Stacked area — each channel has its colour (matching its card below). Σ of all + NULL pad = wire cap. Switch the time window 10m / 1h / 24h; pills next to it = event counts (CC / PCR / BR / OVF) for the selected window.

Väritetyt kaistat

Jokaisella kanavalla on vakaa väri; paksuus = sen hetkinen bittinopeus. Yläkuorma (PSI/EIT) on harmaa alhaalla, tyhjätäyte on teksturoitu valkoinen päällä.

Yläraja / Maks-viiva

Katkoviiva ylhäällä = konfiguroitu yläraja (johdon katto). Sisältö + tyhjätäyte pysyvät aina sen alapuolella.

Tyhjäkaista

Pisteviiva valkoinen kaista päällä = tyhjätäyte (vapaa kapasiteetti). Mitä ohuempi se on, sitä täydempänä johto on; se katoaa vaativalla sisällöllä.

Pudotusmerkit

Punaiset merkit aikajanalla = lähetysjonon ylivuoto (pudotus). Nolla vakiotilassa; purkaantumiset vain käynnistyksen/tulvan aikana.

Aikaväli (30s–30m)

Painikkeet vaihtavat aikaikkuna välittömästi (asiakaspuoli), aktiivisella on harmaa tausta. Kaavio kerää 30 min selaimeen.

Vihje

Vie hiiri päälle nähdäksesi per-kanavan bittinopeus, QP ja laatuindeksi kyseisellä hetkellä (historiallinen arvo, ei live).

yläraja %

Nykyinen poolin sääntelytaso (pool/(pool−trim)). >100% = ylipaine (täyttää puskurin), <100% = leikataan.

Reservi (liukusäädin)

Toleranssikaista ylärajan yläpuolella — kuinka paljon pidetään tyhjäreservinä. 0 = täytä tasan N:ään; positiivinen = suurempi reservi (turvallisempi); negatiivinen = lievä ylitäyttö.

Puskuri (pudotukset)

Otsikko näyttää lähetysjonon käyttöprosentin ja kumulatiiviset pudotukset. 'Tyhjennä pudotukset' -painike nollaa laskurin.

GOP

Yhteinen GOP-pituus kaikille mux-kanaville (lukittu video-profiileihin käynnistyksessä). Seinä-hajoitus levittää I-ruutuja ajallisesti niin, etteivät ne törmää.

VBV

Enkooderin VBV-puskurin koko (ms). Pienempi tasoittaa I-ruutuja (hyvä liikekanaville), suurempi antaa yksityiskohtaisemman I-ruudun. Oletus 850; per-stream-ohitus mahdollinen.

Channel cards (Programs)

Osion otsikossa on 'Tiivistä / Laajenna kaikki' -kytkin. Laajenna kortti napsauttamalla sitä tai napsauttamalla sen värijuovaa kaaviossa. Vasemmalla värillä nauha valintaruudulla = kanavan jäsenyys mukauttajassa.

dark = running OK

orange = starting / restarting

harmaa + himmetty = alas/virhe ja valintaruutu POIS (tarkoituksella poistettu käytöstä - ei hälytystä)

red + BLINKING = FAULT — channel is in the mux (checkbox ON) but the stream is down/error

PSI/SI-taulut (täydellinen DVB-setti)

StatMux tuottaa koko pakolliset MPEG-TS / DVB-taulut suoraan NIF-muxissa — ei ulkoista SI-inserteriä. Taulut ajoitetaan tasaisesti streamiin, jotta STB hankkii PSI/SI:n nopeasti jälleenvirityksen jälkeen.

Taulu

PID

Väli

Tarkoitus / lähde

EIT ↔ EPG: täydellinen integraatio

EIT (Event Information Table, PID 0x12) ei ole staattinen — se on täysin kytketty sovelluksen EPG-järjestelmään. Operaattori määrittää jokaiselle mux-kanavalle EPG-palvelun (eit_epg_service_id), ja mux tuottaa live EIT:n aikatauluetuihin tapahtumista.

Mitoitus / suositukset

mux.bitrate = wire CBR cap (typ. 37 Mbps for 12 SD/HD channels).

Σ avg ≲ cap (comfortable target) · Σ max oversubscribed 1.5–2× cap (that is the point of statmux — peaks rarely coincide) · Σ min = worst-case floor.

Set per-stream min/avg/max in Stream → Transcoder profile (auto-syncs to mux_input). Action/sport 8–10 M, news/talking head 1–2 M, min never < 800 k.

The headroom slider is a quick live lever of reserve vs. tightness — no restart.

Suhde lähetystatmuxeihin

Teemme todellista tilastollista multipleksointia — dynaaminen bittien uudelleenjako VBR-kanavien välillä, jotka jakavat kiinteän johdon, laaduntasauksella. Mekaanisesti olemme lähellä ammattimaisia headend-statmuxeja (ylärajan kohdistus, 1 s puskuri, tyhjätäyte, GOP/B-ruudut, lattia-ohitus).

Mitä meillä on

CBR-johto ylärajalla · 1 s puskuri · per-stream proportionaalinen allokaatio · C1-ennakointi eteenpäinsyöttö · laaduntasaus · ennakoiva uudelleenjakelu · tyhjätäyte · tarkka tahdistus.

Missä poikkeamme

Lähetysstatmux käyttää enkooderin rate-distortion-arviota (tarkka ruutukustannus, enkooderi on allokaattorin orja). Me käytämme C1-lähdön monimutkaisuutta (r≈0,92) + VBR-enkooderia, joka valitsee oman QP:nsä — laitteiston rajoitus, ei suunnittelun. Luokka: palaute + ennakointi puhtaan eteenpäinsyötön sijaan.

Vianmääritys

Oire

Syy / korjaus

Channel red and blinking

In the mux (checkbox ON) but stream down/error → check the source/encoder of that stream. Self-recovers once restored.

Lots of NULL / large grey area

Calm content or low headroom — normal (statmux gain). For tighter utilization raise the headroom slider or per-stream max_bps.

Picture freezes / glitches

Headroom too high (rings not draining) → lower the slider to 80–82 %. Watch the diff gauge / NULL.

After restart streams=0 / all NULL

Mux started before the encoders — self-heal automatically reaches 12 within ~30 s (1 s tick retry). No manual action.

Diff gauge stuck at 0 / chart empty

Ei live-näytteitä (mukauttaja pysäytetty tai enkooderit eivät toimi) - tarkista sekä mukauttaja että virran tila.

Arkkitehtuuri (alusta loppuun)

SAT UDP SSM ─┐
             ├─ gst_encoder.py(K1)  CBR ─ TCP127 ─┐        ZMQ monimutkaisuus
   (per      ├─ gst_encoder.py(K2)  CBR ─ TCP127 ─┤            ▲   │
   chan)     └─ gst_encoder.py(Kn)  CBR ─ TCP127 ─┤            │   ▼
                                                  ▼     BalanceRouter
                                   ┌─────── NIF StatMux ───────┐  │ set_bitrate
                                   │ per-input ring (drop-old) │◄─┘
                                   │ 2-pass drain (A prio, V)  │
                                   │ allocator: w=cmplx×max    │
                                   │ ×headroom% (slider 78-90) │
                                   │ stale-exclusion (>2s)     │
                                   │ NULL pad -> wire cap CBR  │
                                   │ PCR pass-through          │
                                   └────────────┬──────────────┘
                                                ▼
                                   MPTS  UDP multicast (CBR cap)

gst_encoder.py per stream: SAT UDP SSM -syöttö → nvh264enc rc-mode=cbr. Bitnopeus ohjataan BalanceRouterin kautta set_bitrate:lla. Kohtauksen monimutkaisuus (SAD/px) raportoidaan ZMQ:n kautta allokattorille.

Per-tulo-rengas (TCP loopback enkooderista), 2-pass-tyhjennys (ääni prioriteetti, video täyttö), suhteellinen jakaja, NULL pad tarkalleen langan ylärajaan (CBR), PCR pass-through enkooderista.

Yksi MPTS (NIF:n luoma PAT/PMT/SDT) → UDP multicast lähtö-VLAN:lle. Lanka on tiukasti CBR mux.bitrate:lla (NULL-täyttö).

Rivi 1: ⚠ (validointiongelmat) · PNR · nimi kehyksessä (väri = tila).

Rivi 2+: min·ka·max kbps · ennustettu monimutkaisuus Δ matala/keski/korkea/huippu · SYÖTTÖ MENETETTY · ⚙URL · enkooderi Mbps · SID · service_type.

Nimen väri = streamin tila:

Mbps

37 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ <= cap 37,0 Mbit (punainen)

· · · · · · · · · · · · · · · · · <= vapaa tila = NULL-täyttö

31 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ <= puskuri 85%

Punainen 'ylärajaa' rivi: langan CBR katto (mux.bitrate) - NULL täyttää tähän.

Oranssi 'puskuri N%' viiva: = cap × headroom-liukusäädin / 100. Enkooderi set_bitrate tavoittelee täältä. Liikkuu liukusäätimen kanssa.

Harmaa alue mustine pisteineen sisällön ja ylärajan välissä = NULL-täyte (käyttämätön varanto). Lisää pisteitä = enemmän varantoa.

Napsauta kanavan värijuovaa → automaattisesti laajennetaan kyseisen kanavan korttia alla.

Aikataulu

MuxEitAdapter lukee tapahtumat EPG-järjestelmästä per palvelu, rakentaa DVB EIT -osiot (nimi, aika, kesto, kuvaus, genre) ja paketoi ne PID 0x12:lle. Osioversiot kasvavat EPG-muutoksella — STB hakee päivityksen.

EIT injektoidaan suoraan NIF-muxissa, tasaisesti tyhjätilaan (1 paketti / N lähtö + p/f säännöllisesti) — korvaten purkaantuvan ulkoisen tsp-kaskadin. Huippu/avg ≈ 1,1, ei sisällön häätöä, yläraja pysyy.

Taulu 0x4E — parhaillaan käynnissä oleva + seuraava tapahtuma. Injektoidaan ≤2 s välein välittömän 'nyt/seuraava' tiedon varmistamiseksi STB:lle.

Mux regeneroi säännöllisesti EIT .bin -tiedoston EPG:stä (~15 s) — EPG-aikataulumuutos saavuttaa johdon ilman uudelleenkäynnistystä. Mux-otsikko näyttää 'EIT ✓' kun aktiivinen.

Taulut 0x50/0x51 — täydellinen aikataulu tunteja/päiviä eteenpäin (segmentit). Levitetty tasaisesti streamiin.

Diff-mittari (kaavion yläpuolella)

Todellisen virtauksen vs. cap:n indikaattori. Keskikohta = cap (0). Merkki vasemmalla (vihreä) = varaus (Σ sisältö cap:n alapuolella); oikealla (punainen) = ylivuoto. Live, päivittyy joka tikki.

-5 Mbps CAP 37000 kbps +5 Mbps

[#### vihreä = varaus ####|::: punainen = yli cap :::]

^ -3200k

Puskurisäädin (78–90%, oletus 85)

Alempi (→78): enemmän NULL-varausta, turvallisempi, vähemmän tiukka cap-käyttö.

Korkeampi (→90): tiukempi ylärajautilisaatio, vähemmän NULL.

⚠ ≥88%: liukusäädin muuttuu keltaiseksi — lähellä rengasylivuodon jäätymisrajaa. Kova rajaus 78–90 (ei voi saavuttaa 100 — suoja jäätynyttä videota vastaan).

Epäsymmetria: alentaminen lisää luotettavasti varantoa; nostaminen on rajoitettu per-virran max_bps kiinnityksellä (jakaja ei työnnä kanavaa yli max → turvallinen).

Ohjaa kuinka paljon ylärajan enkoodit tavoittelee: enkooderi tavoite = budjetti × headroom% / 100 (oranssi viiva kaaviossa). Muuttuu live (vaikutus seuraavasta 10 ms tikistä), pysyy SystemConfig:ssa.

Signaalin menetys / kanavan vika (eristys)

Yksi kanava vioittuu (enkooderirjautuminen / signaalin menetys) ⇒ mux jatkaa toimintaa, muut kanavat eivät vaikutu, lanka pitää cap:n (NULL absorboi käyttökatkon), CC=0 selviytyneillä. Per-syöttö-rengassäikeet ovat itsenäisiä. Viallinen kanava näyttää punaisen vilkkuvan nimen + SYÖTTÖ MENETETTY -merkin; enkooderi käynnistetään uudelleen valvomalla ja kanava toipuu itsestään.

PCR / ajoitus

PCR ja PES PTS/DTS ovat pass-through enkooderista (yksittäinen kelloalue ⇒ johdonmukainen, ei ajautumista). Jäänös PCR-värähtelyä ~kymmeniä ms on sisäinen (10 ms tulosytösin + UDP) - STB/VLC PLL hyväksyy sen, CC=0. Kova DVB-S2-modulaattorin vaatimuksenmukaisuus on nykyisen IPTV-käyttötapauksen soveltamisalaa.

CAT — ehdollinen pääsy (vain sekoittamisen / ECM:n yhteydessä).

EIT — tapahtumatiedot (EPG) — EPG-järjestelmästä, ks. alla.

NIT — verkkoinfo (verkko-ID, nimi, transport stream).

PAT — ohjelmaluettelo (yhdistää PNR:n → PMT-PID).

PMT — per ohjelma: video/ääni/PCR-PID:t, koodekit, kuvaajat.

SDT — palvelunimet ja palveluntarjoajat (mitä STB näyttää luettelossa).

TDT/TOT — aika ja päiväys + paikallinen siirtymä (STB-kello).