海思MPP媒体处理平台架构与实践
一、MPP总体架构
海思MPP(Media Process Platform)是基于硬件加速的模块化媒体处理平台,采用分层设计,所有核心操作均由专用硬件完成,CPU仅负责控制和调度。
#mermaid-svg-DDjor5ZXX40xdKxF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DDjor5ZXX40xdKxF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DDjor5ZXX40xdKxF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DDjor5ZXX40xdKxF .error-icon{fill:#552222;}#mermaid-svg-DDjor5ZXX40xdKxF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DDjor5ZXX40xdKxF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DDjor5ZXX40xdKxF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DDjor5ZXX40xdKxF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DDjor5ZXX40xdKxF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DDjor5ZXX40xdKxF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DDjor5ZXX40xdKxF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DDjor5ZXX40xdKxF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DDjor5ZXX40xdKxF .marker.cross{stroke:#333333;}#mermaid-svg-DDjor5ZXX40xdKxF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DDjor5ZXX40xdKxF p{margin:0;}#mermaid-svg-DDjor5ZXX40xdKxF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DDjor5ZXX40xdKxF .cluster-label text{fill:#333;}#mermaid-svg-DDjor5ZXX40xdKxF .cluster-label span{color:#333;}#mermaid-svg-DDjor5ZXX40xdKxF .cluster-label span p{background-color:transparent;}#mermaid-svg-DDjor5ZXX40xdKxF .label text,#mermaid-svg-DDjor5ZXX40xdKxF span{fill:#333;color:#333;}#mermaid-svg-DDjor5ZXX40xdKxF .node rect,#mermaid-svg-DDjor5ZXX40xdKxF .node circle,#mermaid-svg-DDjor5ZXX40xdKxF .node ellipse,#mermaid-svg-DDjor5ZXX40xdKxF .node polygon,#mermaid-svg-DDjor5ZXX40xdKxF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DDjor5ZXX40xdKxF .rough-node .label text,#mermaid-svg-DDjor5ZXX40xdKxF .node .label text,#mermaid-svg-DDjor5ZXX40xdKxF .image-shape .label,#mermaid-svg-DDjor5ZXX40xdKxF .icon-shape .label{text-anchor:middle;}#mermaid-svg-DDjor5ZXX40xdKxF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DDjor5ZXX40xdKxF .rough-node .label,#mermaid-svg-DDjor5ZXX40xdKxF .node .label,#mermaid-svg-DDjor5ZXX40xdKxF .image-shape .label,#mermaid-svg-DDjor5ZXX40xdKxF .icon-shape .label{text-align:center;}#mermaid-svg-DDjor5ZXX40xdKxF .node.clickable{cursor:pointer;}#mermaid-svg-DDjor5ZXX40xdKxF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DDjor5ZXX40xdKxF .arrowheadPath{fill:#333333;}#mermaid-svg-DDjor5ZXX40xdKxF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DDjor5ZXX40xdKxF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DDjor5ZXX40xdKxF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DDjor5ZXX40xdKxF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DDjor5ZXX40xdKxF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DDjor5ZXX40xdKxF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DDjor5ZXX40xdKxF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DDjor5ZXX40xdKxF .cluster text{fill:#333;}#mermaid-svg-DDjor5ZXX40xdKxF .cluster span{color:#333;}#mermaid-svg-DDjor5ZXX40xdKxF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DDjor5ZXX40xdKxF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DDjor5ZXX40xdKxF rect.text{fill:none;stroke-width:0;}#mermaid-svg-DDjor5ZXX40xdKxF .icon-shape,#mermaid-svg-DDjor5ZXX40xdKxF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DDjor5ZXX40xdKxF .icon-shape p,#mermaid-svg-DDjor5ZXX40xdKxF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DDjor5ZXX40xdKxF .icon-shape .label rect,#mermaid-svg-DDjor5ZXX40xdKxF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DDjor5ZXX40xdKxF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DDjor5ZXX40xdKxF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DDjor5ZXX40xdKxF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 应用层
MPP核心层
驱动层
硬件层
摄像头Sensor
麦克风
喇叭
显示器/HDMI
音视频编解码硬件
图形缩放硬件
运动估计硬件
VI驱动
AI驱动
VPSS驱动
VENC驱动
VDEC驱动
VO驱动
AO驱动
Proc调试节点
/proc/umap/*
视频输入
采集/裁剪/翻转
音频输入
采样/VQE处理
视频处理核心
3DNR/缩放/锐化
几何畸变校正
鱼眼/透视校正
数字防抖
陀螺仪/GME防抖
区域叠加
OSD/LOGO/马赛克
视频编码
H.264/H.265
JPEG编码
抓拍/MJPEG
码率控制
CBR/VBR/AVBR
视频解码
H.264/H.265/MJPEG
视频解码固件
音频编码
G.711/G.726
音频解码
音频编解码器
视频输出
显示/BT1120
音频输出
播放
视频分析
运动检测/遮挡检测
音视频同步
用户业务
IPC/NVR/直播
MPP SDK API
二、核心业务流程
1. IPC视频采集编码主流程(最常用)
这是安防IPC、直播摄像头等产品的核心数据通路:
#mermaid-svg-8fkCvKwfh4NP6dg4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8fkCvKwfh4NP6dg4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8fkCvKwfh4NP6dg4 .error-icon{fill:#552222;}#mermaid-svg-8fkCvKwfh4NP6dg4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8fkCvKwfh4NP6dg4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8fkCvKwfh4NP6dg4 .marker.cross{stroke:#333333;}#mermaid-svg-8fkCvKwfh4NP6dg4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8fkCvKwfh4NP6dg4 p{margin:0;}#mermaid-svg-8fkCvKwfh4NP6dg4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8fkCvKwfh4NP6dg4 .cluster-label text{fill:#333;}#mermaid-svg-8fkCvKwfh4NP6dg4 .cluster-label span{color:#333;}#mermaid-svg-8fkCvKwfh4NP6dg4 .cluster-label span p{background-color:transparent;}#mermaid-svg-8fkCvKwfh4NP6dg4 .label text,#mermaid-svg-8fkCvKwfh4NP6dg4 span{fill:#333;color:#333;}#mermaid-svg-8fkCvKwfh4NP6dg4 .node rect,#mermaid-svg-8fkCvKwfh4NP6dg4 .node circle,#mermaid-svg-8fkCvKwfh4NP6dg4 .node ellipse,#mermaid-svg-8fkCvKwfh4NP6dg4 .node polygon,#mermaid-svg-8fkCvKwfh4NP6dg4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8fkCvKwfh4NP6dg4 .rough-node .label text,#mermaid-svg-8fkCvKwfh4NP6dg4 .node .label text,#mermaid-svg-8fkCvKwfh4NP6dg4 .image-shape .label,#mermaid-svg-8fkCvKwfh4NP6dg4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-8fkCvKwfh4NP6dg4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8fkCvKwfh4NP6dg4 .rough-node .label,#mermaid-svg-8fkCvKwfh4NP6dg4 .node .label,#mermaid-svg-8fkCvKwfh4NP6dg4 .image-shape .label,#mermaid-svg-8fkCvKwfh4NP6dg4 .icon-shape .label{text-align:center;}#mermaid-svg-8fkCvKwfh4NP6dg4 .node.clickable{cursor:pointer;}#mermaid-svg-8fkCvKwfh4NP6dg4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8fkCvKwfh4NP6dg4 .arrowheadPath{fill:#333333;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8fkCvKwfh4NP6dg4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8fkCvKwfh4NP6dg4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8fkCvKwfh4NP6dg4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8fkCvKwfh4NP6dg4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8fkCvKwfh4NP6dg4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8fkCvKwfh4NP6dg4 .cluster text{fill:#333;}#mermaid-svg-8fkCvKwfh4NP6dg4 .cluster span{color:#333;}#mermaid-svg-8fkCvKwfh4NP6dg4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8fkCvKwfh4NP6dg4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8fkCvKwfh4NP6dg4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-8fkCvKwfh4NP6dg4 .icon-shape,#mermaid-svg-8fkCvKwfh4NP6dg4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8fkCvKwfh4NP6dg4 .icon-shape p,#mermaid-svg-8fkCvKwfh4NP6dg4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8fkCvKwfh4NP6dg4 .icon-shape .label rect,#mermaid-svg-8fkCvKwfh4NP6dg4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8fkCvKwfh4NP6dg4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8fkCvKwfh4NP6dg4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8fkCvKwfh4NP6dg4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Sensor输出RAW/YUV
VI采集
裁剪/翻转/格式转换
VPSS预处理
3DNR降噪/缩放/锐化
GDC几何校正
鱼眼畸变校正
DIS数字防抖
运动补偿
REGION叠加
时间戳/LOGO/马赛克
VENC视频编码
H.264/H.265
RC码率控制
动态调整QP/帧率
输出ES码流
封装RTSP/FLV
JPEGE编码
抓拍图片/MJPEG
2. 视频解码显示流程
适用于NVR、播放器等产品:
#mermaid-svg-YyYkDGsqytmyya1B{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YyYkDGsqytmyya1B .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YyYkDGsqytmyya1B .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YyYkDGsqytmyya1B .error-icon{fill:#552222;}#mermaid-svg-YyYkDGsqytmyya1B .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YyYkDGsqytmyya1B .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YyYkDGsqytmyya1B .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YyYkDGsqytmyya1B .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YyYkDGsqytmyya1B .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YyYkDGsqytmyya1B .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YyYkDGsqytmyya1B .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YyYkDGsqytmyya1B .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YyYkDGsqytmyya1B .marker.cross{stroke:#333333;}#mermaid-svg-YyYkDGsqytmyya1B svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YyYkDGsqytmyya1B p{margin:0;}#mermaid-svg-YyYkDGsqytmyya1B .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YyYkDGsqytmyya1B .cluster-label text{fill:#333;}#mermaid-svg-YyYkDGsqytmyya1B .cluster-label span{color:#333;}#mermaid-svg-YyYkDGsqytmyya1B .cluster-label span p{background-color:transparent;}#mermaid-svg-YyYkDGsqytmyya1B .label text,#mermaid-svg-YyYkDGsqytmyya1B span{fill:#333;color:#333;}#mermaid-svg-YyYkDGsqytmyya1B .node rect,#mermaid-svg-YyYkDGsqytmyya1B .node circle,#mermaid-svg-YyYkDGsqytmyya1B .node ellipse,#mermaid-svg-YyYkDGsqytmyya1B .node polygon,#mermaid-svg-YyYkDGsqytmyya1B .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YyYkDGsqytmyya1B .rough-node .label text,#mermaid-svg-YyYkDGsqytmyya1B .node .label text,#mermaid-svg-YyYkDGsqytmyya1B .image-shape .label,#mermaid-svg-YyYkDGsqytmyya1B .icon-shape .label{text-anchor:middle;}#mermaid-svg-YyYkDGsqytmyya1B .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YyYkDGsqytmyya1B .rough-node .label,#mermaid-svg-YyYkDGsqytmyya1B .node .label,#mermaid-svg-YyYkDGsqytmyya1B .image-shape .label,#mermaid-svg-YyYkDGsqytmyya1B .icon-shape .label{text-align:center;}#mermaid-svg-YyYkDGsqytmyya1B .node.clickable{cursor:pointer;}#mermaid-svg-YyYkDGsqytmyya1B .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YyYkDGsqytmyya1B .arrowheadPath{fill:#333333;}#mermaid-svg-YyYkDGsqytmyya1B .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YyYkDGsqytmyya1B .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YyYkDGsqytmyya1B .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YyYkDGsqytmyya1B .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YyYkDGsqytmyya1B .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YyYkDGsqytmyya1B .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YyYkDGsqytmyya1B .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YyYkDGsqytmyya1B .cluster text{fill:#333;}#mermaid-svg-YyYkDGsqytmyya1B .cluster span{color:#333;}#mermaid-svg-YyYkDGsqytmyya1B div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YyYkDGsqytmyya1B .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YyYkDGsqytmyya1B rect.text{fill:none;stroke-width:0;}#mermaid-svg-YyYkDGsqytmyya1B .icon-shape,#mermaid-svg-YyYkDGsqytmyya1B .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YyYkDGsqytmyya1B .icon-shape p,#mermaid-svg-YyYkDGsqytmyya1B .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YyYkDGsqytmyya1B .icon-shape .label rect,#mermaid-svg-YyYkDGsqytmyya1B .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YyYkDGsqytmyya1B .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YyYkDGsqytmyya1B .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YyYkDGsqytmyya1B :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入ES码流
H.264/H.265
VDEC视频解码
输出YUV数据
VPSS后处理
缩放/裁剪/旋转
REGION叠加OSD
VO视频输出
HDMI/LCD显示
3. 音频采集播放流程
#mermaid-svg-eFx7dHr3JP9713NE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eFx7dHr3JP9713NE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eFx7dHr3JP9713NE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eFx7dHr3JP9713NE .error-icon{fill:#552222;}#mermaid-svg-eFx7dHr3JP9713NE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eFx7dHr3JP9713NE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eFx7dHr3JP9713NE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eFx7dHr3JP9713NE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eFx7dHr3JP9713NE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eFx7dHr3JP9713NE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eFx7dHr3JP9713NE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eFx7dHr3JP9713NE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eFx7dHr3JP9713NE .marker.cross{stroke:#333333;}#mermaid-svg-eFx7dHr3JP9713NE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eFx7dHr3JP9713NE p{margin:0;}#mermaid-svg-eFx7dHr3JP9713NE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eFx7dHr3JP9713NE .cluster-label text{fill:#333;}#mermaid-svg-eFx7dHr3JP9713NE .cluster-label span{color:#333;}#mermaid-svg-eFx7dHr3JP9713NE .cluster-label span p{background-color:transparent;}#mermaid-svg-eFx7dHr3JP9713NE .label text,#mermaid-svg-eFx7dHr3JP9713NE span{fill:#333;color:#333;}#mermaid-svg-eFx7dHr3JP9713NE .node rect,#mermaid-svg-eFx7dHr3JP9713NE .node circle,#mermaid-svg-eFx7dHr3JP9713NE .node ellipse,#mermaid-svg-eFx7dHr3JP9713NE .node polygon,#mermaid-svg-eFx7dHr3JP9713NE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eFx7dHr3JP9713NE .rough-node .label text,#mermaid-svg-eFx7dHr3JP9713NE .node .label text,#mermaid-svg-eFx7dHr3JP9713NE .image-shape .label,#mermaid-svg-eFx7dHr3JP9713NE .icon-shape .label{text-anchor:middle;}#mermaid-svg-eFx7dHr3JP9713NE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eFx7dHr3JP9713NE .rough-node .label,#mermaid-svg-eFx7dHr3JP9713NE .node .label,#mermaid-svg-eFx7dHr3JP9713NE .image-shape .label,#mermaid-svg-eFx7dHr3JP9713NE .icon-shape .label{text-align:center;}#mermaid-svg-eFx7dHr3JP9713NE .node.clickable{cursor:pointer;}#mermaid-svg-eFx7dHr3JP9713NE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eFx7dHr3JP9713NE .arrowheadPath{fill:#333333;}#mermaid-svg-eFx7dHr3JP9713NE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eFx7dHr3JP9713NE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eFx7dHr3JP9713NE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eFx7dHr3JP9713NE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eFx7dHr3JP9713NE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eFx7dHr3JP9713NE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eFx7dHr3JP9713NE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eFx7dHr3JP9713NE .cluster text{fill:#333;}#mermaid-svg-eFx7dHr3JP9713NE .cluster span{color:#333;}#mermaid-svg-eFx7dHr3JP9713NE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eFx7dHr3JP9713NE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eFx7dHr3JP9713NE rect.text{fill:none;stroke-width:0;}#mermaid-svg-eFx7dHr3JP9713NE .icon-shape,#mermaid-svg-eFx7dHr3JP9713NE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eFx7dHr3JP9713NE .icon-shape p,#mermaid-svg-eFx7dHr3JP9713NE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eFx7dHr3JP9713NE .icon-shape .label rect,#mermaid-svg-eFx7dHr3JP9713NE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eFx7dHr3JP9713NE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eFx7dHr3JP9713NE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eFx7dHr3JP9713NE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 麦克风输入
ACODEC模数转换
AI采集
VQE降噪/AGC
AENC编码
G.711/G.726
输出音频码流
输入音频码流
ADEC解码
AO输出
ACODEC数模转换
喇叭播放
三、快速掌握MPP的五阶段实践法
结合proc调试节点,推荐采用"架构先行-最小验证-工具精通-模块深入-问题优化"的学习路径,可在2周内达到熟练使用水平。
阶段1:架构认知与数据流理解(1天)
核心目标:建立模块化思维,理清数据流向
- 记忆核心模块功能 :
- 输入类:VI(视频采集)、AI(音频采集)
- 处理类:VPSS(视频处理核心,90%预处理在此完成)、GDC(几何校正)、DIS(防抖)、REGION(OSD)
- 编码类:VENC(H.264/H.265)、JPEGE(JPEG/MJPEG)、RC(码率控制)
- 解码类:VDEC(视频解码)、ADEC(音频解码)
- 输出类:VO(视频显示)、AO(音频播放)
- 理解MPP设计思想 :
- 硬件加速:所有核心操作由硬件完成,CPU仅做控制
- 模块化:每个模块独立配置,通过绑定关系连接
- 零拷贝:模块间通过物理地址传递数据,避免内存拷贝
阶段2:最小系统验证(2天)
核心目标:跑通最基础的视频采集编码流程
- 环境准备 :
- 搭建交叉编译环境,编译MPP SDK的sample程序
- 连接开发板sensor和串口,确保系统正常启动
- 跑通Hello World :
- 运行
sample_venc:单路VI采集→VPSS→VENC编码H.265码流保存到文件 - 运行
sample_vio:VI采集→VPSS→VO直接显示预览
- 运行
- 基础参数修改 :
- 修改分辨率(720p/1080p)、帧率(25/30fps)、码率(2M/4M)
- 验证修改后的码流和预览效果
阶段3:调试工具精通(3天)
核心目标 :熟练使用proc节点定位基础问题
这是MPP调试最核心的技能,文档中详细列出了所有模块的proc节点和参数说明。
核心proc节点关键参数表:
| 模块 | 关键参数 | 用途 |
|---|---|---|
| VENC | send、query_ok、lost_int、frame_rate |
查看编码帧率、丢帧情况 |
| VPSS | recv_pic、send_ok、frame_rate |
查看VPSS处理帧率、输入输出计数 |
| VI | int_cnt、vb_fail、lost_int |
查看采集帧率、VB申请失败、中断丢失 |
| RC | inst_br、real_bit、start_qp |
查看瞬时码率、实际码率、QP值 |
| VO | int_rate、buf_empty_cnt |
查看显示帧率、缓冲区空的次数 |
基础调试练习:
- 故意不释放码流,观察VENC的
buf_full计数增加 - 设置错误分辨率,查看VI的
lost_int和cc_err_cnt变化 - 对比不同码率下RC的
inst_br波动情况
阶段4:核心模块深入实践(1周)
核心目标:掌握VI、VPSS、VENC三大核心模块的参数配置
- VI模块深入 :
- 配置不同输入接口(MIPI/BT1120)
- 调试采集帧率、裁剪、水平/垂直翻转
- 解决VI常见问题:丢帧、花屏、色彩异常
- VPSS模块深入 :
- 调整3DNR空域/时域降噪强度,对比画质效果
- 实现一路输入多路不同分辨率输出
- 配置LDC畸变校正和鱼眼校正
- VENC模块深入 :
- 对比CBR/VBR/AVBR三种码率控制模式的效果
- 调整GOP大小、I帧间隔、QP范围
- 配置ROI感兴趣区域编码
- 解决码率波动大、超大帧问题
- REGION模块实践 :
- 叠加文字OSD、图片LOGO、马赛克遮挡
- 实现动态更新OSD内容
阶段5:问题定位与性能优化(持续)
核心目标:掌握常见问题定位方法和系统优化技巧
- 标准问题定位流程 :
- 丢帧问题 :从后往前查(VENC→VPSS→VI),看哪个模块的
lost计数增加 - 码率异常 :查看RC的
inst_br和real_bit,检查码率配置和超大帧阈值 - 画质差:先调VPSS的3DNR参数,再调VENC的QP值和码率
- 花屏问题:检查VI时序配置、VB缓冲区大小
- 丢帧问题 :从后往前查(VENC→VPSS→VI),看哪个模块的
- 系统性能优化 :
- 合理配置VB缓冲区大小,避免
vb_fail - 优化VENC的超大帧处理参数,减少I帧码率峰值
- 复用VPSS输出,避免重复处理同一帧数据
- 关闭不需要的模块,节省硬件资源
- 合理配置VB缓冲区大小,避免
四、学习建议
- 优先使用sample程序:基于SDK提供的sample进行修改,避免从零开始
- 熟读对应模块文档:海思MPP文档非常详细,遇到问题先查对应章节
- 多做对比实验:通过修改参数对比效果,直观理解参数含义
- 建立调试笔记:记录常见问题的现象、定位方法和解决方案