3、多路视频处理流程:视频采集、解码、预处理、推理、后处理、编码输出的完整pipeline

多路视频NPU部署的核心挑战,不在于单路视频的极致性能,而在于多路并发时的资源调度与吞吐稳定性。一个完整的视频处理pipeline通常包含六个关键阶段:视频采集、解码、预处理、推理、后处理、编码输出。每个阶段都可能成为瓶颈,且阶段之间的数据传递方式(内存拷贝、零拷贝、异步队列)直接影响整体帧率与延迟。本章将逐一拆解每个阶段的工程要点,并给出多路场景下的资源分配与调优方法。

多路视频NPU部署Pipeline全景 视频采集 RTSP/USB/文件 视频解码 H.264/H.265/VP9 预处理 缩放/归一化/通道转换 NPU推理 模型推理/多路并发 后处理 NMS/解码/跟踪 编码输出 H.264/RTMP/文件 码流 YUV Tensor 输出张量 结构化数据 共享资源池(多路复用) 解码器池 (N路) 预处理线程池 NPU任务队列 后处理线程池 编码器池 (M路) 关键瓶颈与调优点 ① 解码器数量限制 ② 内存带宽竞争 ③ NPU算子调度 ④ 编码器实时性

3.1 视频采集与解码:多路输入的工程基础

视频采集阶段决定了整个pipeline的数据源质量与格式。在边缘设备上,常见的采集方式包括RTSP网络流、USB摄像头、本地视频文件以及HDMI输入。多路场景下,采集环节的核心问题不是“能不能读到数据”,而是“如何保证多路数据到达的同步性与稳定性”。RTSP流可能因为网络抖动导致丢包或延迟,USB摄像头可能因为带宽共享导致帧率下降,本地文件则相对可控。

解码阶段是将压缩码流(H.264/H.265等)转换为YUV原始帧的过程。边缘设备通常使用硬件解码器(VPU或GPU中的专用模块)来降低CPU负载。以瑞芯微RK3588为例,其内置VPU支持同时解码多路1080p@60fps或4K@30fps。但硬件解码器数量有限,例如RK3588的VPU最多支持8路1080p解码,超过该路数就需要考虑分时复用或降低分辨率。

解码器选择要点:
  • 硬件解码优先:使用VPU/GPU硬解,避免CPU软解占用大量算力。
  • 解码器池化:创建固定数量的解码器实例,通过队列分配任务,避免频繁创建销毁。
  • 分辨率适配:根据NPU输入要求,解码时直接输出对应分辨率(如640×640),减少后续缩放开销。
  • 帧率控制:对于非实时分析场景,可跳帧解码(如每2帧解1帧),降低带宽与算力消耗。

3.2 预处理与推理:NPU数据格式转换与调度

预处理阶段将YUV帧转换为NPU所需的张量格式。典型操作包括:色彩空间转换(YUV→RGB)、尺寸缩放(如1920×1080→640×640)、归一化(除以255或使用均值方差)、通道重排(NHWC→NCHW)。这些操作看似简单,但在多路场景下会消耗大量CPU或GPU资源。如果预处理耗时超过单帧间隔(如33ms@30fps),就会成为瓶颈。

推理阶段是NPU的核心工作负载。多路推理有两种主流调度方式:批处理(batching)和多流并发(multi-stream)。批处理将多路帧拼接成一个batch输入NPU,提高算子利用率;多流并发则让NPU同时处理多个独立推理任务。实际部署中,通常采用“动态批处理”策略:当队列中积累的帧数达到阈值(如4帧)时触发一次推理,否则等待超时(如5ms)后以当前帧数推理。

调度方式 优点 缺点 适用场景
静态批处理 实现简单,算子利用率高 延迟高,需凑满batch 离线分析、非实时
动态批处理 延迟与吞吐平衡 需调优阈值与超时 实时多路监控
多流并发 延迟低,独立性强 算子利用率可能下降 路数少但实时性要求高

3.3 后处理与编码输出:结构化数据与回显

后处理阶段将NPU输出的原始张量转换为业务可用的结构化结果。以目标检测为例,后处理包括:阈值过滤(confidence > 0.5)、非极大值抑制(NMS)、类别映射、目标跟踪(如DeepSORT)。后处理通常使用CPU执行,多路场景下需要采用多线程并行处理。每路视频分配一个后处理线程,或者使用线程池统一调度。

编码输出阶段将推理结果叠加到原始视频帧上(画框、标注),再编码为H.264/H.265流,推送到RTMP服务器或写入本地文件。编码同样建议使用硬件编码器。需要注意的是,编码输出并非所有场景都需要——如果只做结构化数据上报(如JSON),则无需编码回显,可节省大量算力。

常见误区:很多开发者将“编码输出”视为必须环节,导致不必要的算力浪费。在纯分析场景(如人数统计、车牌识别)中,直接输出结构化数据即可,无需编码视频流。只有在需要人工监看或录像留存时,才启用编码输出。

3.4 案例拆解:8路1080p实时检测系统的Pipeline调优

某智慧园区项目需要在RK3588平台上部署8路1080p@25fps的实时行人检测系统。初始方案直接使用OpenCV读取RTSP流,CPU软解,模型输入640×640,后处理单线程,编码输出8路RTMP。实测结果:CPU占用率95%,NPU利用率仅40%,整体帧率不足10fps,系统严重卡顿。

分析过程:通过perf工具定位,发现CPU主要消耗在软解(约40%)和预处理(约30%),后处理占15%,编码占10%。NPU利用率低是因为推理任务串行提交,且每路帧到达时间不齐,导致batch size始终为1。

优化步骤:

  1. 启用硬件解码:使用RK3588的VPU硬解,将解码CPU占用从40%降至5%。
  2. 预处理优化:使用RGA(Rockchip Graphics Accelerator)硬件加速缩放与格式转换,CPU占用从30%降至8%。
  3. 动态批处理:设置batch阈值4帧,超时5ms。将8路帧统一送入推理队列,NPU利用率提升至75%。
  4. 后处理线程池:创建4个后处理线程,每个线程处理2路结果,CPU占用控制在15%。
  5. 编码降级:仅对4路关键画面编码输出,其余4路只上报结构化数据。

结果对比:优化后CPU占用降至35%,NPU利用率75%,整体帧率稳定在25fps,端到端延迟从500ms降至120ms。代价是编码输出路数减半,但业务方确认4路回显已满足需求。

复盘经验:多路pipeline调优的核心是“找到瓶颈并转移瓶颈”。本案例中,初始瓶颈在CPU软解,通过硬件解码转移至NPU;随后NPU利用率不足,通过动态批处理提升;最后CPU后处理成为新瓶颈,通过线程池并行解决。每一步都要用数据说话,避免盲目优化。

3.5 多路Pipeline的通用设计原则与常见误区

综合以上分析,多路视频pipeline的设计应遵循以下原则:

  • 硬件加速优先:解码、缩放、编码尽量使用专用硬件模块,释放CPU给后处理与业务逻辑。
  • 异步流水线:每个阶段之间使用有界队列解耦,避免同步等待导致整体帧率下降。
  • 资源池化:解码器、线程、内存缓冲区均采用池化设计,避免动态创建销毁的开销。
  • 动态负载均衡:根据各路视频的复杂度(如画面变化率)动态调整处理优先级,避免某一路拖垮整体。
  • 内存零拷贝:尽量使用DMA-BUF等机制在硬件模块间直接传递数据,减少CPU拷贝。
常见误区总结:
  • 误区一:认为路数越多越好,忽略解码器数量上限。超过硬件解码能力时,应降低分辨率或帧率。
  • 误区二:预处理使用CPU逐帧操作,未利用硬件加速。在8路以上场景,CPU预处理必然成为瓶颈。
  • 误区三:推理batch size固定不变,导致低峰期浪费算力、高峰期排队。应使用动态批处理。
  • 误区四:后处理单线程串行,多路结果排队处理。应使用线程池并行。
  • 误区五:所有路数都编码输出,浪费编码器资源。应根据业务需求选择性输出。