MPTS · TSDuck · PSI/SI






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.
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.
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.
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).
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 %.
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 %.
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ā.
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.
--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).
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)
1080p25 HD: avg = 4000-5000 kbps, min = avg × 0.75, max = avg × 1.5. SD: avg = 2000-2500 kbps. UHD: avg = 12000-18000 kbps.
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ē.
Mux kapacitāte 38 Mbps
┌──────────────────────────────────────────┐
│ Pamata Stream (VBR aizsargāts) │ Balansēts │
└──────────────────────────────────────────┘
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
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.
Enkoderis (NVDEC→NVENC) ← VBR → HLS → Balansētais transkoderis → UDP → Mux (tsp cauruļvads)
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:
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.
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).
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.
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ā.
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.
Precīzi izmērīti bitos uz Stream (sūtītāja skaitītāji) kalibrē sarežģītību→biterātes koeficientu.
Kanāla prasība ir pamatota ar enkodeŗa faktiski saražoto (× virsotnes galvenes vieta).
Mērķis nav vienāda biterāte, bet vienāda kvalitāte — bitus pārviet no augstiem QP uz zemiem.
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ā.
Izeja ir precīza CBR plūsma pie konfigurētā cap. Trīs slāņi to garantē:
Sūtīšanas rinda uztur ~1 s vada krājumus, kas absorbē sub-sekundes GOP kritumu.
Kad saturs ir zem cap, starpību aizpilda MPEG-TS null paketes (PID 0x1FFF).
Izeja tiek paced tieši pie cap (busy-spin ABSTIME); 12 ms parāda skavas novērš noķeršanu.
Dzīvs kaudzinātais grafiks no reālā vada — katrs josls ir viens kanāls.
Katram kanālam ir stabila krāsa; biezums = tā momentānā biterāte.
Pārrautā līnija augšā = konfigurētais cap (vada griesti). Saturs + null aizpildījums kopā = cap.
Baltā punktētā josla augšā = null aizpildījums (brīvā kapacitāte). Jo plānāka, jo pilnāka.
Sarkani atzīmējumi = sūtīšanas rindas pārpilde (dropout). Nullē stabilā stāvoklī; sprādzieni tikai pārslogojumā.
Pogas maina laika logu uzreiz (klienta pusē), aktīvajai ir pelēks fons.
Pavirzot kursoru — kanāla biterāte, QP un kvalitātes indekss tajā brīdī.
Pašreizējais baseina regulācijas līmenis (pool/(pool−trim)). >100% = pārspiede (bufera aizpildīšana).
Tolerances josla virs cap — cik saglabāt kā null rezervi. 0 = aizpildīt tieši N; pozitīvs = saglabāt rezervi.
Galvene rāda sūtīšanas rindas izmantojumu % un kumulatīvos dropouts. 'Dzēst dropouts' atjauno skaitītāju.
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.
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.
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.
StatMux ģenerē pilnu obligāto MPEG-TS / DVB tabulu kopu tieši NIF Mux.
Tabula
PID
Intervāls
Mērķis / avots
EIT (Event Information Table, PID 0x12) nav statisks — tas ir pilnībā savienots ar lietojumprogrammu EPG sistēmu.
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.
Mēs darām reālu statistisko multipleksēšanu — dinamisku bitu pārdali starp VBR kanāliem, kas dalās vienā transportā.
CBR vads pie cap · 1 s buferis · proporcionāla sadale · C1 priekšredzēšana · wire-feedback kalibrācija.
Broadkasta StatMux izmanto enkodeŗa rate-distortion novērtējumu. Mēs izmantojam C1 sarežģītību.
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ē.
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šā.
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).
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]
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.
Viens kanāls avarē (enkodeŗa avārija / signāla zudums) ⇒ Mux turpina darboties, citi kanāli izmanto atbrīvoto kapacitāti.
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).