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


Stream Manager mux koostab mitme SPTS voo üheks CBR MPTS väljundiks (DVB/IPTV). Adaptive Hybrid Statmux ühendab CBR südamiku täite VBR tasakaalustatud kooderijatega püsiva muxi väljundiga.
Kui emamuxi statmux on lubatud, käitub iga FFmpeg kodeerija kaanud-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>. VBV puhver = 2× max annab ~2 s tippude puhvri. Statmux vooga saavad ka deterministliku GOP nihe (-force_key_frames) voo-ID kohta, nii et I-kaadri tipud ei lange üle kanalite.
tsp -I null (∞ NULL paketid @ liini määr) → -P merge tsp -I ip <voog> (ülekatab reaalsed paketid) → -P continuity (langeta alarm) → -P pcradjust --bitrate X (kirjutab PCR-id ümber) → -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 pistikprogramm kiirgab täpselt mux.bitrate bps liinile. Mahajäänud sisendid → NULL-paketid täidavad lünga. --enforce-burst sunnib 7 TS-paketti UDP-datagrammi kohta (1316 B, IPTV standard).
Mux ülemine riba näitab 3 summat värvi olekuga. Reeglid:
Σ avg ≤ 85 % mux.bitrate — keskmise sihtmärgi summa kõikide kanalite ja helil. See on mux 'eelarve'. 15% statistiline reserv kaitseb tipu kokkulangemist. Roheline ≤ 85%, keldri toon ≤ 100%, punane > 100%.
Σ max ≤ 160% mux.bitrate — tipupiiri summa. Lubatud ületada mahtuvust (see ongi statmuxi mõte — tipud harva kattuvad). Roheline ≤ 160%, oranž ≤ 200%, punane > 200%.
Σ min ≤ 50% mux.bitrate — enkooderi alampiiri summa. Ohutu põrand tagab, et vaiksetes stseenides enkooderi ei lange tarbetuult madalale. Roheline ≤ 50%, oranž ≤ 90%, punane > 90%.
Saadaolev eelarve pärast PSI/SI/EIT: ~18.5 Mbps. Σ avg = 4 × 4.0 = 16 Mbps (86% — oranž piiriala, alanda veelgi). Σ max = 4 × 6.0 = 24 Mbps (130% — roheline, OK).
Kui ≥ 10 alarmi 60 sekundis, ilmub Mux kasutajaliideses vilkuva teate, soovitades määra vähendamist. Automaatne tagasiminek ei ole aktiivne — operaator otsustab.
-P bitrate_monitor --periodic 60 --min/max ±5% — häire kui tegelik kiirus kaldub sihtmärgist rohkem kui ±5%. Tähendab, et regulate on näljas (sisend suri).
-P continuity — jälgib TS järjepidevust loendureid. Logib hoiatuse igal mahajäämisel (ülekoormus, FFmpeg jooksulüü, NIC vibratsioon).
-P pcrverify --jitter-max 500000 — DVB lubab PCR vibratsioon ≤ 500 µs. Alarm = pcradjust ei jõua või allikal on katki PCR.
GOP kokkulangevus — kõik enkoodereid kiirgavad I-kaadrid samaaegselt. Parandus: GOP nihe (statmuxi jaoks juba sees, hash(stream_id) mod gop_size).
Sisestuslahtiühendus — üks kanal muutub mustaks, mux jätkab (tänu -I null baasile). Kestus ~3-8 s FFmpeg taaskäivituse jaoks.
Üle-tellimine (püsivad tipud > mahtuvus) — blokkimine/heli köntsumine ~50-200 ms. Parandus: alandage Streami avg 5-10% võrra või eemaldage kanal.
PCR triiv — STB stutter iga paar sekundit. Parandus: pcradjust torujuhtmes (juba seal), vaadake pcrverify alarme.
STB VBV alakoormus — STB kaotab sünkroonimise ja taastab selle (~2-3 s). Parandus: enkooderi bufsize = 2 × maxrate (juba seadistatud), alandage maxrate.
--max-input-packets 4096 / --max-flushed-packets 4096 (sisemine FIFO ≈ 0.3 s @ 19 Mbps). --receive-buffer-size 16777216 (16 MB UDP vastuvõtupuhver). --packet-burst 32 (regulate) / 7 (väljund, IPTV standard). --enforce-burst (iga UDP-datagramm on täpselt 7 paketti).
Ülemine riba märgis `📐 rec X.XM` näitab soovituslikku muxi võimsust, mis tuleneb keskkonnalimiidi teoreem. Sõltumatute VBR vooga summa läheneb normaalsele jaotusele, seega Mux = μ_total + z·σ_total + marginaal. σ_i hinnanguline alates iga sisendi VBR vahemikust (max−min)/4 (eeldades, et vahemik katab ±2σ). Marginaal = 10% μ_total kompenseerida PSI/SI üldkulusid, kodeerija määra-kontrolli vibratsioon ja voolu korrelatsioon, mida puhas CLT alahinnangud.
Märgi värv: 🟢 roheline = piirang ≥ 99.7% soovit · 🟡 oranž = vahemikus 99%–99.7% · 🔴 punane = piirang < 99% · 🔵 sinine = piirang seadistamata.
z-skoor katvuse sihtmärgi järgi: 90% z=1.28 · 95% z=1.65 · 99% z=2.33 · 99.7% z=3.00 (vaikimisi) · 99.99% z=3.72 (ringhäälinguks).
σ_eff = σ_total × statmux_faktor (statmux_factor = 0,7 kui Statmux on SEES, muidu 1,0)
1080p25 HD kanal: avg = 4000-5000 kbps, min = avg × 0.75 (~3000-3750), max = avg × 1.5 (~6000-7500). UI täidab min/max avgist automaatselt. SD: avg = 2000-2500 kbps. UHD: avg = 12000-18000 kbps.
Adaptiivne hübriid Statmux on käitusaegne mehhanism, mis suunab kasutamata mahtuvuse tuumikvoost (kaitstud, täis-VBR) tasakaalustatud voodesse (ohverdatav). 'Hübriid' kuna kaks erinevat kiirusejuhtimise režiimi töötavad kõrvuti; 'adaptiivne' kuna marsruuter hindab olukorda kord sekundis HLS-i ennustuse põhjal.
Mux mahutavus 38 Mbps ┌──────────────────────────────────┐ │█████████████████████░░░░░░░░░░░░│ └──────────────────────────────────┘ ◀── core_max (ennustatud 6 HLS segmendist) ──▶◀── balanced ──▶
Ilma Adaptive Hybrid Statmuxita peate suurust muutma halveimal juhul Σ max. Adaptive Hybrid Statmuxiga saate suurust ümber Σ avg + statistiline puhver (ülekanal korrelatsioon ρ=0,15). Tegelik kasvu ~5 Mbps 38 Mbps muxi peal, või +1 voog sama piiranguga.
Puhas CBR (enkooderi fikseeritud)
VBR ilma Statmuxita
Adaptiivne hübriid Statmux SEES
Kohandatud URL-i sisendiks alistamine ja Statmux välistavad teineteist. Statmux sees olles toetub tasakaalustatud transkoodija kohalikule enkooderi HLS-ile bitikiiruse juhtimiseks. Väline URL möödaks sellest juhtimisahelast.
┌──────────────────────────┐
│ Enkooderi (NVDEC→NVENC) │ ← UDP satelliit
│ /dev/shm/stream_X/h264/ │
└────────────┬─────────────┘
▼
┌──────────────────────────┐
│ ffmpeg-as-mux │
└────────────┬─────────────┘
▼ UDP multisaadeStatistiline kasu tekib ainult siis, kui enkooderitel on lai VBR vahemik — kui max ≈ avg on enkooderi üldjoon CBR ja marsruuteril pole midagi ümber jagada.
Töötav näide — 38 Mbps mux, 10 HD tuumikut + 2 tasakaalustatud:
Vana (CBR-lukustatud): min=2000 avg=3000 max=4000
Soovitatav (lai VBR): min=1500 avg=3000 max=6000
Soovitatav vahemik tuumiku Streami kohta:
• min ≈ avg × 0.5
• avg = nimiväärtus eraldusvõime järgi
• max ≈ avg × 2.0
Vähemalt 1 tasakaalustatud voog — ilma üheta Adaptive Hybrid ruuterile pole midagi tippude ajal kokku suruda, nii et kasvu = 0
Muusikakanavad ja infokanavad on parimad kandidaadid — 90 %+ taluvus määra vähendamisele
Jälgige `[balance-router]` logi kirjetega — näitab core_max, remaining, kihi üleminekuid iga 1 s takti kohta
Kui `core_max > mahutavus` (CORE OVERPEAK hoiatus logis), vähendage tuumiku voogu või alandage enkooderi maxrate
Lisage Streamid muxile (kanali omistamine jääb käsitsi)
Lülita Statmux muxi päisel (kollane kiip). Kui lubatud, lülituvad kõik kooderijad VBR-iks ja taaskäivitavad
Märkige ohverdatavad Streamid parempoolse oranži märkeruuduga — tavaliselt muusika-/infokanavid, kus kiiruse vähendamine on märkamatu
Valmis. Adaptiivne hübriidmarsruuter loeb 6-segmendilist HLS ennustust tuumikuvoost iga 1 s tagant ja vahetab atomaarselt tasakaalustatud sümboollingi HIGH/MED/MIN kihtide vahel
Statmux juhtimisinfoahi
Klassifikatsioon
Sisend
Enkooderi
C1 keerukus
Juhtimisnõel
Streami kaupa
Eraldis
Puhver
NULL täidis
CBR väljund
Eelsöötmine
Tagasiside
Sihtmärk
Andmevoo diagramm
Eraldaja ühendab kaks signaali — ennustuse allikakeerukusest (edasi) ja mõõdetud liini (tagasi). See läheneb ringhäälingu statmuxidele.
C1 mõõdab sisusisu keerukust dekoodersis — mis eelneb enkooderi väljundile torujuhtme latentsuse võrra. Suhteline keerukuse muutus rakendatakse sihtbitikiirusele MÕLEMAS suunas ENNE enkooderi tootmist.
Täpsed Streami kaupa muxist kiirgatavad bitid (saatjapoolsed loendid) kalibreerivad keerukuse → bitikiiruse vastendust.
Streami nõue põhineb sellel, mida enkooderi tegelikult toodab (× tipu reserv). Lihtne kanal ei saa koguda ribalaius, mida ta ei saa kulutada — ta vabastab selle näljasele.
Eesmärk pole võrdne bitikiirus vaid võrdne kvaliteet — pidev surve liigutab bitte kõrgekvaliteedilistelt kanalitelt (madal QP) madala kvaliteediga kanalite poole (kõrge QP).
Kui C1 signaliseerib kanali langust, antakse selle ribalaius teistele samas taktis — nad kiirendavad enne kui langus liinini jõuab.
Kanali kohta kaal = complexity_q12 × max_bps (tegevusstseenid + kõrgem max ⇒ rohkem bitte).
Voo kohta eelarve = ülemaailmne eelarve × kaal / Σkaalud, piirang [min_bps, max_bps], arvutatud iga 10 ms.
Proportsionaalne kogumi eraldamine nõudluse järgi, piiratud [min, max]-ga videoprofiilis; vaba ribalaius läheb näljasele.
Enkooderi sihtmärk = eraldis / kalibreering (Streami EMA mõõdetud/sihtmärgi kohta); lähetamine lävedega (Δ≥3%/1s) ja kaldeniihe tera vastu.
Puhvri-hoidmise servo hoiab järjekorra taset ~1 s (ribas), hädaabistopp ülekoormuse korral; NULL-täidis viib muu CBR-ni.
Liini taseme mõõdikud näitavad tegelikku UDP käitumist pärast kiirgamist
Puhvri täituvus
NULL %
Kiirgamistakt
Reaalajas mux bitikiiruse graafik
Ribad
Piirang
NULL täidis
Langused
Vahemik
Nipp
Piirang
Reserv
Puhver
GOP
VBV
Jaotise päisel on 'kokkumahaamise / laienemise kõik' vahetusmine. Laienda kaarti klõpsates seda või klõpsates selle värviribasid diagrammil. Vasak värvi riba koos märkeruuduga = kanali liikmesus muxi.
OK — voog töötab, bitikiirus normaalne.
Käivitamine — enkooderi käivitumine.
hall + tuhmunud = alla/viga ja märkeruut VÄLJAS (tahtlikult keelatud — häiret pole)
Rike — sisend kadunud / enkooderi krahh.
PSI/SI tabelid, mille NIF mux genereerib
Tabel
PID
Intervall
Allikas
EIT EPG ahel NIF statmux muxis
Seadistage avg realistliku sihtmärgi järgi eraldusvõimele.
Seadistage min ≈ avg × 0.5 (vaiksetel stseenidel lubatav miinimum).
Seadistage max ≈ avg × 2.0 (aktsiooni/spordi tipud).
Kontrollige mux taseme tingimusi: Σavg ≤ 85%, Σmax ≤ 200% mux mahtuvusest.
Etalon-võrdlus näitab erinevust sihttaseme ja mõõdetud liini vahel. Null-erinevus = perfektne kalibreerimine.
Olemas
Erinevus
Sümptom
Parandus
NULL-paketid täidavad vahe ajutiselt
Enkooderi krahh taaskäivitub 3-8 sekundiga
GOP nihe hash(stream_id) mod gop_size abil
GOP kokkulangevus tekitab tipud
pcradjust torujuhtmes
PCR jitter > 500 µs
suurenda SO_RCVBUF; kontrolli NIC katkestusi
UDP puhvri ületäitumine
pcrverify häired — kontrolli torujuhet
Reaaliajal näidiseid pole (mux peatatud või kooderijad ei tööta) — kontrollige muxe ja voo olekut.
SAT UDP SSM ─┐
├─ gst_encoder.py(K1) CBR ─ TCP127 ─┐ ZMQ keerukus
(kanali kohta) ├─ gst_encoder.py(K2) CBR ─ TCP127 ─┤ ▲ │
└─ gst_encoder.py(Kn) CBR ─ TCP127 ─┤ │ ▼
▼ BalanceRouter
┌─────── NIF StatMux ───────┐ │ set_bitrate
│ voo kohta ring (kustuta-vana) │◄─┘
│ 2-passne mahalaadimine (A prioor, V) │
│ proportsinaalne eraldaja: w=keerukus×max │
│ ×headroom% (liugur 78-90) │
│ vananenud väljajätmine (>2s) │
│ NULL pad -> traat piirang CBR │
│ PCR läbivool │
└────────────┬──────────────┘
▼
MPTS UDP multicast (CBR piirang)gst_encoder.py Streami kaupa: SAT UDP SSM sisend → nvh264enc rc-mode=cbr. Bitikiirust juhib BalanceRouter set_bitrate kaudu. Stseeni keerukus (SAD/px) esitatakse ZMQ kaudu eraldajale.
Voo kohta ring (TCP loopback kodeerija), 2-passne mahalaadimine (heli prioriteet, video täis), proportsionaalne eraldaja, NULL pad täpselt traadi piirangule (CBR), PCR läbivool kodeerija.
Üks MPTS (PAT/PMT/SDT genereeritakse NIF poolt) → UDP multisaade väljund-VLANis. Liin on rangelt CBR mux.bitrate väärtusega (NULL täidis).
Rida 1: ⚠ (valideerimisprobleemid) · PNR · nimi raamis (värv = olek).
Rida 2+: min·avg·max kbps · ennustatud keerukus Δ madal/kesk/kõrge/tipp · SISEND KADUNUD · ⚙URL · enkooderi Mbps · SID · service_type.
Olekud
Graafiku ASCII diagramm
Punane 'piirang' joon: juhe CBR lagi (mux.bitrate) — NULL täidet siin.
Oranž 'juurdeandmine N%' rida: = piirang × juurdeandmise liugur / 100. Kodeerija set_bitrate sihtmärgid annavad sellele. Liigub liuguriga.
Hall ala mustade täppidega sisu ja piirangu vahel = NULL täitmine (kasutamata reserv). Rohkem täppe = rohkem reservi.
Klõpsake kanali värviribal → automaatselt laiendab selle kanali kaart allpool.
Genereerimine
Süstimine
P/F
Värskendamine
Ajakava
Mux kasutuse mõõtur näitab kiirgatud sisu, NULL täidist ja sihttaset
Mõõturdiagramm
Bitikiirus 1
Kõrgem (→90): tihedam piirangu kasutamine, vähem NULL.
Bitikiirus 3
Asümmeetria: madaldamine lisab usaldusväärselt reservi; tõstmine piirdub voo kohta max_bps inega (eraldaja ei suruta kanalit üle selle max → turvaline).
Juhtab, kui palju kappist kooderijad sihtmärgiga: kodeerija sihtmärk = eelarve × headroom% / 100 (oranž rida diagrammil). Muudatused reaalajas (efekt järgmisest 10 ms tikust), talletatud SystemConfig.
Eraldatus tagab, et ühe Streami rike ei mõjuta teisi. Iga sisend on omas ringpuhvris; ebaõnnestunud paketid kustutatakse vaikselt.
PCR ja PES PTS/DTS on läbivool kodeerija (ühe kella domeeni ⇒ koherentne, ilma triiveta). Jääkide PCR vibratsioon ~paarikümned ms on sisemised (10 ms väljundi tik + UDP) — STB/VLC PLL talub, CC=0. Kõvaketta DVB-S2 modulaatori vastavus on väljaarvutatud praeguse IPTV kasutuse juhtumi jaoks.
CAT
EIT
NIT
PAT
PMT
SDT
TDT/TOT