多路 RTSP 视频管线与负载调度可执行手册
调研日期:约 2026-10-25(Asia/Shanghai)
定位:站端边缘盒「拉流 → 硬解 → 预处理 → 推理 → 跟踪/规则 → MQTT」分线程管线、路数/分辨率调度、背压与断流重连;对齐网关 BOM A/B/C 三档。
上游衔接:edge-ai-substation-gateway-bom.md、edge-ai-gstreamer-ota-cheatsheet.md、edge-ai-cn-npu-iva-gstreamer.md、edge-ai-mqtt-hardening-offline-buffer.md、edge-ai-board-fps-power-matrix.md、edge-ai-cn-npu-fps-matrix.md、edge-ai-event-schema-acceptance.md、edge-ai-model-signstore-mender-cookbook.md。
多路能力为公开示例/社区量级,非合同保证;精确端到端 FPS 禁止编造,未核到处标 unknown。
0. 一句话结论
解码、推理、NMS/跟踪、MQTT 分线程 + 有界队列;过载时 丢帧保推理,断 MQTT 不堵热路径。路数按 BOM:A=1–2 / B=4–8 / C=16–32,优先 降帧 → ROI → 隔帧推理,再砍路。Zoo / model-only FPS 不进合同;验收只认目标站 端到端 稳定 FPS 与热降频否决项。
1. 管线拓扑(统一逻辑视图)
[国标枪机 RTSP]
│ TCP 优先;jitterbuffer / latency
▼
┌─ 拉流线程池(每路或每组) ─┐
│ rtspsrc / FFmpeg / 厂商 demux │
└──────────────┬──────────────┘
▼
┌─ 硬解线程(VPU) ──────────┐
│ H.264/H.265 → NV12/NVMM/CMM │
└──────────────┬──────────────┘
▼ 有界 decode_q(满则丢最旧)
┌─ 预处理(RGA / BMCV / VPP / PYM)┐
│ letterbox / ROI crop / CSC │
└──────────────┬──────────────────┘
▼ 有界 infer_q(满则丢帧保推理)
┌─ 推理线程池(NPU/GPU) ────┐
│ YOLO INT8/FP16;batch 对齐路数或 1 │
└──────────────┬─────────────┘
▼
┌─ 后处理 / 跟踪 / 规则 ─────┐
│ NMS → ByteTrack/IoU → 多边形闯入 / PPE 规则 │
└──────────────┬─────────────┘
▼ 有界 event_q(满则优先丢 telemetry)
┌─ MQTT 异步发布(旁路) ────┐
│ events QoS1;telemetry QoS0;断线本地环缓 │
└────────────────────────────┘
线程边界原则
| 阶段 | 建议线程归属 | 禁止事项 |
|---|---|---|
| 拉流 + 硬解 | 每路独立或「解码池」;阻塞 I/O 不出推理线程 | 在推理线程里同步 connect/read |
| 预处理 | 紧挨解码回调或独立 RGA/VPP 池;尽量 DMA-BUF / 设备内存 | 每帧 memcpy 回 host 再 resize(DDR 先炸) |
| 推理 | NPU/GPU worker 数 ≈ 核数或 batch 槽;单上下文勿跨线程乱抢 | 推理线程同步 mosquitto_publish |
| NMS / 跟踪 / 规则 | CPU 侧独立或同推理后半段;规则引擎可再拆 | 重规则(OCR 全图)塞进每帧热路径 |
| MQTT / 抓拍 | 纯旁路;有界队列 + 丢弃策略 | 队列无界、同步等待 ACK 堵死管线 |
1.1 与三大粘合层对照
| 层次 | NVIDIA DeepStream(BOM B Orin) | 算能 sophon-stream(BOM C) | 瑞芯微 MPP+RGA+RKNN(BOM A/B) |
|---|---|---|---|
| 拉流 | uri/rtspsrc;live-source=1;latency/drop-frame-interval |
JSON channels[].url;sample_interval 跳帧 |
FFmpeg/rtspsrc + TCP;社区 ZLM 等 |
| 复用/批 | nvstreammux → 批进 nvinfer;多模型用 tee + 并行分支;IPC 共享解码见官方 sample |
element 图:decode→yolo*→bytetrack→blank;thread_number 分前/推/后 |
无官方 mux;自管队列;三核 NPU 各一 worker 常见 |
| 硬解 | NVDEC;输出 NVMM | h264_bm/h265_bm;设备 bm_image |
MPP;NV12,高对齐(如 1088) |
| 预处理 | nvvideoconvert / mux 缩放 |
BMCV VPP | RGA letterbox(勿默认 OpenCV) |
| 推理 | nvinfer / nvinferserver;.engine |
BMRuntime + .bmodel;可选 tpu_kernel 后处理 |
RKNN Runtime + .rknn;零拷贝 DMA-BUF |
| 跟踪 | nvtracker |
bytetrack element |
CPU ByteTrack/IoU(社区) |
| 事件出口 | nvmsgbroker + MQTT proto(旁路) |
blank/doWork 异步 MQTT |
appsink / SHM → 后台发布 |
| 官方骨架 | GStreamer IVA 最完整 | JSON Pipeline,非 gst 主路径 | 编解码 gst 成熟;推理多为自研/社区 |
公开多路量级(仅量感,须自测)
| 平台 | 公开叙述量级 | 备注 |
|---|---|---|
| Orin + DeepStream | 4~8+ 路 1080p 分析常见工程目标;吞吐上限 ≈ trtexec QPS / 路数 |
batch-size 须对齐源数;live 调 batched-push-timeout |
| BM1684X + sophon-stream | 官方 YOLO 例程 SOC:约 8 路合计 百~二百+ FPS 量级(INT8,条件见仓库 README);硬解宣传可达 32 路量级 | 硬解路数 ≠ 分析路数;管线总 FPS 见 demo,勿写「单路×32」 |
| RK3588 MPP+RKNN | 社区/厂商蓝图:8~16 路 1080p 解码+检测有案例;DDR/温升常先于 TOPS 触顶 | 16 路需降帧/隔帧;85 ℃ 级热降频须进散热设计 |
不确定或条件不可复现处标 unknown,写入合同前一律改为目标站实测表。
2. 路数与分辨率调度表(对齐 BOM A/B/C)
口径:输入默认 1080p@25 H.265;模型默认 YOLO-n/s 640 INT8;下列为建议工程档位,非厂商 SLA。
| 档 | SoC(BOM) | 建议分析路数 | 默认采集 | 推理策略 | 过载降级阶梯(先→后) |
|---|---|---|---|---|---|
| A 入门 | RK3588J | 1–2 实时;POC 可试 4 | 1080p@25;推理 10~15 FPS/路 | 每路独立或单 worker;batch=1 | ①推理 15→10→5 FPS ②ROI 半幅 ③隔 2/3 帧 ④第 3+ 路只解码预览 |
| B 标准 | Orin Nano Super 或 RK3588/CV186AH | 4–8 | 1080p;关键点 15 FPS,次要点 5~8 FPS | Orin:mux batch≈路数;RK:3 NPU worker 轮询 | ①次要路降帧 ②非警戒区 ROI ③烟火/PPE 分时隙 ④砍至 4 路保关键 |
| C 汇聚 | BM1684X(SE7 类) | 16–32 硬解容量内;同时深分析常 ≤8~16 | 分组:A 组 15 FPS 分析,B 组 5 FPS/隔帧,C 组仅动检触发 | sophon-stream 多 channel + sample_interval;batch 1 或 4 按模型 | ①B/C 组先降 ②动检门控推理 ③夜间降一半路 ④超温砍路保温 |
2.1 降帧 / ROI / 隔帧推理
| 策略 | 做法 | 适用 | 副作用 |
|---|---|---|---|
| 源侧降帧 | DeepStream drop-frame-interval;sophon sample_interval;自研「每 N 帧入 infer_q」 |
全档默认应有 | 快速目标漏检↑;跟踪需更大 max_age |
| ROI | 多边形/矩形裁切后再 letterbox;电子围栏只推警戒带 | 闯入、表计、油位 | 标定漂移需运维工具;禁写死像素不跟分辨率 |
| 隔帧推理 | 奇数帧推理、偶数帧只跟踪预测;或 2 路一模型时隙 | B/C 多路 | PPE 漏检窗口;应用时间积分/漏桶防抖 |
| 分辨率降档 | 摄像机副码流 720p/D1 进分析;主码流只录像 | A 档 POC、C 档次要点 | 小目标(火花、远距帽)召回↓ |
| 任务分时 | 同一路:T0 PPE,T1 烟火,T2 异物;共享解码 | B/C 单卡多模型 | 单任务瞬时 FPS 下降,须写清 SLA |
调度优先级(电力站端建议)
- 人身/安监:PPE、闯入(
PPE_VIOLATION/PERSON_INTRUSION)— 保 FPS。 - 烟火:可略低于人员,但禁止长时间饿死。
- 设备外观:绝缘子/鸟巢/异物 — 可隔帧或巡检式。
- 预览/OSD 编码:最先降或关掉非必要编码。
3. 背压:有界队列 · 丢帧保推理 · 断流重连
3.1 队列水位(建议默认)
| 队列 | 容量(帧) | 满时策略 | 指标名 |
|---|---|---|---|
decode_q |
2~4 / 路 | 丢最旧(live);记 drop_decode |
防 jitter 堆积 |
infer_q |
2~4 全局或 /worker | 丢最旧保推理;绝不阻塞解码回调过久 | drop_infer |
track_q |
4~8 | 丢最旧;跟踪用上一状态外推 | drop_track |
event_q |
64~256 事件 | 见 MQTT 手册:先丢 telemetry/frames,保 events | drop_event、mqtt_q_depth |
snapshot_q |
8~16 | 丢最旧 JPEG;对象存储异步 | drop_snap |
硬规则:任一队列 禁止无界;push 失败只打点,不得 sleep 在解码/NPU 线程等待 MQTT。
3.2 背压联动伪策略
if npu_util > 90% or infer_q > high_watermark for 3s:
reduce infer_fps on lowest-priority cameras by 1 step
if soc_temp > T_warn:
disable OSD encode; then cut C-group streams
if mqtt_q_depth > 80%:
drop telemetry/frames; keep events; never block infer
3.3 断流重连
| 项 | 建议 |
|---|---|
| 传输 | RTSP TCP(protocols=tcp);UDP 仅实验室 |
| 超时 | latency 200~800 ms 量级起调;读超时后标记 cam_state=DOWN |
| 退避 | 重连间隔 1s → 2s → 5s → 10s,封顶 30s;成功后复位 |
| 健康 | 每路 last_frame_ts;>3 s 无帧 → 重建 demux/decoder(勿只重连 socket) |
| 会话 | 摄像机踢流/改密后需运维 cmd 热更新 URL;密钥走 vault,不进明文配置仓 |
| 事件 | 可选上送 CAMERA_STREAM_LOSS(运维类);禁止当保护遥信 |
DeepStream 侧关注 rtsp-reconnect-* 类配置与版本差异;RK/FFmpeg 自管 watchdog 线程。验收:拔网线 5 min 再插,该路恢复且 其他路 FPS 跌落 ≤5%。
4. 资源监控与 telemetry 字段
对齐 MQTT .../telemetry(QoS0,可丢)与 Schema 手册;周期建议 2~5 s。
| 字段 | 类型 | 含义 | 采集提示 |
|---|---|---|---|
ts |
int/string | 设备时区或 UTC+偏移 | NTP 对齐 |
cpu_pct |
float | 整机 CPU % | /proc/stat |
mem_pct / mem_used_mb |
float | 内存 | 含 DMA/CMA 紧张时另记 |
npu_pct |
float 或数组 | NPU/TPU/GPU 利用率 | RK:三核分列;算能:bm-smi;Orin:tegrastats |
soc_temp_c |
float | SoC 温度 ℃ | thermal_zone;满载 30 min 降频否决 |
fps_in / fps_infer / fps_out |
object per cam | 入流/推理/(可选)编码 FPS | 滑动 5~10 s 窗 |
drop_decode / drop_infer / drop_event |
uint 增量 | 背压丢帧/丢事件计数 | 单调计数,看板做差分 |
mqtt_q_depth |
uint | 发布队列深度 | 与加固手册一致 |
cam_state |
map | UP/DOWN/RECONNECTING | 每路 |
model_ver |
string | 内容哈希 / 签名仓版本 | 与 model.ver 一致 |
power_w |
float | 可选整机功率 | unknown 则省略,勿瞎填 |
看板告警建议:soc_temp_c 超阈、drop_infer 持续增长、fps_infer 低于档位基线 30%、任一路 DOWN>60 s。
5. 两周联调清单
第 1 周:单路 → 额定路数
| Day | 动作 | 产出 |
|---|---|---|
| D1 | 定档 A/B/C;冻结 SDK(JetPack/RKNN/libsophon)与模型签名包 | 《基线》 |
| D2 | 单路 RTSP TCP 硬解冒烟;确认 NV12/NVMM/CMM caps | 日志+截帧 |
| D3 | 接入 YOLO;测 单路端到端 FPS/温度(写清是否含 NMS) | 基线条 |
| D4 | 拆线程:decode / infer / mqtt;队列有界;杀 Broker 5 min | FPS 跌落 ≤5% 记录 |
| D5 | 加到档位额定路数;调降帧/ROI;记录 drop_* |
多路曲线 |
| D6–7 | 跟踪+一条业务规则(PPE 或闯入);事件符合 Schema | 样例 JSON |
第 2 周:过载 · 故障 · 验收
| Day | 动作 | 产出 |
|---|---|---|
| D8 | 故意超配 +2 路,验证降级阶梯自动/半自动 | 降级日志 |
| D9 | 单路反复断流;多路中杀一路 demux | 他路稳定证明 |
| D10 | 满载 30 min:温度、降频、DDR;Orin/RK 看风扇与壳温 | 热报告 |
| D11 | 模型热更新(签名仓);错签 → MODEL_VERIFY_FAIL,推理不崩 |
OTA 记录 |
| D12 | telemetry 进看板;与 104 只读镜像联调(若有) | 点表对照 |
| D13–14 | 整理《端到端 FPS 表》进验收包;删除一切 Zoo FPS 合同表述 | 签字页 |
5.1 联调期最小配置骨架(示意)
以下为逻辑示意,字段名随 SDK 版本变化;上线前以各档官方文档钉死。
DeepStream(B 档 Orin)要点
- 每路
[sourceN]:type=4(RTSP)或 uri;live-source场景开 live;按需drop-frame-interval。 [streammux]:batch-size等于有效源数;batched-push-timeout按 33~40 ms 量级起调(unknown 以实测为准)。[primary-gie]:batch-size与 mux 对齐;精度 FP16/INT8 写入《基线》,换 JetPack 必重建.engine。- 消息:
nvmsgconv→nvmsgbroker(MQTT);长跑关注断线重连行为,业务侧仍保留本地 event_q。
sophon-stream(C 档)要点
channels列表填 RTSP URL;用sample_interval做源侧隔帧。- 前处理 / 推理 / 后处理 element 分别设
thread_number(官方 YOLO 例程常见 4-4-4 量级)。 - 在
blank(或等价)读检测元数据 → 异步入event_q;禁止在推理 element 内同步网络 IO。 - 监控:
bm-smi看 TPU/设备内存;与fps_infer对照,避免「TPU 100% 但队列在涨」的假满载。
RK MPP + RKNN(A/B 档)要点
- 解码回调输出 NV12(注意 stride/高度对齐)→ RGA letterbox → 三 NPU worker 轮询。
infer_q全局深度 2~4;满则丢最旧。- 预览编码与分析争用 RGA/DDR 时,优先关 OSD 或降预览分辨率。
- 温度:
thermal_zone*;持续 >80~85 ℃ 量级应触发降级阶梯(具体阈写入机柜热设计,勿抄博客)。
5.2 常见故障速查
| 现象 | 优先排查 | 处置 |
|---|---|---|
| 多路后单路 FPS 雪崩 | mux batch 与源数不一致;DDR 拷贝;OpenCV resize | 对齐 batch;打通 DMA-BUF/BMCV;改 RGA/VPP |
| 解码 OK、推理饿死 | infer_q 过小且误用阻塞 push;worker=0 |
改丢帧策略;核数≥1 worker |
| 推理 OK、告警延迟大 | MQTT 同步;event_q 无界导致 GC/OOM |
旁路异步;有界+丢 telemetry |
| 一路断流拖死全进程 | 解码异常未隔离;共享 demux 崩溃 | 每路独立管线或监督重启单路 |
| 夜间误报暴涨 | 降帧过猛 + 跟踪 max_age 过大 | 调置信度/冷却;红外补光或降敏感 |
| 热降频 | 壳温/积灰/风扇;Orin 未换工业载板 | 降路数;改善导轨散热;查功率模式 |
6. 硬红线(否决项)
| # | 红线 | 说明 |
|---|---|---|
| R1 | Zoo / model-only FPS 不进合同 | 投标与验收只认目标站、含硬解+预处理+NMS 的端到端表 |
| R2 | 断 MQTT 不堵推理 | 人为断 Broker ≥5 min,解码+推理 FPS 跌落 ≤5%;恢复无 OOM |
| R3 | 队列必须有界 | 禁止无限 std::queue 堆积解码帧 |
| R4 | 丢帧保推理 | 过载时牺牲次要路/预览,不牺牲 NPU 队列死锁 |
| R5 | 禁止跨保 | 管线事件默认 quality=suspect;不得驱动跳闸/强制联锁 |
| R6 | 硬解路数 ≠ 分析路数 | C 档「32 路解码」不得写成「32 路实时 YOLO」 |
7. 与系列文档的挂钩
| 主题 | 本文职责 | 详见 |
|---|---|---|
| 硬件档位 | 调度表 A/B/C 行 | 网关 BOM |
| 粘合层元素名 | DeepStream / sophon / MPP 对照 | 国产 IVA、GStreamer/OTA |
| 事件与 Topic | 管线只产 JSON,旁路上送 | Schema、MQTT 加固 |
| 算力量级 | 不引用 Zoo 作承诺 | 板 FPS 矩阵、国产 NPU FPS |
| 模型日更 | 热路径读 model_ver,不阻塞解码 |
签名仓 + Mender |
8. 许可与引用边界
DeepStream、RKNN、Sophon SDK、GStreamer 插件等许可以各厂商 EULA/SPDX 为准,嵌入发行前过许可台账。第三方多路 Demo(GitHub/博客)FPS 仅作联调启发,不进标书数字。本文不构成性能保证。