ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

二、MPP 媒体处理平台类(10 道)

二、MPP 媒体处理平台类(10 道)

11. 海思 MPP 平台的系统架构是什么?VI、VPSS、VENC 三者之间的关系和数据流向是怎 样的?

答:MPP 是海思提供的媒体软件处理平台,屏蔽芯片底层硬件细节,向应用提供 MPI(媒体处理接口)API。系统架构分四层:硬件层(Hi35xx 芯片+外围器件)、OS 层(Linux)、MPP层(VI/VPSS/VENC 等模块)、应用层(用户开发的软件系统)。

数据流向:VI(视频输入)通过 MIPI CSI 接口从 IMX586 采集 RAW Bayer 图像,进入 VPSS(视频处理子系统)进行预处理(去噪、缩放、锐化、畸变校正),再送入 VENC(视频编码)输出 H.264/H.265 码流。

12. MPP 系统中视频缓存池(VB Pool)的作用是什么?在 Hi3516 上如何合理配置 VB 块大小和数量?

答:VB Pool 是内存池,提供大块物理连续内存供 VI、VPSS 等模块使用,避免频繁分配释放
导致内存碎片。
配置 VB 块大小和数量需要平衡内存占用和帧率稳定性。之前遇到编码延迟从 200ms 降到 80ms,就是调整 VB 块大小(与编码图像尺寸匹配)和缓存块数量(保证流水线不阻塞)实现的。
【补充】
VB Pool(Video Buffer Pool)是海思 MPP预先申请的一组连续物理内存,用来存放 VI、VPSS、VENC之间传递的图像帧。

作用主要是:

  • 避免视频运行过程中频繁申请和释放大块内存;
  • 让 VI、VPSS、VENC共享图像缓冲区,减少内存复制;
  • 保证高分辨率、多路视频处理时的实时性。

典型流程:

VB Pool分配图像块 ↓ VI采集一帧并写入VB ↓ VPSS读取并处理 ↓ VENC读取并编码 ↓ 所有模块释放后,VB块回到池中复用

VB块大小如何配置

块大小由以下参数决定:

  • 分辨率;
  • 像素格式,如 YUV420、RAW10;
  • 位宽;
  • stride和内存对齐;
  • 是否使用压缩格式。

例如1920×1080的 YUV420图像,理论大小为:

1920 × 1080 × 1.5 ≈ 3 MB

但实际配置还要考虑宽高对齐、stride和压缩头,不能直接写死。应调用海思 SDK提供的图像缓冲区大小计算接口,再把结果配置给blk_size。

概念示例:

vb_cfg.common_pool[0].blk_size=get_pic_buffer_size(1920,1080,PIXEL_FORMAT_YUV420,...);vb_cfg.common_pool[0].blk_cnt=8;

不同 SDK版本的计算函数名称可能不同,应以 Hi3516CV610 SDK头文件和 sample代码为准。

VB块数量如何配置

数量要覆盖各模块同时占用的帧数:

VI缓存 + VPSS处理缓存 + VENC编码缓存 + 安全余量

例如单路1080P编码,可以先配置约8~10块,再根据运行情况调整:

  • 块数太少:可能出现获取 VB失败、丢帧、卡顿或无图。
  • 块数太多:占用过多连续物理内存,导致系统可用内存减少。

多分辨率时通常建立多个 Pool:

Pool 0:1080P主码流,约3 MB/块 Pool 1:640×360子码流,约0.35 MB/块 Pool 2:抓图或其他专用缓存

面试总结:

VB Pool是 VI、VPSS和 VENC之间共享的视频帧缓存池,通过预分配连续物理内存实现帧复用和少拷贝。块大小根据最大分辨率、像素格式、位宽、对齐和压缩方式,使用厂家接口计算;块数量根据流水线上同时占用的帧数并留出一定余量配置。实际运行中再根据 VB不足、丢帧情况和内存占用进行调整。

13. VI 模块的“在线模式”和“离线模式”有什么区别?项目中用哪种?为什么?

答:在线模式:VI 不写 DDR,直接把数据流送给 VPSS,延迟极低但灵活性差;
离线模式:
VI 先写数据到 DDR,VPSS 从 DDR 读取,灵活性高但延迟增加。
执法仪需要视频同步编码和网络传输,通常用离线模式,因为需要 VPSS 将同一路图像缩放成多路不同分辨率(主码流存储+子码流网传)。

【补充】
VI的在线、离线模式,核心区别是:VI输出的图像是否先写入 DDR。

在线模式

Sensor → VI/ISP → VPSS → VENC 不经过DDR中转

VI生成图像后直接交给 VPSS:

  • 延迟低;
  • DDR带宽和内存占用小;
  • 适合单路实时预览、编码和低延迟推流;
  • 灵活性较低,不方便应用直接获取 VI原始帧。

离线模式

Sensor → VI/ISP → DDR中的VB缓存 → VPSS → VENC

VI先把图像写入 VB缓存,再由 VPSS读取:

  • 可以获取、保存或分析 VI输出帧;
  • 方便多模块复用和调试;
  • 支持更灵活的处理流程;
  • 会增加 DDR读写带宽、缓存占用和处理延迟。

14. VPSS 支持哪些图像处理功能?在项目中你用了哪些?

答:
VPSS主要承担图像缩放、裁剪、格式转换、帧率控制和多通道分流。
项目中我用它将 VI的一路图像转换为不同分辨率和帧率,分别送给主码流、子码流和抓图通道,从而避免 Sensor重复采集。

【补充】
VPSS(视频处理子系统)位于 VI和 VENC之间,主要负责对 VI输出的图像进行处理和多通道分发。

常见功能包括:

  • 图像缩放;
  • 裁剪;
  • 多通道输出;
  • 帧率控制;
  • 像素格式转换;
  • 降噪和图像增强;
  • 镜像、翻转等处理;
  • 将同一输入转换成不同分辨率,分别用于主码流、子码流和抓图。

具体是否支持旋转、畸变校正等功能,需要以 Hi3516CV610的 MPP接口为准,部分功能可能由 VI、VGS或 GDC模块完成,而不是 VPSS。

项目中可以这样回答:

项目中主要使用了 VPSS的缩放、多通道输出和帧率控制。VI输入一路高分辨率图像后,VPSS主通道保持较高分辨率,送给 VENC生成主码流;子通道将图像缩小并降低帧率,生成低码率子码流,用于远程预览;另外保留一个通道用于抓图或算法处理。

例如:

VI输出:1920×1080,30 fps ↓ VPSS ├─ 通道0:1920×1080,30 fps → H.265主码流 ├─ 通道1:640×360,15 fps → H.264子码流 └─ 通道2:指定分辨率 → 抓图或算法

面试总结:

VPSS主要承担图像缩放、裁剪、格式转换、帧率控制和多通道分流。项目中我用它将 VI的一路图像转换为不同分辨率和帧率,分别送给主码流、子码流和抓图通道,从而避免 Sensor重复采集。

15. VENC 编码通道如何接收 VPSS 输入的图像?如何配置编码参数(码率、帧率、GOP)?

项目中先创建 VENC通道并启动接收,再通过SYS_Bind将 VPSS输出通道绑定到 VENC输入,MPP会自动完成图像传递。编码参数在创建 VENC通道时配置,包括 H.264/H.265、分辨率、CBR或VBR、目标码率、源帧率、目标帧率和 GOP。比如1080P、25帧的 H.265主码流配置约2~4 Mbps,GOP设为50,即约2秒一个关键帧。最后应用程序从 VENC通道循环获取并释放编码码流。
【补充】
VENC接收 VPSS图像通常有两种方式。

1. 系统绑定——项目常用

先创建 VPSS和 VENC通道,然后通过 MPP绑定接口连接:

VPSS通道 → VENC编码通道

概念代码:

ot_mpp_chn src;ot_mpp_chn dst;src.mod_id=OT_ID_VPSS;src.dev_id=vpss_grp;src.chn_id=vpss_chn;dst.mod_id=OT_ID_VENC;dst.dev_id=0;dst.chn_id=venc_chn;ss_mpi_sys_bind(&src,&dst);

绑定后,VPSS输出的图像由 MPP内部自动送给 VENC,不需要应用层逐帧复制。应用程序只需从 VENC获取编码码流。

2. 手动送帧

应用程序先从 VPSS获取图像,再调用 VENC送帧接口:

VPSS_GetChnFrame() ↓ VENC_SendFrame() ↓ VPSS_ReleaseChnFrame()

这种方式适合需要在编码前进行算法处理或修改图像的场景,但处理流程和资源管理更复杂。

编码参数配置

创建 VENC通道时需要配置:

  • 编码类型:H.264、H.265或 JPEG;
  • 分辨率:必须与 VPSS输出分辨率匹配;
  • 码率控制:CBR、VBR或 AVBR;
  • 目标码率;
  • 源帧率和目标帧率;
  • GOP长度;
  • Profile、码流缓冲区等参数。

例如1080P实时编码可以配置:

编码格式:H.265 分辨率:1920×1080 源帧率:25 fps 目标帧率:25 fps 码率模式:CBR 目标码率:2048~4096 kbit/s GOP:50

25 fps、GOP为50表示每50帧产生一个关键帧,也就是大约每2秒一个 I帧:

关键帧间隔 = GOP ÷ 帧率 = 50 ÷ 25 = 2秒

参数选择原则:

  • 码率越高,画质越好,但网络和存储压力越大;
  • GOP越小,关键帧越频繁,起播和错误恢复更快,但码率更高;
  • GOP越大,压缩效率更高,但拖动、起播和丢包恢复较慢;
  • 目标帧率不能高于 VPSS实际输出帧率。

面试回答:

项目中先创建 VENC通道并启动接收,再通过SYS_Bind将 VPSS输出通道绑定到 VENC输入,MPP会自动完成图像传递。编码参数在创建 VENC通道时配置,包括 H.264/H.265、分辨率、CBR或VBR、目标码率、源帧率、目标帧率和 GOP。比如1080P、25帧的 H.265主码流配置约2~4 Mbps,GOP设为50,即约2秒一个关键帧。最后应用程序从 VENC通道循环获取并释放编码码流。

16. 视频编码过程中遇到花屏、卡顿或编码延迟突然增大,如何排查?

答:按顺序排查,第一确认摄像头输出正常(v4l2-ctl --stream-mmap --stream-count=1000测试,观察dmesg有无buffer queue underrun);第二步检查 VPSS 通道绑定关系,用memdump分析编码器输入帧;第三步用tcpdump抓 RTP 封包看序列号是否连续。

17. MPP 系统初始化需要做哪些工作?为什么必须先初始化 VB Pool 才能启动 VI?

参数准备:VI-VPSS-VENC基础参数
初始化分配VB
VI初始化

VI必须在 VB初始化之后启动,因为采集到的每帧图像都需要从 VB Pool取得连续物理缓冲区;没有 VB,VI就无法保存和传递图像。

18. 如何通过调试节点查看 VI 的工作状态?帧率异常时如何调整 settle time?

答:在/sys/kernel/debug/mpp/vi节点查看当前或上次工作状态:CSI_TOP 和 CSI_ISP 对应工
作频率;input行显示 CSI 接收到的图像尺寸和格式;output行显示输出尺寸和格式;最后
一行显示平均帧间隔、最大帧间隔、最小帧间隔,可以计算帧率。
调 整 settle time 可 以 通 过 MIPI 子 设 备 的settle_time节 点 在 线 修 改 ( 路 径 类 似
/sys/devices/platform/soc/5800800.vind/5810100.mipi),echo增大值直到不出图,再取略
低于最大值的数值即可,调整范围 0x00-0xff。

19. MPP 的音频处理模块(AI/AENC)如何与视频流同步?音频卡顿或杂音怎么排查?

答:音频通过 AI(音频输入)采集后,经 AENC(音频编码)得到 AAC/MP3 码流,与视频共
用时间基准实现同步(每帧 PTS 时间戳对齐)。音频问题排查:用示波器抓 I2S 时钟信号看
是否被 WiFi 模块干扰,调整音频采样率(48kHz→44.1kHz)匹配设备能力,检查 I2S 时钟相
位和位时钟(BCLK)频率是否正常,用aplay -l确认声卡设备是否正确。

20. VPSS 通道绑定关系和缩放配置如何修改?主码流分辨率切换时需要重建所有通道吗?

答:VPSS 支持HI_MPI_VPSS_GetChnAttr和SetChnAttr接口动态调整通道属性。切换主码流
分辨率时,不需要完全销毁重建整个 Group——可以通过动态调整 VPSS 通道的缩放参数实
现平滑切换,同时保持子码流通道固定,避免频繁重建导致远程预览中断。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进