MPTS · TSDuck · PSI/SI






Mux Stream Manager збирає кілька SPTS-потоків в один CBR MPTS-вихід (DVB/IPTV). Adaptive Hybrid Statmux розподіляє бітрейт динамічно.
Коли батьківський Mux має statmux, кожен FFmpeg-енкодер запускається в режимі capped-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <2×max>.
tsp -I null (∞ NULL-пакети) → -P merge tsp -I ip <stream> (накладає реальні пакети) → -P regulate → UDP-вихід.
Плагін regulate видає рівно mux.bitrate bps. Відставання входів → NULL-пакети заповнюють різницю.
Верхня панель Mux показує 3 суми з кольоровим статусом. Правила:
Σ avg ≤ 85% mux.bitrate — середня сума цілей по всіх каналах плюс аудіо.
Σ max ≤ 160% mux.bitrate — сума пікових стель. Дозволено перевищувати ємність (це суть statmux).
Σ min ≤ 50% mux.bitrate — сума мінімальних порогів енкодера.
Доступний бюджет після PSI/SI/EIT: ~18,5 Мбіт/с. Σ avg = 4 × 4,0 = 16 Мбіт/с (86% — межа).
При ≥ 10 тривогах за 60 с з'являється сповіщення в UI Mux із рекомендацією знизити бітрейт.
-P bitrate_monitor --periodic 60 --min/max ±5% — тривога, якщо реальний бітрейт відхиляється від цільового.
-P continuity — відстежує лічильники безперервності TS. Попередження при кожному розриві.
-P pcrverify --jitter-max 500000 — DVB допускає PCR-джитер ≤ 500 мкс. Тривога = pcradjust не встигає.
Збіг GOP — всі енкодери одночасно видають I-кадри, пік збігів. Виправлення: зміщення GOP (вже є).
Втрата вхідного сигналу — один канал чорніє, Mux продовжує роботу (завдяки базі -I null). Тривалість ~1 GOP.
Перевищення підписки (піки > ємності) — блоки/стрибки аудіо ~50–200 мс. Виправлення: знизити бітрейт потоку.
PCR-дрейф — STB заїкається кожні кілька секунд. Виправлення: pcradjust у конвеєрі (вже є).
VBV-недобір STB — STB втрачає синхронізацію і відновлює (~2–3 с). Виправлення: bufsize = 2 × maxrate.
--max-input-packets 4096 / --max-flushed-packets 4096 (внутрішній FIFO ≈ 0,3 с @ 19 Мбіт/с). --receive-bufsize налаштований.
Значок `📐 rec X.XM` показує рекомендовану ємність Mux за центральною граничною теоремою.
Колір значка: 🟢 зелений = cap ≥ 99,7% rec · 🟡 жовтий = між 99% та 99,7% · 🔴 червоний = cap < 99%.
z-коефіцієнт за рівнем покриття: 90% z=1,28 · 95% z=1,65 · 99% z=2,33 · 99,7% z=3,00 (за замовчуванням) · 99,99% z=3,72.
σ_eff = σ_total × statmux_factor (statmux_factor = 0,7 коли Statmux увімкнено, інакше 1,0)
HD-канал 1080p25: avg = 4000–5000 кбіт/с, min = avg × 0,75, max = avg × 1,5.
Adaptive Hybrid Statmux переміщує невикористану ємність від core-потоків до balanced-потоків в реальному часі.
Ємність Mux 38 Мбіт/с
┌────────────────────────────────────────────────────────────┐
│███
Без Adaptive Hybrid Statmux потрібно розраховувати Mux на найгірший Σ max. З ним — на Σ avg плюс headroom.
Чистий CBR (фіксований енкодер)
VBR без Statmux
Adaptive Hybrid Statmux увімкнено
Власний URL-вхід і Statmux є взаємовиключними. При Statmux balanced transcoder контролює бітрейт через власний конвеєр.
┌─────────────────────────┐
│ Encoder (NVDEC→NVENC) │ ← UDP satellite
STREAM
Статистичний виграш виникає лише при широкому VBR-діапазоні. Коли max ≈ avg — енкодер фактично CBR.
Приклад — Mux 38 Мбіт/с, 10 HD core + 2 balanced:
Старий (CBR): min=2000 avg=3000
Рекомендований діапазон для core-потоку:
• min ≈ avg × 0,5 (енкодер може знизити на статичних сценах)
• avg
Щонайменше 1 balanced-потік — без нього Adaptive Hybrid router нічого не може стиснути під час піків.
Музичні та інформаційні канали — найкращі кандидати: 90%+ толерантність до зниження бітрейту.
Відстежуйте через `[balance-router]` у журналі — показує `core_max`, `remaining`, переходи рівнів.
Якщо `core_max > capacity` (попередження CORE OVERPEAK), знизьте кількість core-потоків або maxrate.
Додайте потоки до Mux (призначення каналів залишається ручним)
Увімкніть Statmux на заголовку Mux (жовтий чіп). Всі енкодери перейдуть на VBR і перезапустяться.
Позначте жертовні потоки (музика/інфо-канали) помаранчевим прапорцем праворуч.
Готово. Adaptive Hybrid router зчитує 6-сегментний HLS-прогноз кожну секунду та перерозподіляє бітрейт.
Кілька каналів зі змінним бітрейтом спільно використовують один фіксований транспортний потік (MPTS). Біти динамічно перерозподіляються.
Клас: statmux із замкненим зворотним зв'язком з C1 look-ahead (feedforward) над VBR-енкодерами — технологія мовлення.
UDP multicast SSM, на канал
Кодер
складність джерела
Цикл
власна лінія / потік
Аллокатор
Буфер
null-заповнення → CBR
CBR дріт на cap
передбачити складну сцену до спаду
виміряний дріт — калібрування
цільовий бітрейт
Кожен канал іде окремою лінією до Mux, де всі потоки зливаються в один CBR MPTS.
Алокатор поєднує два сигнали — прогноз складності джерела (вперед) та виміряний дріт (зворотний зв'язок).
C1 вимірює складність контенту на декодері — що випереджає вихід енкодера на затримку конвеєра.
Точні біти на потік від Mux (лічильники на стороні відправника) калібрують відображення складність→бітрейт.
Претензія потоку підкріплена фактичним виходом енкодера (× peak headroom). Легкий канал не може 'з'їсти' бітрейт важкого.
Мета — не рівний бітрейт, а рівна якість: постійний тиск переміщує біти від високоякісних до низькоякісних каналів.
Коли C1 сигналізує зниження каналу, його пропускна здатність передається іншим у тому ж тіку — вони відповідають раніше.
Пул = cap N − overhead (PSI/EIT) − аудіо − резерв. Вимірюється з дроту, вікно максимумів.
Попит потоку = deliverable wire × C1 look-ahead (відносна зміна складності) + вирівнювання якості.
Пропорційний розподіл пулу за попитом, обмежений [min, max] з відеопрофілю; вільна пропускна здатність — balanced.
Ціль енкодера = alloc / калібрування (per-stream EMA); відправляється з порогом для запобігання тремтіння.
Серво утримання буфера підтримує рівень черги ~1 с; аварійний запобіжник при перевантаженні; null-заповнення.
Вихід — точний CBR-потік на налаштованому cap. Три шари гарантують це:
Черга відправлення тримає постійний рівень ~1 с дроту, поглинаючи субсекундні GOP-спади.
Коли контент нижче cap, різниця заповнюється MPEG-TS null-пакетами (PID 0x1FFF). Дріт завжди точно cap.
Вихід пейсується точно на cap (busy-spin ABSTIME); обмеження боргу 12 мс запобігає catch-up сплескам.
Живий стекований графік реального дроту — кожна смуга один канал, тече справа. Дані оновлюються щосекунди.
Кожен канал має стабільний колір; товщина = його миттєвий бітрейт. Overhead (PSI/EIT) сірий знизу.
Пунктирна лінія зверху = налаштований cap (стеля дроту). Контент + null-заповнення завжди суворо рівні cap.
Пунктирна біла смуга зверху = null-заповнення (вільна ємність). Чим тонша — тим заповненіший дріт.
Червоні позначки на шкалі часу = переповнення черги відправлення (drop). Нуль у стаціонарному стані.
Кнопки миттєво перемикають часове вікно (на стороні клієнта); активна кнопка має сірий фон.
При наведенні показує бітрейт на канал, QP та індекс якості в цей момент (історичне значення, не живе).
Поточний рівень регулювання пулу (pool/(pool−trim)). >100% = надлишковий тиск, <100% = недовантаження.
Смуга допуску вище cap — скільки тримати як null-резерв. 0 = заповнити точно до cap.
Заголовок показує % утилізації черги відправлення та накопичені drop. Кнопка «clear drops» скидає лічильник.
Загальна довжина GOP для всіх каналів у Mux (фіксується в відеопрофілях при старті). Стінне зміщення розподіляє I-кадри.
Розмір VBV-буфера енкодера (мс). Менший згладжує I-кадри; більший — плавніша якість для тривалого контенту.
Кожен канал у Mux має картку з назвою, PNR, поточним та цільовим бітрейтом і станом:
Running — канал кодує та передає на дріт.
Starting — енкодер запускається / стабілізується.
Off — канал у Mux, але не запущений (0 кбіт/с).
Fault — втрата входу / збій енкодера.
StatMux генерує повний набір обов'язкових таблиць MPEG-TS / DVB безпосередньо в NIF mux — без зовнішніх інструментів.
Таблиця
psi h_pid
psi h_int
Призначення / джерело
EIT (Event Information Table, PID 0x12) не статичний — повністю прив'язаний до EPG-системи програми.
min = нижній поріг (статична сцена). Рекомендовано avg × 0,5–0,75. Встановіть досить низько для економії на спокійному контенті.
avg = цільовий рівень. Σ avg усіх каналів ≈ відеопул (cap − overhead − аудіо).
max = стеля (VBR headroom для піків/монтажів). Рекомендовано avg × 1,5. Не обмежуйте до avg — VBR потребує простору.
Приклади (avg): SD 1,5–2,5М · HD 2,5–4М · FHD 4–6М · UHD 12–18М. Для statmux тримайте достатній діапазон.
Реальне статистичне мультиплексування — динамічний перерозподіл бітів між VBR-каналами, що спільно використовують фіксований транспортний потік.
CBR дріт на cap · 1 с буфер · пропорційний розподіл на потік · C1 look-ahead feedforward · вирівнювання якості.
Broadcast statmux використовує оцінку rate-distortion енкодера (точна вартість кадру). Ми використовуємо C1 look-ahead як проксі.
ts h_sym
ts h_fix
Прогалини / сплески null (5–7М) на графіку
Спади контенту — GOP між I-кадрами (поглинається 1 с буфером) або колективне зависання контенту.
Drops > 0 зростають
Переповнення черги відправлення — контент вище cap. Перевірте резерв (слайдер) та утилізацію.
Один канал тримає низький бітрейт / високий QP
Або статичний контент (правильно — він звільняє пропускну здатність) або занадто низький max у профілі.
Графік заїкається / ліво стирається
На стороні клієнта — жорстке оновлення (Ctrl+Shift+R) для нового пакету JS.
cap % / буфер не змінюється після редагування
LiveView-рендер — жорстке оновлення. Значення оновлюються раз на секунду через tracked assign.
ASCII diagram
enc_b
nif_b
out_b
Рядок 1
Рядок 2
Стани карток
ASCII діаграма
Червона лінія 'cap': стеля CBR дроту (mux.bitrate) — NULL заповнює до неї.
Помаранчева лінія 'headroom N%': = cap × слайдер headroom / 100. Цілі set_bitrate енкодерів тут.
Сіра область з чорними крапками між контентом та cap = NULL-заповнення (невикористаний резерв).
L4
MuxEitAdapter зчитує події з EPG-системи за сервісом, будує DVB EIT-секції (назва, час, тривалість).
EIT вводиться безпосередньо в NIF Mux, рівномірно в null-простір (1 пакет / N вихідних + p/f-перші).
Таблиця 0x4E — поточна + наступна подія. Вводиться кожні ≤2 с для актуальних 'зараз/далі'.
Mux періодично регенерує EIT .bin з EPG (~15 с) — зміна розкладу EPG досягає ефіру за ~30 с.
Таблиці 0x50/0x51 — повний розклад на години/дні наперед (сегменти). Рівномірно розподілені в потоці.
Вступ
ASCII індикатор
HR b1
Вище (→90): щільніша утилізація cap, менше NULL.
HR b3
HR b4
Керує, яку частку cap цілять енкодери: ціль = бюджет × headroom% / 100 (помаранчева лінія на графіку).
ISO 13818-1 тіло
PCR тіло
CAT — умовний доступ (лише при скремблюванні / ECM).
EIT — інформація про події (EPG) — з EPG-системи, дивіться нижче.
NIT — інформація про мережу (ID мережі, назва, транспортний потік).
PAT — список програм (відображення PNR → PID PMT).
PMT — на програму: PID відео/аудіо/PCR, кодеки, дескриптори.
SDT — назви сервісів і провайдерів (що STB показує у списку).
TDT/TOT — час і дата + локальне зміщення (годинник STB).