Muxer — Statistical Multiplex

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

MPTS 多路复用器和自适应混合统计复用器

流管理器多路复用器将多个 SPTS 流组合成一个 CBR MPTS 输出 (DVB/IPTV)。

1. 编码器层(每个流 FFmpeg)

当父 mux 启用 statmux 时,每个 FFmpeg 编码器运行 capped-VBR:-b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>。

2.Mux层(TSDuck tsp管道)

tsp -I null(∞ NULL 数据包@线路速率)→ -P merge tsp -I ip <stream>(覆盖真实数据包)→ -P 连续性(丢弃警报)→ -P pcradjust --bitrate X(重写 PCR)→ -P pcrverify --jitter-max 500µs → -P bitrate_monitor(速率警报 ±5%)→ -P 调节 --bitrate X --packet-burst 32 → -O ip

3.输出层(UDP)

调节插件在线路上精确地发出 mux.bitrate bps。

推荐的大小(Σ 最小/平均/最大与 mux.bitrate)

Mux 顶部栏显示 3 个总和以及颜色状态。

Σ avg ≤ 85 % mux.bitrate — 所有通道加音频的平均目标总和。

Σ max ≤ 160 % mux.bitrate — 峰值上限总和。

Σ min ≤ 50 % mux.bitrate — 编码器底数总和。

示例:19 Mbps DVB-T 复用器中的 4 个高清频道

PSI/SI/EIT 后的可用预算:~18.5 Mbps。

诊断和警报

如果 60 秒内发生 ≥ 10 个警报,Mux UI 中会出现闪烁通知,建议降低比特率。

-P bitrate_monitor --periodic 60 --min/max ±5% — 如果实际速率偏离目标值超出 ±5%,则发出警报。

-P 连续性 — 跟踪 TS 连续性计数器。

-P pcrverify --jitter-max 500000 — DVB 允许 PCR 抖动 ≤ 500 µs。

故障及其原因

GOP 重合 — 所有编码器同时发出 I 帧,峰值重合。

输入信号丢失 — 单通道变黑,多路复用器继续(由于 -I null base)。

超额订阅(持续峰值 > 容量)— 块/音频口吃 ~50-200 毫秒。

PCR 漂移 — STB 每隔几秒就会出现卡顿。

STB VBV 欠载 — STB 失去同步并重新获取(约 2-3 秒)。

tsp 管道参数 (mux_worker.ex)

--max-input-packets 4096 / --max-flushed-packets 4096(内部 FIFO ≈ 0.3 s @ 19 Mbps)。

经验容量计算(CLT)

顶部栏徽章“📐rec X.XM”显示了从中心极限定理得出的建议多路复用器容量。

徽章颜色: 🟢 绿色 = 上限 ≥ 99.7% 推荐(保守) · 🟡 琥珀色 = 99% 到 99.7% 之间 · 🔴 红色 = 上限 < 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 打开时,statmux_factor = 0.7,否则为 1.0)

每个通道的推荐值 (HD H.264)

1080p25 高清频道:平均值 = 4000-5000 kbps,最小值 = 平均值 × 0.75 (~3000-3750),最大值 = 平均值 × 1.5 (~6000-7500)。

自适应混合统计复用器

自适应混合 Statmux 是一种运行时机制,可将未使用的容量从核心流(受保护的完整 VBR)转移到平衡流(牺牲性)。

容量——比特率如何划分

复用器容量 38 Mbps

实际增益(10 个流 × 平均 3 Mbps,最大 4 Mbps)

如果没有自适应混合统计复用器,您必须根据最坏情况 Σ max 来确定复用器的大小。

纯CBR(编码器固定)

不带 Statmux 的 VBR

自适应混合统计复用器开启

URL ↔ Statmux 独占性

自定义 URL 输入覆盖和 Statmux 是互斥的。

管道(编码器 → 平衡转码器 → mux ffmpeg → tsp)

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

调整 statmux 的核心 VBR 最小值/平均值/最大值

仅当编码器具有较宽的 VBR 范围时才会出现统计增益 - 当 max ≈ avg 时,编码器实际上是 CBR 并且路由器没有任何内容可以重新分配。

工作示例 — 38 Mbps 多路复用器,10 个 HD 核心 + 2 个平衡:

每个核心流的推荐范围:

提示和故障排除

至少 1 个平衡流 — 如果没有平衡流,自适应混合路由器在高峰期间没有任何东西可以挤压,因此增益 = 0

音乐和信息频道是最佳选择——对速率下降的容忍度超过 90%

通过“[balance-router]”日志条目进行跟踪 - 显示“core_max”、“remaining”、每 1 s 刻度的层转换

如果“core_max > 容量”(日志中出现 CORE OVERPEAK 警告),则减少核心流计数或降低编码器最大速率

操作员工作流程

将流添加到多路复用器(通道分配保持手动)

切换多路复用器接头(黄色芯片)上的 Statmux。

通过右侧橙色复选框标记牺牲流 - 通常是速率下降不可见的音乐/信息频道

完毕。

StatMux — 原生统计复用

多个可变比特率通道共享一个固定传输流 (MPTS)。

类别:通过 VBR 编码器具有 C1 前瞻(前馈)的闭环反馈 statmux — 广播 statmux 原理,由源复杂性驱动。

架构和数据流

Architecture diagram

UDP 多播 SSM,每个通道

编码器

源复杂性

环回

自己的线路/流

分配器(Σ ≤ 池)

缓冲

空填充 → CBR

帽上的 CBR 线

在下降前预测复杂的场景

被测线材 — 校准

目标比特率

每个通道都在自己的线路上运行,直至复用器(单独的编码器+环回连接),所有通道以完全固定的比特率合并到一条 MPTS 多播线路中。

大脑:反馈+C1前瞻

分配器结合了两个信号——源复杂性的预测(前向)和测量的线路(后向)。

C1 测量解码器处的内容复杂性,这会导致编码器输出的管道延迟。

测量线(反馈)

多路复用器(发送方计数器)发出的精确的每个流比特校准复杂性→比特率映射并将总和精确地保存在池中。

交货能力

流的声明由编码器实际产生的内容(×峰值余量)支持。

品质均等

目标不是相同的比特率,而是相同的质量——持续的压力将比特从高质量通道(低 QP)移动到低质量通道(高 QP)。

预测性重新分配

当 C1 发出通道下降信号时,其带宽会在同一滴答中传递给其他通道 - 在下降实际到达线路之前,它们会逐渐增加。

池 = cap N – 开销 (PSI/EIT) – 音频 – 储备(滑块)。

每个流的需求 = 可交付的线路 × C1 前瞻(相对复杂性变化)+ 质量均衡压力。

按需求按比例分配池,限制为视频配置文件中的 [min, max];

编码器目标 = 分配 / 校准(每流 EMA 测量值/目标);

缓冲保持伺服器将队列水平保持在约1秒(带),过载时紧急停止;

CBR 线:缓冲区 + 空填充 + 调步

输出是配置上限的精确 CBR 流。

站立缓冲〜1秒

发送队列保持大约 1 s 的线路,可吸收亚秒级的 GOP 下降(I 帧之间)。

空填充

当内容低于上限时,差异将用 MPEG-TS 空数据包 (PID 0x1FFF) 填充。

精确的节奏

出口被调整到精确的上限(繁忙旋转 ABSTIME);

产出图(河流)

真实线路的实时堆叠图 - 每个频段都是一个通道,从右侧平滑地流动。

彩色带

每个通道都有稳定的颜色;

上限/最大线

顶部的虚线 = 配置的上限(线上限)。

零带

顶部的白色虚线带 = 空填充(可用容量)。

掉落标记

时间线上的红色标记 = 发送队列溢出(丢弃)。

范围(30s–30m)

按钮立即切换时间窗口(客户端),活动窗口具有灰色背景。

工具提示

悬停显示当时每个通道的比特率、QP 和质量指数(历史值,而非实时值)。

上限%

当前池调节水平(池/(池-修剪))。

预留(滑块)

上限之上的公差范围 - 保留多少作为零储备。

缓冲液(滴)

标头显示发送队列 util % 和累积丢弃。

共和党

多路复用器中所有通道的通用 GOP 长度(在启动时锁定到视频配置文件中)。

VBV

编码器 VBV 缓冲区大小(毫秒)。

流卡和状态

多路复用器中的每个通道都有一张卡,其中包含名称、PNR、当前和目标比特率以及状态:

正在运行 — 通道正在编码并流向线路。

启动 — 编码器正在旋转/稳定。

关闭 — 通道处于多路复用器中但未运行 (0 kbps)。

故障 — 输入丢失/编码器崩溃。

PSI/SI 表(完整的 DVB 集)

StatMux 直接在 NIF mux 中生成全套强制 MPEG-TS / DVB 表 — 无需外部 SI 插入器。

桌子

PID

间隔

目的/来源

EIT ↔ EPG:完全集成

EIT(事件信息表,PID 0x12)不是静态的 - 它完全连接到应用程序的 EPG 系统。

通道大小(最小/平均/最大)

min = 下层(静态场景)。

平均值=目标水平。

max = 上限(峰值/削减的 VBR 余量)。

示例(平均):SD 1.5–2.5M · HD 2.5–4M · FHD 4–6M · UHD 12–18M。

与广播统计复用器的关系

我们进行真正的统计复用——共享固定线路的 VBR 通道之间的动态比特重新分配,并具有质量均衡。

我们拥有什么

CBR 线位于上限 · 1 s 缓冲区 · 每流比例分配 · C1 前瞻前馈 · 质量均衡 · 预测重新分配 · 空填充 · 精确节奏。

我们的不同之处

广播统计复用器使用编码器的率失真估计(精确的帧成本,编码器是分配器的从属)。

故障排除

症状

原因/修复

图表中的间隙/零峰值 (5–7M)

内容下降 — I 帧之间的 GOP(由 1 秒缓冲区吸收)或集体内容停顿(通过重新分配处理)。

掉落 > 0 攀登

发送队列溢出 — 内容超出上限。

一个通道保持低比特率/高 QP

静态内容(正确 - 它释放带宽)或配置文件中的最大值太低。

图表卡顿/左边缘擦除

客户端 — 新 JS 包的硬刷新 (Ctrl+Shift+R)。

cap % / 缓冲区在编辑后不会改变

LiveView 重新渲染 — 硬刷新。

架构(端到端)

SAT UDP SSM ─┐

每个流的 gst_encoder.py:SAT UDP SSM 输入 → nvh264enc rc-mode=cbr。

每个输入环(来自编码器的 TCP 环回)、2 通道排出(音频优先、视频已满)、比例分配器、NULL 焊盘精确到线帽 (CBR)、来自编码器的 PCR 直通。

1 个 MPTS(NIF 生成的 PAT/PMT/SDT)→ 输出 VLAN 上的 UDP 组播。

第 1 行:⚠(验证问题)· PNR· 框架中的姓名(颜色 = 州)。

第 2+ 行:最小·平均·最大 kbps·预测复杂性 Δ 低/中/高/峰值·输入丢失·⚙URL·编码器 Mbps·SID·service_type。

名称颜色 = 流状态:

Mbps

红色“cap”线:连线 CBR 上限 (mux.bitrate) — NULL 填充到此处。

橙色“余量 N%”线:= cap × 余量滑块 / 100。编码器 set_bitrate 目标瞄准此处。

内容和上限之间有黑点的灰色区域 = NULL 填充(未使用的保留)。

单击通道的色带 → 自动展开下方该通道的卡片。

日程

MuxEitAdapter 从每个服务的 EPG 系统中读取事件,构建 DVB EIT 部分(名称、时间、持续时间、描述、流派)并将其打包到 PID 0x12 上。

EIT 直接注入 NIF 多路复用器中,均匀地注入零空间(1 个数据包/N 输出 + 周期性的 p/f)——取代突发的外部 tsp 级联。

表 0x4E — 当前正在运行的 + 下一个事件。

多路复用器定期从 EPG 重新生成 EIT .bin(约 15 秒)——EPG 时间表更改无需重新启动即可到达线路。

表 0x50/0x51 — 提前的完整时间表小时/天(分段)。

差值计(图表上方)

实际流量与上限的指标。

-5 Mbps 上限 37000 kbps +5 Mbps

净空滑块(78–90%,默认 85)

较低(→78):更多的空储备,更安全,上限利用率不那么严格。

更高 (→90):更严格的上限利用率,更少的 NULL。

⚠ ≥88 %:滑块变黄 — 接近环溢出冻结上限。

不对称:降低可靠地增加储备;

控制编码器目标上限的多少:编码器目标 = 预算 × 余量% / 100(图表中的橙色线)。

信号丢失/通道故障(隔离)

一个通道发生故障(编码器崩溃/信号丢失)⇒ 多路复用器继续运行,其他通道不受影响,电线保持上限(NULL 吸收中断),幸存者的 CC=0。

PCR/计时

PCR 和 PES PTS/DTS 是来自编码器的直通(单时钟域⇒相干,无漂移)。

CAT — 条件接收(仅当加扰/ECM 时)。

EIT — 事件信息 (EPG) — 来自 EPG 系统,见下文。

NIT — 网络信息(网络 ID、名称、传输流)。

PAT — 节目列表(映射 PNR → PMT PID)。

PMT — 每个程序:视频/音频/PCR PID、编解码器、描述符。

SDT — 服务名称和提供商(STB 在列表中显示的内容)。

TDT/TOT — 时间和日期 + 本地偏移(STB 时钟)。

TSDuck Plugins Used

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