Muxer — Statistical Multiplex

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

MPTS multipleksers un Adaptive Hybrid Statmux

Stream Manager Mux apvieno vairākus SPTS Stream vienā CBR MPTS izejā (DVB/IPTV). Adaptive Hybrid Statmux apvieno CBR pamata aizpildījumu ar VBR balansētajiem enkoderiem.

1. Enkodeŗa slānis (FFmpeg uz vienu Stream)

Kad Mux ir iespējots Statmux, katrs FFmpeg enkoderis darbojas capped-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>. VBV buferis = 2× max nodrošina ~2 s virsotnes galvenes vietu.

2. Mux slānis (TSDuck tsp cauruļvads)

tsp -I null → -P merge tsp -I ip <stream> → -P continuity → -P pcradjust → -P pcrverify --jitter-max 500µs → -P bitrate_monitor ±5% → -P regulate → -O ip <out> --packet-burst 7 --enforce-burst.

3. Izejas slānis (UDP)

Regulate emitē tieši mux.bitrate bps tīklā. Ievades atpaliek → NULL paketes aizpilda iztrūkumu. --enforce-burst nodrošina 7 TS paketes uz UDP datagramu (1316 B, IPTV standarts).

Ieteicamā dimensionēšana (Σ min / avg / max vs mux.bitrate)

Mux augšā josla rāda 3 summas ar krāsu statusu. Noteikumi:

Σ avg ≤ 85 % mux.bitrate — vidējā mērķa summa visos kanālos plus audio. 15 % rezerve aizsargā pret virsotņu sakritību. Zaļš ≤ 85 %, dzeltens ≤ 100 %, sarkans > 100 %.

Σ max ≤ 160 % mux.bitrate — virsotnes griestumu summa. Atļauts pārsniegt kapacitāti (tas ir Statmux mērķis). Zaļš ≤ 160 %, dzeltens ≤ 200 %, sarkans > 200 %.

Σ min ≤ 50 % mux.bitrate — enkodeŗa grīdas summa. Droša grīda nodrošina pamata kvalitāti klusās ainās. Zaļš ≤ 50 %, dzeltens ≤ 90 %, sarkans > 90 %.

Piemērs: 4 HD kanāli 19 Mbps DVB-T Mux

Pieejamais budžets pēc PSI/SI/EIT: ~18.5 Mbps. Σ avg = 4 × 4.0 = 16 Mbps (86 %). Σ max = 4 × 6.0 = 24 Mbps (130 % — zaļš). Σ min = 4 × 3.0 = 12 Mbps (65 % — dzeltens). Mērķis: avg ~85 % budžeta, max ≤ 160 %.

Diagnostika un brīdinājumi

Ja ≥ 10 brīdinājumu 60 s laikā, Mux saskarnē parādās paziņojums ar ieteikumu samazināt biterāti. Auto-atpakaļiedarbība NAV aktīva.

-P bitrate_monitor --periodic 60 --min/max ±5% — brīdinājums, ja faktiskā biterāte novirzās par ±5% no mērķa.

-P continuity — seko TS continuity counters. Brīdinājums katram dropout (pārslogojums, FFmpeg avārija, NIC jitter).

-P pcrverify --jitter-max 500000 — DVB ļauj PCR jitter ≤ 500 µs. Brīdinājums = pcradjust nevar tikt galā.

Traucējumi un to cēloņi

GOP sakritība — visi enkoderi vienlaikus emitē I-frames. Labojums: GOP nobīde (hash(stream_id) mod gop_size).

Ievades signāla zaudēšana — viens kanāls kļūst melns, Mux turpina. Ilgums ~3-8 s FFmpeg restartam.

Pārslogojums (ilgstošas virsotnes > kapacitāte) — bloki/audio šalts ~50-200 ms. Labojums: samazināt avg par 5-10 %.

PCR drift — STB šalts ik pēc sekundēm. Labojums: pcradjust cauruļvadā (jau ir), skatīt pcrverify.

STB VBV underrun — STB zaudē sinhronizāciju (~2-3 s). Labojums: enkodeŗa bufsize = 2 × maxrate.

tsp cauruļvada parametri (mux_worker.ex)

--max-input-packets 4096 (FIFO ≈ 0.3 s @ 19 Mbps). --receive-buffer-size 16777216 (16 MB UDP). --packet-burst 32 (regulate) / 7 (izeja). --enforce-burst (katra UDP = tieši 7 paketes).

Empīriskais kapacitātes aprēķins (CLT)

Nozīmīte `📐 rec X.XM` rāda ieteicamo Mux kapacitāti (centrālā robežteorēma). Mux = μ_total + z·σ_total + rezerve. σ_i = (max−min)/4. Rezerve = 10% no μ_total.

Nozīmītes krāsa: 🟢 zaļa = cap ≥ 99.7% rec · 🟡 dzeltena = 99–99.7% · 🔴 sarkana = cap < 99% · 🔵 zila = cap nav.

z-vērtība: 90% z=1.28 · 95% z=1.65 · 99% z=2.33 · 99.7% z=3.00 (nokl.) · 99.99% z=3.72.

σ_eff = σ_total × statmux_factor (statmux_factor = 0.7, kad Statmux ieslēgts, citādi 1.0)

Ieteicamās vērtības uz kanālu (HD H.264)

1080p25 HD: avg = 4000-5000 kbps, min = avg × 0.75, max = avg × 1.5. SD: avg = 2000-2500 kbps. UHD: avg = 12000-18000 kbps.

Adaptīvs hibrīds Statmux

Adaptive Hybrid Statmux pārceļ neizmantoto kapacitāti no pamata Stream (aizsargāti, VBR) uz balansētajiem (upurināmie). Maršrutētājs pārvērtē reizi sekundē.

Kapacitāte — kā biterāte tiek sadalīta

Mux kapacitāte 38 Mbps

┌──────────────────────────────────────────┐

│ Pamata Stream (VBR aizsargāts) │ Balansēts │

└──────────────────────────────────────────┘

Praktiskais ieguvums (10 Stream × 3 Mbps avg, 4 Mbps max)

Bez Adaptive Hybrid Statmux Mux jādimensionē sliktākajam Σ max. Ar Statmux — ap Σ avg + statistiskais buferis. Reālais ieguvums ~5 Mbps uz 38 Mbps Mux.

Tīrs CBR (enkoderis fiksēts)

VBR bez Statmux

Adaptive Hybrid Statmux ieslēgts

URL ↔ Statmux savstarpējā izslēgšana

Pielāgots URL un Statmux ir savstarpēji izslēdzoši. Ar ieslēgtu Statmux balansētais transkoderis paļaujas uz lokālā enkodeŗa HLS biterātes vadībai.

Cauruļvads (enkoderis → balansētais transkoderis → Mux FFmpeg → tsp)

Enkoderis (NVDEC→NVENC) ← VBR → HLS → Balansētais transkoderis → UDP → Mux (tsp cauruļvads)

Pamata VBR min/avg/max dimensionēšana Statmux

Statistiskais ieguvums notiek tikai ar plašu VBR diapazonu — kad max ≈ avg enkoderis ir CBR un maršrutētājam nav ko pārdalīt.

Izstrādāts piemērs — 38 Mbps Mux, 10 HD pamata + 2 balansēti:

Ieteicamais diapazons uz pamata Stream:

Padomi un problēmu novēršana

Vismaz 1 balansēts Stream — bez tā maršrutētājam nav ko samazināt virsotņu laikā.

Mūzikas un info kanāli ir labākie kandidāti — tolerance pret biterātes samazināšanu 90%+.

Sekojiet caur `[balance-router]` žurnāla ierakstiem — rāda `core_max`, `remaining`, tier pārejas.

Ja `core_max > capacity` (CORE OVERPEAK žurnālā), samazināt pamata Stream skaitu vai maxrate.

Operatora darbplūsma

Pievienot Stream Mux (kanālu piešķiršana paliek manuāla).

Ieslēgt Statmux Mux galvenē (dzeltenais chips). Visi enkoderi pāriet uz VBR un restartējas.

Atzīmēt upurināmos Stream ar oranžo izvēles rūtiņu — parasti mūzikas/info kanāli.

Gatavs. Maršrutētājs nolasa 6-segmentu HLS prognozi katru 1 s un atomāri maina tier (HIGH/MED/MIN).

StatMux — natīvā statistiskā multipleksēšana

Vairāki mainīgās biterātes kanāli dalās vienā fiksētā transporta plūsmā (MPTS). Biterāte tiek dinamiski pārdalīta starp kanāliem.

Klase: slēgta kontūra atgriezeniskā saite StatMux ar C1 priekšredzēšanu (feedforward) pār VBR enkoderiem.

Arhitektūra un datu plūsma

Architecture diagram

UDP multicast SSM, uz kanālu

Enkoderi

avota sarežģītība

Atgriezeniskā saite

savs ceļš / Stream

sadalītājs (Σ ≤ baseins)

buferis

null aizpildījums → CBR

CBR vads pie cap

paredzēt sarežģītu ainu pirms krituma

izmērīts vads — kalibrācija

mērķa biterāte

Katrs kanāls darbojas uz sava ceļa līdz Mux (atsevišķs enkoderis + loopback savienojums), dalās vienā cauruļvadā.

Smadzenes: atgriezeniskā saite + C1 priekšredzēšana

Sadalītājs apvieno divus signālus — prognozi no avota sarežģītības (uz priekšu) un izmērītu vadu (atgriezeniskā saite).

C1 mēra satura sarežģītību dekoderī pirms enkodeŗa izejas.

Izmērīts vads (atgriezeniskā saite)

Precīzi izmērīti bitos uz Stream (sūtītāja skaitītāji) kalibrē sarežģītību→biterātes koeficientu.

Piegādājamība

Kanāla prasība ir pamatota ar enkodeŗa faktiski saražoto (× virsotnes galvenes vieta).

Izlīdzināta kvalitāte

Mērķis nav vienāda biterāte, bet vienāda kvalitāte — bitus pārviet no augstiem QP uz zemiem.

Prognozēšana

Kad C1 signalizē kanāla samazinājumu, tā platjoslas savienojums tiek nodots citiem tajā pašā taktī.

Baseins = cap N − pieskaitāmās izmaksas (PSI/EIT) − audio − rezerve. Mērīts no vada.

Pieprasījums uz Stream = piegādājamais vads × C1 priekšredzēšana + kvalitātes indekss.

Proporcionāla baseina sadale pēc pieprasījuma, fiksēta [min, max] no video profila.

Enkodeŗa mērķis = alloc / kalibrācija; nosūtīts ar aizkavēšanos.

Bufera servo uztur rindu ~1 s (josla), avārijas backstop pārslogojuma gadījumā.

CBR vads: buferis + null aizpildījums + pacing

Izeja ir precīza CBR plūsma pie konfigurētā cap. Trīs slāņi to garantē:

Pastāvīgais buferis ~1 s

Sūtīšanas rinda uztur ~1 s vada krājumus, kas absorbē sub-sekundes GOP kritumu.

Null aizpildījums

Kad saturs ir zem cap, starpību aizpilda MPEG-TS null paketes (PID 0x1FFF).

Precīzs pacing

Izeja tiek paced tieši pie cap (busy-spin ABSTIME); 12 ms parāda skavas novērš noķeršanu.

Izejas diagramma (upe)

Dzīvs kaudzinātais grafiks no reālā vada — katrs josls ir viens kanāls.

Krāsu joslas

Katram kanālam ir stabila krāsa; biezums = tā momentānā biterāte.

Cap / Maks līnija

Pārrautā līnija augšā = konfigurētais cap (vada griesti). Saturs + null aizpildījums kopā = cap.

Null josla

Baltā punktētā josla augšā = null aizpildījums (brīvā kapacitāte). Jo plānāka, jo pilnāka.

Dropout atzīmējumi

Sarkani atzīmējumi = sūtīšanas rindas pārpilde (dropout). Nullē stabilā stāvoklī; sprādzieni tikai pārslogojumā.

Diapazons (30s–30m)

Pogas maina laika logu uzreiz (klienta pusē), aktīvajai ir pelēks fons.

Padoms

Pavirzot kursoru — kanāla biterāte, QP un kvalitātes indekss tajā brīdī.

kap %

Pašreizējais baseina regulācijas līmenis (pool/(pool−trim)). >100% = pārspiede (bufera aizpildīšana).

Rezerve (slīdnis)

Tolerances josla virs cap — cik saglabāt kā null rezervi. 0 = aizpildīt tieši N; pozitīvs = saglabāt rezervi.

Buferis (dropouts)

Galvene rāda sūtīšanas rindas izmantojumu % un kumulatīvos dropouts. 'Dzēst dropouts' atjauno skaitītāju.

GOP

Kopīgais GOP garums visiem kanāliem Mux (bloķēts video profilos startā). GOP uzglabā sienas pulksteņa sinhronizāciju I-frames visiem kanāliem.

VBV

Enkodeŗa VBV bufera lielums (ms). Mazāks izlīdzina I-frames (labs kustīgiem kanāliem), lielāks = labāks virsotņu absorbēšanas spēks.

Stream kartes un stāvokļi

Katram kanālam Mux ir karte ar nosaukumu, PNR, pašreizējo un mērķa biterāti.

Darbojas — kanāls kodē un plūst uz vadu.

Startē — enkoderis startē / stabalizējas.

Izslēgts — kanāls ir Mux bet nedarbojas (0 kbps).

Kļūda — ievade zaudēta / enkoderis avarēja.

PSI/SI tabulas (pilns DVB komplekts)

StatMux ģenerē pilnu obligāto MPEG-TS / DVB tabulu kopu tieši NIF Mux.

Tabula

PID

Intervāls

Mērķis / avots

EIT ↔ EPG: pilna integrācija

EIT (Event Information Table, PID 0x12) nav statisks — tas ir pilnībā savienots ar lietojumprogrammu EPG sistēmu.

Kanālu dimensionēšana (min / avg / max)

min = apakšējā grīda (statiskā aina). Ieteicams avg × 0.5–0.75.

avg = mērķa līmenis. Σ avg visiem kanāliem ≈ video baseins (cap − pieskaitāmās izmaksas − audio).

max = griesti (VBR galvenes vieta virsotnēm). Ieteicams avg × 1.5.

Piemēri (avg): SD 1.5–2.5M · HD 2.5–4M · FHD 4–6M · UHD 12–18M.

Saistība ar broadkasta statmuxiem

Mēs darām reālu statistisko multipleksēšanu — dinamisku bitu pārdali starp VBR kanāliem, kas dalās vienā transportā.

Kas mums ir

CBR vads pie cap · 1 s buferis · proporcionāla sadale · C1 priekšredzēšana · wire-feedback kalibrācija.

Kur mēs atšķiramies

Broadkasta StatMux izmanto enkodeŗa rate-distortion novērtējumu. Mēs izmantojam C1 sarežģītību.

Problēmu novēršana

Simptoms

Cēlonis / Labojums

Robi / null virsotnes (5–7M) diagrammā

Satura kritumi — vai nu GOP starp I-frames vai kolektīvs kritums.

Dropouts > 0 aug

Sūtīšanas rinda pārpildās — saturs virs cap. Pārbaudīt rezervi (slīdnis).

Viens kanāls paliek zemā biterātē / augstā QP

Vai nu statisks saturs (pareizi) vai pārāk zems max profilā.

Diagramma ir traucēta / kreisā mala tiek dzēsta

Klienta puse — cieta atsvaidzināšana (Ctrl+Shift+R).

cap % / buferis nemainās pēc rediģēšanas

LiveView pārrenderēšana — cieta atsvaidzināšana. Vērtības atjaunojas reizi sekundē.

Arhitektūra (no gala līdz galam)

SAT UDP SSM ─┐

├─ gst_encoder.py(K1) CBR ─ TCP127 ─┐ ZMQ sarežģītība

└─ ... └─ StatMux NIF → UDP izeja

gst_encoder.py uz Stream: SAT UDP SSM ievade → nvh264enc rc-mode=cbr. Biterāti vada StatMux.

Uz ievadi gredzens (TCP loopback no enkodeŗa), 2 posmu notece (audio prioritāte, video pilnīga).

Viens MPTS (PAT/PMT/SDT ģenerē NIF) → UDP multicast izejā.

1. rinda: ⚠ (validācijas problēmas) · PNR · nosaukums rāmī (krāsa = stāvoklis).

2.+ rinda: min·avg·max kbps · prognozētā sarežģītība · IEVADE ZAUDĒTA · ⚙URL.

Nosaukuma krāsa = Stream stāvoklis:

Mbps

37 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ <= cap

▓▓▓▒▒▒░░░███ ← kanāli

0

Sarkanā 'cap' līnija: vada CBR griesti (mux.bitrate) — NULL aizpilda līdz šeit.

Oranžā 'headroom N%' līnija: = cap × headroom slīdnis / 100.

Pelēkā zona starp saturu un cap = NULL aizpildījums (neizmantotā rezerve).

Noklikšķiniet uz kanāla krāsu josla → automātiski izvērš tā kanāla karti apakšā.

Grafiks

MuxEitAdapter nolasa notikumus no EPG sistēmas uz servisu, veido DVB EIT sekcijas (nosaukumi, laiki).

EIT tiek injicēts tieši NIF Mux, vienmērīgi null telpā.

Tabula 0x4E — pašreiz raidāmais + nākamais notikums. Injicēts ≤2 s starplaikos.

Mux periodiski reģenerē EIT .bin no EPG (~15 s) — EPG grafika izmaiņas atspoguļojas automātiski.

Tabulas 0x50/0x51 — pilns grafiks stundas/dienas uz priekšu (segmenti).

Starpības rādītājs (virs diagrammas)

Reālās plūsmas vs cap rādītājs. Centrs = cap (0). Atzīme pa kreisi (zaļa) = rezerve; pa labi (sarkana) = pārpilde.

-5 Mbps CAP 37000 kbps +5 Mbps

[#### zaļš = rezerve ####|::: sarkans = pārpilde]

Headroom slīdnis (78–90 %, nokl. 85)

Zemāk (→78): vairāk NULL rezerves, drošāk, mazāk piespiesta cap izmantošana.

Augstāk (→90): cietāka cap izmantošana, mazāk NULL.

⚠ ≥88 %: slīdnis kļūst dzeltens — tuvu gredzena pārpildes sasaldēšanas griestiem.

Asimetrija: pazemināšana droši pievieno rezervi; paaugstināšana ir ierobežota ar max_bps skavas.

Kontrolē, cik no cap enkoderi mērķē: enkodeŗa mērķis = budžets × headroom% / 100.

Signāla zudums / kanāla kļūme (izolācija)

Viens kanāls avarē (enkodeŗa avārija / signāla zudums) ⇒ Mux turpina darboties, citi kanāli izmanto atbrīvoto kapacitāti.

PCR / laika izsekošana

PCR un PES PTS/DTS ir cauri no enkodeŗa (viens pulksteņa domēns ⇒ koherenti, nav sinhronizācijas nepieciešamības NIF).

CAT — nosacīta piekļuve (tikai šifrēšanas/ECM gadījumā).

EIT — notikumu informācija (EPG) — no EPG sistēmas.

NIT — tīkla info (tīkla ID, nosaukums, transporta plūsma).

PAT — programmu saraksts (saista PNR → PMT PID).

PMT — uz programmu: video/audio/PCR PID, kodeki, deskriptori.

SDT — servisu nosaukumi un sniedzēji (ko STB rāda sarakstā).

TDT/TOT — laiks un datums + lokālā nobīde (STB pulkstenis).

TSDuck Plugins Used

merge
regulate
pat
pmt
sdt
nit
eitinject
timeref
bitrate_monitor
continuity
psimerge
count