×

⊳ Muxer

MPTS · TSDuck · PSI/SI

MPTS-мультиплексор та Adaptive Hybrid Statmux

Mux Stream Manager збирає кілька SPTS-потоків в один CBR MPTS-вихід (DVB/IPTV). Adaptive Hybrid Statmux розподіляє бітрейт динамічно.

1. Шар кодера (FFmpeg на потік)

Коли батьківський Mux має statmux, кожен FFmpeg-енкодер запускається в режимі capped-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <2×max>.

2. Шар Mux (конвеєр TSDuck tsp)

tsp -I null (∞ NULL-пакети) → -P merge tsp -I ip <stream> (накладає реальні пакети) → -P regulate → UDP-вихід.

3. Вихідний шар (UDP)

Плагін regulate видає рівно mux.bitrate bps. Відставання входів → NULL-пакети заповнюють різницю.

Бюджет Muxer

Верхня панель Mux показує 3 суми з кольоровим статусом. Правила:

Σ avg ≤ 85% mux.bitrate — середня сума цілей по всіх каналах плюс аудіо.

Σ max ≤ 160% mux.bitrate — сума пікових стель. Дозволено перевищувати ємність (це суть statmux).

Σ min ≤ 50% mux.bitrate — сума мінімальних порогів енкодера.

Приклад: 4 HD-канали в Mux 19 Мбіт/с DVB-T

Доступний бюджет після 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 не встигає.

Глюки Muxer

Збіг GOP — всі енкодери одночасно видають I-кадри, пік збігів. Виправлення: зміщення GOP (вже є).

Втрата вхідного сигналу — один канал чорніє, Mux продовжує роботу (завдяки базі -I null). Тривалість ~1 GOP.

Перевищення підписки (піки > ємності) — блоки/стрибки аудіо ~50–200 мс. Виправлення: знизити бітрейт потоку.

PCR-дрейф — STB заїкається кожні кілька секунд. Виправлення: pcradjust у конвеєрі (вже є).

VBV-недобір STB — STB втрачає синхронізацію і відновлює (~2–3 с). Виправлення: bufsize = 2 × maxrate.

Параметри конвеєра tsp (mux_worker.ex)

--max-input-packets 4096 / --max-flushed-packets 4096 (внутрішній FIFO ≈ 0,3 с @ 19 Мбіт/с). --receive-bufsize налаштований.

Рекомендація Muxer

Значок `📐 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 H.264)

HD-канал 1080p25: avg = 4000–5000 кбіт/с, min = avg × 0,75, max = avg × 1,5.

Statmux Muxer

Adaptive Hybrid Statmux переміщує невикористану ємність від core-потоків до balanced-потоків в реальному часі.

Ємність — розподіл бітрейту

Ємність Mux 38 Мбіт/с

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

│███

Практичний виграш (10 потоків × 3 Мбіт/с avg, 4 Мбіт/с max)

Без Adaptive Hybrid Statmux потрібно розраховувати Mux на найгірший Σ max. З ним — на Σ avg плюс headroom.

Чистий CBR (фіксований енкодер)

VBR без Statmux

Adaptive Hybrid Statmux увімкнено

URL ↔ Statmux: взаємовиключність

Власний URL-вхід і Statmux є взаємовиключними. При Statmux balanced transcoder контролює бітрейт через власний конвеєр.

Конвеєр (encoder → balanced transcoder → mux ffmpeg → tsp)

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

│ Encoder (NVDEC→NVENC) │ ← UDP satellite

STREAM

Розмір VBR min/avg/max для statmux

Статистичний виграш виникає лише при широкому 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-прогноз кожну секунду та перерозподіляє бітрейт.

Statmux

Кілька каналів зі змінним бітрейтом спільно використовують один фіксований транспортний потік (MPTS). Біти динамічно перерозподіляються.

Клас: statmux із замкненим зворотним зв'язком з C1 look-ahead (feedforward) над VBR-енкодерами — технологія мовлення.

Архітектура та потік даних

Architecture diagram

UDP multicast SSM, на канал

Кодер

складність джерела

Цикл

власна лінія / потік

Аллокатор

Буфер

null-заповнення → CBR

CBR дріт на cap

передбачити складну сцену до спаду

виміряний дріт — калібрування

цільовий бітрейт

Кожен канал іде окремою лінією до Mux, де всі потоки зливаються в один CBR MPTS.

Мозок: зворотний зв'язок + C1 look-ahead

Алокатор поєднує два сигнали — прогноз складності джерела (вперед) та виміряний дріт (зворотний зв'язок).

C1 вимірює складність контенту на декодері — що випереджає вихід енкодера на затримку конвеєра.

Вимірюваний дріт (зворотний зв'язок)

Точні біти на потік від Mux (лічильники на стороні відправника) калібрують відображення складність→бітрейт.

deliver_t

Претензія потоку підкріплена фактичним виходом енкодера (× peak headroom). Легкий канал не може 'з'їсти' бітрейт важкого.

Вирівнювання якості

Мета — не рівний бітрейт, а рівна якість: постійний тиск переміщує біти від високоякісних до низькоякісних каналів.

Передбачуваний перерозподіл

Коли C1 сигналізує зниження каналу, його пропускна здатність передається іншим у тому ж тіку — вони відповідають раніше.

Пул = cap N − overhead (PSI/EIT) − аудіо − резерв. Вимірюється з дроту, вікно максимумів.

Попит потоку = deliverable wire × C1 look-ahead (відносна зміна складності) + вирівнювання якості.

Пропорційний розподіл пулу за попитом, обмежений [min, max] з відеопрофілю; вільна пропускна здатність — balanced.

Ціль енкодера = alloc / калібрування (per-stream EMA); відправляється з порогом для запобігання тремтіння.

Серво утримання буфера підтримує рівень черги ~1 с; аварійний запобіжник при перевантаженні; null-заповнення.

CBR-дріт: буфер + null-заповнення + пейсування

Вихід — точний CBR-потік на налаштованому cap. Три шари гарантують це:

Постійний буфер ~1 с

Черга відправлення тримає постійний рівень ~1 с дроту, поглинаючи субсекундні GOP-спади.

Null-заповнення

Коли контент нижче cap, різниця заповнюється MPEG-TS null-пакетами (PID 0x1FFF). Дріт завжди точно cap.

Точне пейсування

Вихід пейсується точно на cap (busy-spin ABSTIME); обмеження боргу 12 мс запобігає catch-up сплескам.

Графік виходу (river)

Живий стекований графік реального дроту — кожна смуга один канал, тече справа. Дані оновлюються щосекунди.

Кольорові смуги

Кожен канал має стабільний колір; товщина = його миттєвий бітрейт. Overhead (PSI/EIT) сірий знизу.

Лінія Cap / Max

Пунктирна лінія зверху = налаштований cap (стеля дроту). Контент + null-заповнення завжди суворо рівні cap.

Null-смуга

Пунктирна біла смуга зверху = null-заповнення (вільна ємність). Чим тонша — тим заповненіший дріт.

Позначки drop

Червоні позначки на шкалі часу = переповнення черги відправлення (drop). Нуль у стаціонарному стані.

Діапазон (30с–30хв)

Кнопки миттєво перемикають часове вікно (на стороні клієнта); активна кнопка має сірий фон.

tip_t

При наведенні показує бітрейт на канал, QP та індекс якості в цей момент (історичне значення, не живе).

cap_t

Поточний рівень регулювання пулу (pool/(pool−trim)). >100% = надлишковий тиск, <100% = недовантаження.

Резерв (слайдер)

Смуга допуску вище cap — скільки тримати як null-резерв. 0 = заповнити точно до cap.

Буфер (drops)

Заголовок показує % утилізації черги відправлення та накопичені drop. Кнопка «clear drops» скидає лічильник.

gop_t

Загальна довжина GOP для всіх каналів у Mux (фіксується в відеопрофілях при старті). Стінне зміщення розподіляє I-кадри.

vbv_t

Розмір VBV-буфера енкодера (мс). Менший згладжує I-кадри; більший — плавніша якість для тривалого контенту.

Картки потоків та стани

Кожен канал у Mux має картку з назвою, PNR, поточним та цільовим бітрейтом і станом:

Running — канал кодує та передає на дріт.

Starting — енкодер запускається / стабілізується.

Off — канал у Mux, але не запущений (0 кбіт/с).

Fault — втрата входу / збій енкодера.

Таблиці PSI/SI (повний набір DVB)

StatMux генерує повний набір обов'язкових таблиць MPEG-TS / DVB безпосередньо в NIF mux — без зовнішніх інструментів.

Таблиця

psi h_pid

psi h_int

Призначення / джерело

EIT ↔ EPG: повна інтеграція

EIT (Event Information Table, PID 0x12) не статичний — повністю прив'язаний до EPG-системи програми.

Розмір каналу (min / avg / max)

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 тримайте достатній діапазон.

Порівняння з broadcast statmux

Реальне статистичне мультиплексування — динамічний перерозподіл бітів між VBR-каналами, що спільно використовують фіксований транспортний потік.

Що є

CBR дріт на cap · 1 с буфер · пропорційний розподіл на потік · C1 look-ahead feedforward · вирівнювання якості.

Відмінності

Broadcast statmux використовує оцінку rate-distortion енкодера (точна вартість кадру). Ми використовуємо C1 look-ahead як проксі.

TS заголовок

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

ISO 13818-1 тіло

PCR

PCR тіло

CAT — умовний доступ (лише при скремблюванні / ECM).

EIT — інформація про події (EPG) — з EPG-системи, дивіться нижче.

NIT — інформація про мережу (ID мережі, назва, транспортний потік).

PAT — список програм (відображення PNR → PID PMT).

PMT — на програму: PID відео/аудіо/PCR, кодеки, дескриптори.

SDT — назви сервісів і провайдерів (що STB показує у списку).

TDT/TOT — час і дата + локальне зміщення (годинник STB).