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


Stream Manager mux събира множество SPTS потоци в един CBR MPTS изход (DVB/IPTV). Adaptive Hybrid Statmux съчетава CBR ядро пълнене с VBR балансирани енкодери за постоянен mux изход.
Енкодерите кодират аудио и видео потоци от източници. GStreamer енкодерите използват хардуерни ускорители (NVIDIA NVENC, VAAPI).
Мултиплексърът комбинира кодираните потоци в TS/PES/ES формат и прилага EIT/PF таблица.
Изходният модул изпраща мултиплексиран поток към мултикаст адрес или записва в файл.
Mux горна лента показва 3 суми със статус цвят. Правила:
Σ avg ≤ 85 % mux.bitrate — средна целева сума по всички канали плюс аудио. Това е mux 'бюджетът'. 15 % статистическият резерв защитава от съвпадение на пиковете. Зелено ≤ 85 %, амбър ≤ 100 %, червено > 100 %.
Максимален битрейт на потока.
Минимален битрейт на потока.
Пример: при 50Mbps общ бюджет и 5 потока, всеки може да получи до 50Mbps.
При ≥ 10 алерти в 60s вспиш уведомление се появява в Mux UI препоръчвайки намаляване на битрейта. Автоматично отстъпване НЕ е активно — оператърът решава.
Монитор на битрейта - следи битрейта на всеки поток в реално време.
-P continuity — проследяване TS continuity броячи. Логира предупреждение при всяко падане (свръхподписване, FFmpeg крах, NIC трептене).
-P pcrverify --jitter-max 500000 — DVB позволява PCR трептене ≤ 500 µs. Алерт = pcradjust не може да следва или източник има счупени PCR.
Съвпадение на GOP
Входна загуба на сигнал — един канал станва черен, mux продължава (благодарения на -I null база). Продължителност ~3-8 s за FFmpeg рестарт.
Оверсубскрипшън
PCR Drift
VBV Underrun
Параметрите на мултиплексъра включват PCR cadence, PMT PID, EIT настройки, и изходен битрейт.
Препоръчителни настройки: PCR cadence 50ms за HD, 100ms за SD, статмулкс за оптимална ефективност.
Цвят
Покритие
Запомнете, че формулата е приблизителна - реалната ефективност може да варира.
Препоръчителни настройки
Въведение в статмулкса.
ASCII диаграма на капацитета.
Без Adaptive Hybrid Statmux трябва да размериш mux за най-лошия случай Σ макс. С Adaptive Hybrid Statmux размериш около Σ avg + статистически буфер (излъчване съотношение ρ=0.15). Реална печалба ~5 Mbps на 38 Mbps mux, или +1 поток на същия лимит.
CBR - фиксиран битрейт.
Статмулкс изключен.
Статмулкс включен.
Mutex - предотвратява едновременни промени.
ASCII диаграма на pipeline.
Размер на статмулкса.
Пример за размер.
Формула за размер.
Поне 1 балансиран поток — без един Adaptive Hybrid маршрутизатор няма нищо да смачка по време на пикове, така че печалба = 0
Музикални и информационни канали са най-добрите кандидати — 90 %+ толеранс към намаляване на битрейта
Съвет 3: Мониторите на битрейта са критични.
Съвет 4: Тествайте с реални потоци.
Стъпка 1: Настройте мултиплексъра.
Превключи Statmux в mux заглавие (жълтен чип). Когато активирана, всички енкодери превключат на VBR и рестартират
Стъпка 3: Стартирайте статмулкса.
Стъпка 4: Мониторите.
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.
Клас: статмукс с обратна връзка в затворен контур с изпреварващ поглед C1 (напреднало подаване) над VBR кодери — принцип на излъчващ статмукс, управляван от сложността на източника.
UDP мултикаст SSM, на канал
Кодер
сложност на източника
Цикъл
собствена линия / поток
Алокатор
Буфер
нулево запълване → CBR
CBR кабел при таван
предвиждане на сложна сцена преди спада
измерен кабел — калибриране
целеви битрейт
Всеки канал работи на собствена линия до мукса (отделен кодер + loopback връзка), където всички се сливат в един MPTS мултикаст поток при точно фиксиран битрейт. Разпределителят е централният мозък (1 GenServer на мукс), тик ~0,85 с.
Разпределителят съчетава два сигнала — предсказване от сложността на източника (напред) и измерения кабел (назад). Това се доближава до излъчващите статмукси, които знаят цената на кадъра преди кодиране.
C1 измерва сложността на съдържанието при декодера — което изпреварва изхода на кодера с времето на латентността на конвейера. Относителната промяна на сложността (корелация r≈0,92 с битове) се прилага към целевия битрейт И В ДВЕТЕ посоки ПРЕДИ кодерът да го произведе: на нарастваща сцена се предварително разпределя (без спад), на падаща се освобождават битове за другите рано.
Точните битове, излъчени от мукса на поток (броячи от страна на изпращача), калибрират съпоставянето сложност→битрейт и поддържат сумата точно в пула. Котва за реална стойност — предсказването C1 не е перфектно (r 0,92), изходният кабел го коригира.
Претенцията на даден поток е подкрепена от реално произведеното от кодера (× резерв за пикове). Лесен канал не може да натрупа честотна лента, която не може да изразходва — той я освобождава за гладния.
Целта не е равен битрейт, а равно качество — непрекъснатото налягане премества битове от висококачествени канали (нисък QP) към нискокачествени (висок QP).
Когато C1 сигнализира спад на канал, честотната му лента се предава на другите в същия тик — те нарастват преди спадът реално да достигне кабела.
Тегло на канал = complexity_q12 × max_bps (сцена действие + по-висок макс ⇒ повече битове).
Бюджет на поток = глобален бюджет × тегло / Σтегла, обхващане [min_bps, max_bps], преизчислено всеки 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 поток при конфигурирания таван. Три слоя го гарантират:
Опашката за изпращане поддържа постоянно ниво от ~1 с на кабела, поглъщащо под-секундни GOP спадове (между I-кадрите). Проверено от записа: 0,5–1 с поглъща 88–91% от спадовете.
Когато съдържанието е под тавана, разликата се запълва с нулеви MPEG-TS пакети (PID 0x1FFF). Кабелът ВИНАГИ достига тавана — съвместимост с DVB.
Изходящият поток е темпиран към точния таван (busy-spin ABSTIME); ограничение от 12 мс дълг предотвратява наваксване след кратко спиране → без PCR джитър, без пикове над тавана.
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.
Всеки канал има стабилен цвят; дебелината = мигновеният му битрейт. Накладните разходи (PSI/EIT) са сиви в долната, нулевото запълване е текстурирано бяло в горната.
Пунктирана линия в горната = конфигуриран таван (таван на кабела). Съдържание + нулево запълване винаги са под него.
Пунктирана бяла лента в горната = нулево запълване (свободен капацитет). Колкото по-тънка е, толкова по-пълен е кабелът; изчезва при взискателно съдържание.
Червени маркери на времевата линия = препълване на опашката за изпращане (изпускане). Нула в стабилно състояние; пакети само при стартиране/наводняване.
Бутоните превключват времевия прозорец незабавно (от страна на клиента), активният е с сив фон. Графиката натрупва 30 мин. в браузъра.
Задържането показва битрейт на канал, QP и качествен индекс в момента (исторически стойности, не на живо).
Текущо ниво на регулиране на пула (pool/(pool−trim)). >100% = свръхналягане (запълване на буфера), <100% = подрязване.
Лента на толеранс над тавана — колко да се запази като нулев резерв. 0 = запълване точно до N; положително = по-голям резерв (по-безопасно); отрицателно = леко препълване.
Заглавката показва % използване на опашката за изпращане и кумулативни изпускания. Бутонът "изчисти изпусканията" нулира брояча.
Обща дължина на GOP за всички канали в мукса (заключена в видео профилите при стартиране). Разпределянето по стена разпространява I-кадрите във времето, за да не се сблъскват.
Размер на VBV буфера на кодера (мс). По-малкият изравнява I-кадрите (добро за канали с движение), по-голямото дава по-подробен I-кадър. По подразбиране 850; отмяна на потока е възможна.
The section header has a 'Collapse / Expand all' toggle. Expand a card by clicking it or clicking its colour band in the chart. The left coloured strip with checkbox = channel membership in the mux.
dark = running OK
orange = starting / restarting
сиво + затъмнено = изключено/грешка и квадратче изключено (намерено деактивирано — без алерт)
red + BLINKING = FAULT — channel is in the mux (checkbox ON) but the stream is down/error
StatMux генерира пълния набор от задължителни MPEG-TS / DVB таблици директно в NIF мукса — без външен SI вмъкващ елемент. Таблиците са равномерно времеви в потока, за да може STB винаги бързо да получи PSI/SI след пренастройка.
Таблица
psi h_pid
psi h_int
Предназначение / Източник
EIT (Event Information Table, PID 0x12) не е статична — тя е напълно свързана с EPG системата на приложението. Операторът присвоява на всеки канал в мукса EPG услуга (eit_epg_service_id) и мукса генерира EIT на живо от планираните събития.
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.
Правим реален статистически мултиплексиране — динамично преразпределение на битове между VBR канали, споделящи фиксиран кабел, с изравняване на качеството. Механично се доближаваме до професионалните заглавни статмукси (изравняване на тавана, буфер 1 с, нулево запълване, GOP/B-кадри, отмяна на минимума).
CBR кабел при таван · 1 с буфер · пропорционално разпределение на поток · напреднало подаване C1 · изравняване на качеството · предсказващо преразпределение · нулево запълване · точно темпиране.
Излъчващият статмукс използва оценката за скорост-изкривяване на кодера (точна цена на кадъра, кодерът е подчинен на разпределителя). Ние използваме сложност на източника C1 (r≈0,92) + VBR кодер, избиращ свой QP — хардуерно ограничение, не дизайнерско. Клас: обратна връзка + изпреварващ поглед вместо чисто напреднало подаване.
ts h_sym
ts h_fix
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
Няма живи примери (mux спран или енкодери не работят) — проверете както mux така и статуса на потока.
ASCII диаграма
enc_b
nif_b
out_b
Ред 1
Ред 2
Състояния карти
ASCII диаграма
Червена 'cap' линия: wire CBR таван (mux.bitrate) — NULL пълнене до тук.
Оранжева линия 'headroom N%': = cap × headroom плъзгач / 100. Целите на encoder set_bitrate се уцелват тук. Движи се със плъзгача.
Сива площ с черни точки между съдържание и лимит = NULL пълнене (неизползвана резерва). Повече точки = повече резерва.
L4
MuxEitAdapter чете събития от EPG системата по услуга, изгражда DVB EIT секции (наименование, час, продължителност, описание, жанр) и ги пакетира на PID 0x12. Версиите на секциите се увеличават при промяна на EPG — STB получава актуализацията.
EIT се инжектира директно в NIF мукса, равномерно В нулевото пространство (1 пакет / N изходящ + p/f периодично) — заменяйки бурния външен tsp каскад. Пик/средно ≈ 1,1, без изгонване на съдържание, тавана се поддържа.
Таблица 0x4E — текущото работещо + следващото събитие. Инжектира се на всеки ≤2 с за незабавна актуалност "сега/следващо" на STB.
Мукса периодично регенерира EIT .bin от EPG (~15 с) — промяна в EPG разписанието достига кабела без рестартиране. Заглавката на мукса показва "EIT ✓" когато е активно.
Таблици 0x50/0x51 — пълното разписание часове/дни напред (сегменти). Разпределено равномерно в потока.
Въведение
ASCII индикатор
HR b1
По-високо (→90): по-стегнато използване на лимит, по-малко NULL.
HR b3
HR b4
Контролира колко от лимита енкодерите цел: енкодер цел = бюджет × headroom% / 100 (оранжева линия в диаграмата). Промени live (ефект от следващ 10 ms тик), съхранено в SystemConfig.
ISO 13818-1 тяло
PCR тяло
CAT — условен достъп (само при кодиране / ECM).
EIT — информация за събитие (EPG) — от EPG системата, виж по-долу.
NIT — мрежова информация (мрежов ID, наименование, транспортен поток).
PAT — списък на програми (съпоставя PNR → PMT PID).
PMT — за програма: видео/аудио/PCR PID, кодеци, дескриптори.
SDT — имена на услуги и доставчици (какво STB показва в списъка).
TDT/TOT — час и дата + местно отместване (часовник на STB).