智能编码使用指导
前言
本文档主要介绍H264、H265和SVAC3.0协议智能编码相关内容。智能编码主要包含四部分内容:
- 第一部分是GOP结构,不同的GOP结构适合不同的场景,GOP结构可以动态设置,对不同的场景选择合适的GOP结构能够优化编码性能;
- 第二部分是编码器输入信息,编码器输入信息接口可以和其他的智能分析模块联动,对智能分析出的感兴趣区域或重要区域,使用QpMap进行保护,或结合客户自己的算法做出更好的码率控制;
- 第三部分是编码器输出信息,客户可以根据编码器输出信息,给智能分析算法提供更多可参考的输入;
- 第四部分是Cyclic Intra Refresh,此技术不编码IDR帧,在P帧中周期性的编码I宏块,在特殊的应用场景实现码率平滑。
与本文档相对应的产品版本如下。
本文档(本指南)主要适用于以下工程师:
- 技术支持工程师
- 软件开发工程师
修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有文档版本的更新内容。
GOP结构和适用场景
GOP模式名词解释
表 1 GOP模式术语
|
NormalP模式GOP结构说明及使用方法
说明: NormalP是最通常的一种GOP结构,如果没有特殊说明,_我司_所有芯片均支持这一模式。
结构说明
- NormalP参考关系很简单,每个P帧参考一个前向参考帧。
- NormalP对使用场景没有要求,任何场景都可以使用。
NormalP模式GOP结构,如图1所示。

使用方法
【相关接口】
ss_mpi_venc_create_chn
【相关参数】
ot_venc_chn_attr::gop_attr.gop_mode = OT_VENC_GOP_MODE_NORMAL_P
ot_venc_chn_attr::gop_attr.normal_p.ip_qp_delta推荐设为3,值越大I帧越大,I帧质量越好。
DualP模式GOP结构说明及使用方法
结构说明
- 其中:SP指特殊的P帧,这里简称SP帧,该帧Qp值推荐小于其他P帧Qp值,sp_interval=0指不支持SP帧。
- DualP模式下P帧参考就近的两个前向参考帧,能够利用更多参考帧的时域相关性提升编码压缩性能。主要应用在运动且有低延时要求的场景,DualP压缩性能低于BiPredB模式但高于NormalP模式。DualP由于两个参考帧均使用前向参考帧,因此不存在编码和解码延时。
DualP模式GOP结构,如图1所示。

使用方法
【相关接口】
ss_mpi_venc_create_chn
【相关参数】
- ot_venc_chn_attr::gop_attr.gop_mode = OT_VENC_GOP_MODE_DUAL_P
-
可以通过周期性的编码质量更好的P帧(即SP帧),优化图像质量。
SP帧间隔可以通过ot_venc_chn_attr::gop_attr.dual_p.sp_interval参数设置。
SmartP模式GOP结构说明及使用方法
结构说明
SmartP模式下P帧参考IDR帧(长期参考帧)和前向参考帧(短期参考帧),利用两个参考帧的时域相关性提升编码压缩性能。主要应用在_录像机_镜头固定场景。
此场景的特点是_录像机_固定安装,场景中的人和物体有静止有运动。
- 在静止区域,利用长期参考帧和当前帧的时域相关性可以大幅降低码率,并减少呼吸效应和拖尾效应;
- 在运动区域,利用短期参考帧进行运动估计。SmartP模式拉长IDR帧间隔,中间定期插入虚拟I帧,能够大幅度降低_录像机_镜头固定场景的码率并提升图像质量,码率节省可以达到30%~50%,但对于_录像机_镜头有相对运动的场景不适用。
SmartP模式GOP结构,如图1所示。

使用方法
【相关接口】
ss_mpi_venc_create_chn
【相关参数】
- ot_venc_chn_attr::gop_attr.gop_mode = OT_VENC_GOP_MODE_SMART_P
- ot_venc_chn_attr::gop_attr.smart_p.bg_interval = 1200; // 30fps, 40seconds
- ot_venc_chn_attr::gop_attr.smart_p.bg_qp_delta= 7
- ot_venc_chn_attr::gop_attr.smart_p.vi_qp_delta = 2
- ot_venc_chn_attr::rc_attr.gop = 30; // virtual I interval
- ot_venc_chn_attr::rc_attr.stats_time = 40; // 40 second
BiPredB模式GOP结构说明及使用方法
结构说明
说明:
此小节Hi3519DV500/Hi3516DV500/Hi3516CV610不支持。 Hi3511CV00仅SVAC3.0支持B帧。
- 其中:b_frame_num指IDR帧和P帧或P帧和P帧之间B帧的个数,如图1中b_frame_num = 2,每个Gop的最后一帧一定是P帧,之前的B帧个数可能不满足b_frame_num要求。
- BiPredB模式相邻两个P帧中支持插入1~3个B帧,B帧不做参考,使用一个前向参考帧和一个后向参考帧。对于运动场景,双向预测能够更好的做运动估计并且可以支持加权预测,可以提升编码器的压缩性能。
BiPredB模式GOP结构,如图1所示。

使用方法
【相关接口】
ss_mpi_venc_create_chn
【相关参数】
- ot_venc_chn_attr::gop_attr.gop_mode = OT_VENC_GOP_MODE_BIPRED_B
- ot_venc_chn_attr::gop_attr. bipred_b.b_frame_num = 2
- ot_venc_chn_attr::gop_attr. bipred_b.ip_qp_delta = 3
- ot_venc_chn_attr::gop_attr. bipred_b.b_qp_delta = -2
Cyclic Intra Refresh原理和使用方法
原理
一般场景IDR帧大小会超出P帧很多倍,特别是运动比较小的场景,IDR帧可能达到P帧的几十至上百倍。在网络传输特别是无线传输的时候,IDR帧会引起瞬时网络冲击造成丢帧及增大延时。一般编码技术可以通过增大IDR帧的QP来降低IDR帧大小,但同时会降低IDR帧质量引起呼吸效应。Cyclic Intra Refresh不改变IDR帧质量,把本来一个IDR帧编码的Intra LCU/宏块分散在若干个P帧中,使每一个帧的大小相对平均。如图1所示,使用Cyclic Intra Refresh技术,在_录像机_镜头固定场景下1080P@25fps在4Mbps码率的最大帧大小可以从200k字节降低到37k字节。使码率非常平稳。

使用方法
【相关接口】
ss_mpi_venc_set_intra_refresh
【相关参数】
- ot_venc_intra_refresh::enable = TD_TRUE
- ot_venc_intra_refresh::mode = OT_VENC_INTRA_REFRESH_ROW ;//宏块/LCU按行刷新
- ot_venc_intra_refresh::refresh_num; // 每帧刷新宏块/LCU行数
-
ot_venc_intra_refresh::request_i_qp; // 请求I帧时使用的QP
优势
- 码率非常平稳,对网络的冲击小,适合用于无线网络传输环境;
- 编码、解码及网络延迟非常小;
- 不会降低I帧质量,不会引起严重的呼吸效应。
使用限制
- 由于Intra LCU/宏块分布在几个P帧中,所以播放视频最开始的几帧是不完整的;
- 对解码器有兼容性要求,必须支持没有IDR帧的码流的解码;
- 只支持NormalP的GOP结构,其他GOP结构不支持。
- 该技术主要针对码率平稳要求高的场景,并不会降低码率,对低码率场景不适用。
GOP结构内存占用、延时、适用场景及兼容性
说明:
- PicSize为参考帧帧存(图像格式为YUV420格式)。
- PicSize的计算方法下面将详细描述。
- SrcPicSize为编码之前的源图像大小,主要是B帧有延时需要缓存一部分源图像。
- BiPredB模式编码端和解码端都有延时,其他模式编码端和解码端都不存在延时。
表 1 内存占用、延时及适用场景
PicSize的计算方式
-
编码帧存(参考帧和重构帧)每块VB大小计算方式如下:
PicSize= YHeaderSize + CHeaderSize + YSize + CSize +PmeSize + PmeInfoSize+TmvSize + NbiUpSize
-
帧存大小各子项计算方法请参考文档《MPP 媒体处理软件Vx.y 开发参考》的“视频编码”章节。
兼容性
后端产品兼容性,如表1所示。
表 1 后端产品兼容性
编码器输入信息
QpMap/SkipMap接口定义
QpMap编码方案总体设计系统框图,如图1所示。

方案实现细节和注意事项:
- 为了保证每帧的SrcPic和QpMap能够保持同步,方案需要在用户态App完成,App通过用户态从VI/VPSS取走图像,经过智能分析和帧级码率控制,计算一帧内每个宏块的QpMap,再把SrcPic和QpMap通过send_frame_ex接口配置下来;SDK内部Bypass帧率控制和帧级码率控制;智能分析和帧级码率控制算法客户自己开发。
- SDK内部不会有图像和码流缓存,但是调度的延迟不可避免;方案的性能和延迟客户自行评估。
-
H.264、H.265都按照16x16的块大小配置QpMap,但H.265的编码CU可能大于16x16,因此同一个CU可能对应有几个不同QP值,SDK提供接口,在这种情况支持从以下3种模式中选择一种。
- 取多个QP的最大值
- 取多个QP的最小值
- 取多个QP的平均值
-
QpMap的配置,支持相对Qp和绝对Qp两种模式。
- 相对Qp指的是基于编码器内部逻辑计算的码控(宏块级)仍然生效,外部通过QpMap输入Qp大小是一个变化量Qpdelta,在原始码控(宏块级)基础上,叠加该Qpdelta。
- 绝对Qp指的是每一个编码块的Qp完全是由用户外部输入确定,不依赖于内部宏块级码控算法。
-
编码器内部的重编码和丢帧机制可能无法使用。
-
SDK可以提供每帧图像的如下信息。
- ISP相关信息;
- 前一帧编码字节数。
QPMAP 表内存排布方式
QPMAP表,H.265和H.264编码基本单元不同,所以QP排列方式不同。H.264编码和H.265编码QP值的组织方式如图1和图2所示,SVAC3.0排布方式和H.265相同。


编码接口定义
码率控制接口
typedef enum {
OT_VENC_RC_MODE_H264_ABR = 1,
OT_VENC_RC_MODE_H264_CBR,
OT_VENC_RC_MODE_H264_VBR,
OT_VENC_RC_MODE_H264_AVBR,
OT_VENC_RC_MODE_H264_QVBR,
OT_VENC_RC_MODE_H264_CVBR,
OT_VENC_RC_MODE_H264_FIXQP,
OT_VENC_RC_MODE_H264_QPMAP,
OT_VENC_RC_MODE_H264_RANGEQP,
OT_VENC_RC_MODE_MJPEG_CBR,
OT_VENC_RC_MODE_MJPEG_VBR,
OT_VENC_RC_MODE_MJPEG_FIXQP,
OT_VENC_RC_MODE_H265_ABR,
OT_VENC_RC_MODE_H265_CBR,
OT_VENC_RC_MODE_H265_VBR,
OT_VENC_RC_MODE_H265_AVBR,
OT_VENC_RC_MODE_H265_QVBR,
OT_VENC_RC_MODE_H265_CVBR,
OT_VENC_RC_MODE_H265_FIXQP,
OT_VENC_RC_MODE_H265_QPMAP,
OT_VENC_RC_MODE_H265_RANGEQP,
OT_VENC_RC_MODE_SVAC3_ABR,
OT_VENC_RC_MODE_SVAC3_CBR,
OT_VENC_RC_MODE_SVAC3_VBR,
OT_VENC_RC_MODE_SVAC3_AVBR,
OT_VENC_RC_MODE_SVAC3_QVBR,
OT_VENC_RC_MODE_SVAC3_CVBR,
OT_VENC_RC_MODE_SVAC3_FIXQP,
OT_VENC_RC_MODE_SVAC3_QPMAP,
OT_VENC_RC_MODE_SVAC3_RANGEQP,
OT_VENC_RC_MODE_BUTT,
}ot_venc_rc_mode;
typedef struct {
ot_venc_rc_mode rc_mode;
union {
ot_venc_h264_abr h264_abr;
ot_venc_h264_cbr h264_cbr;
ot_venc_h264_vbr h264_vbr;
ot_venc_h264_avbr h264_avbr;
ot_venc_h264_qvbr h264_qvbr;
ot_venc_h264_cvbr h264_cvbr;
ot_venc_h264_fixqp h264_fixqp;
ot_venc_h264_qpmap h264_qpmap;
ot_venc_h264_rangeqp h264_rangeqp;
ot_venc_mjpeg_cbr mjpeg_cbr;
ot_venc_mjpeg_vbr mjpeg_vbr;
ot_venc_mjpeg_fixqp mjpeg_fixqp;
ot_venc_h265_abr h265_abr;
ot_venc_h265_cbr h265_cbr;
ot_venc_h265_vbr h265_vbr;
ot_venc_h265_avbr h265_avbr;
ot_venc_h265_qvbr h265_qvbr;
ot_venc_h265_cvbr h265_cvbr;
ot_venc_h265_fixqp h265_fixqp;
ot_venc_h265_qpmap h265_qpmap;
ot_venc_h265_rangeqp h265_rangeqp;
ot_venc_svac3_abr svac3_abr;
ot_venc_svac3_cbr svac3_cbr;
ot_venc_svac3_vbr svac3_vbr;
ot_venc_svac3_avbr svac3_avbr;
ot_venc_svac3_qvbr svac3_qvbr;
ot_venc_svac3_cvbr svac3_cvbr;
ot_venc_svac3_fixqp svac3_fixqp;
ot_venc_svac3_qpmap svac3_qpmap;
ot_venc_svac3_rangeqp svac3_rangeqp;
};
} ot_venc_rc_attr;
- QpMap使用Adaptive ROI方式,RC模式使用CBR或VBR,同时QpMap使用相对QP模式;
- QpMap使用外部码率控制,RC模式使用QpMap,bypass内部RC算法,此时帧级码率控制和宏块级码率控制都由外部实现。
编码发送图像接口
typedef struct {
td_bool qpmap_valid;
td_bool skip_weight_valid;
td_u32 blk_start_qp;
td_phys_addr_t qpmap_phys_addr;
td_phys_addr_t skip_weight_phys_addr;
ot_venc_frame_type frame_type;
} ot_venc_user_rc_info;
typedef struct {
ot_video_frame_info user_frame;
ot_venc_user_rc_info user_rc_info;
ot_venc_user_roimap user_roimap;
} ot_venc_user_frame_info;
/*-1:block 0:nonblock >0 : overtime */
td_s32 ss_mpi_venc_send_frame_ex(ot_venc_chn chn, const ot_venc_user_frame_info *frame, td_s32 milli_sec);
QpMap/SkipMap实现自适应ROI
感兴趣区域,如图1所示。

使用QpMap调整感兴趣区域和非感兴趣区域QP,如图2所示。

通过QPMap可以画出任意形状及任意个数的感兴趣区域,并通过降低QP提升感兴趣区域图像质量,或提升QP降低非感兴趣区域质量。此模式下需要使用相对QP调节方式。
QpMap/SkipMap实现外部码率控制
通过配置QPMap实现外部码率控制,支持相对和绝对方式配置QP。此模式下所有LCU/MB的QP均由外部指定,帧级码率控制将不起作用。
编码器输出信息
SSE和PSNR信息
- PSNR代表整帧图像的信噪比数据,数据越大代表图像质量越好;
- 除了衡量整帧图像的PSNR外,编码器还支持统计局部质量的SSE信息输出。编码器支持输出最多8个区域的SSE。用户可以根据这8个区域的大小及SSE算出区域信噪比。其中,SSE统计的是部分像素点的取值,H.265统计每个LCU像素点个数:(Lcu_width-5) *(Lcu_width-4);H.264统计每个MB像素点个数:(Mb_width-5) * (Mb_width-4)
HeaderBits和ResidualBits信息
HeaderBits和ResidualBits都是描述CU级的信息,HeaderBits包含块类型、帧内帧间预测信息等;ResidualBits包含变换量化后的剩余残差信息。
-
HeaderBits较大一般代表:
- 图像纹理比较多,块划分比较细碎;
- 运动比较复杂,相对运动比较多,mv信息比较多。
-
ResidualBits较大一般代表:
- 运动不规则或运动过大超出搜索窗范围,运动补偿后剩余残差较多;
- 空间纹理比较复杂,帧内预测后剩余残差较多。
- 原始图像噪声较大。
Madi和Madp信息
Madi用于度量当前帧的空域纹理复杂度,一个块内基于像素值的纹理的变化,块的大小可以是16x16,32x32或64x64。
Madi复杂度计算公式为:


- 其中N代表一个64x64、32x32块或16x16块的像素点的个数。
对应一个块内的亮度均值,f对应一块内亮度复杂度计算公式。 - 编码器支持帧级上报Madi统计信息(一帧内所有LCU单元madi的平均值)。该上报信息仅H.265支持。
Madp用于度量当前帧的时域运动复杂度,以16x16块为单位,对一帧图像(该图像是原始图像按1/4分辨率下采样后的图像)中所有块进行运动搜索和补偿后残差绝对值(SAD,Sum of Absolute Difference)的平均值。其度量了所有块平均编码的时域复杂度,通过其值的大小,可以反馈一帧图像的编码压力,该上报信息仅H.265支持。
Madp复杂度计算公式:


其中SAD分为块级和帧级,若对于块级SAD(16*16块),M=N=16,对于帧级,则M=图像高,N=图像宽,
为原始像素,
基于ME搜索预测像素,
为Madp。
QP Histogram
QP直方图:
以4x4图像块为单位,统计所有小块使用的QP的直方图,其QP是编码过程中亮度分量(Y)使用的真实QP,无论是skip模式,还是非skip模式。该真实QP一般是在结合帧级,行级和CU级上面推断出来的。共52级(H.265/H.264都支持)。
其他上报信息
说明:
如无特殊说明,下表中描述的上报信息与本文档相对应的产品版本均支持。
表 1 其他上报信息表
智能编码
智能编码
智能编码(Smart Video Coding,简称:SVC)技术包括编码更低码率与前景保护的控制机制。用户可在方案层引入码率质量自适应调节策略,通过结合码控算法、智能编码算法整体调节,以达到用户对码率节省或前景保护的目的。
目前智能编码分为1.0版本和2.0版本。
智能编码1.0使用说明
智能编码1.0控制机制主要包括对不同区域的QpMap及Skip倾向性的控制及对编码码控的参数控制(目前只对AVBR码控参数进行调整,其他码控算法只支持不同区域QpMap的调节)。
-
SVC QpMap及Skip倾向性的调节:
- 用户通过设定ss_mpi_venc_send_svc_region接口,传送的智能检测框信息,区分出前景区域、背景区域及ROI区域,根据侧重码率节省或侧重保护前景的不同需求,使用ss_mpi_venc_set_svc_param接口,在不同区域设定不同的QpMap及Skip倾向性。
- 接口的相关参数信息及具体使用方法请参考《MPP 媒体处理软件Vx.y 开发参考》的“视频编码”章节。
-
SVC RC码控参数调节:
- 用户可根据自己传送的智能检测目标的个数、运动面积、检测前景的重要性的信息作为指导调节码率控制的参数;
- 若侧重码率节省,则主动调节码控参数,降低目标码率;若侧重保护智能目标的图像质量,则主动调节码控参数,提高目标码率;
- 理论上,目标个数越多、运动面积越大可相应提高目标码率,若目标个数越少、运动面积越小可相应降低目标码率。
- 智能编码关于码率的调整,(目前仅在AVBR码控下做过适配及调优),接口的相关参数信息及具体使用方法请参考《MPP 媒体处理软件Vx.y 开发参考》的“视频编码”章节。
智能编码2.0使用说明
智能编码2.0主要是利用编码器内部的相关信息,跟踪检测出前景区域、背景区域及ROI区域,对不同区域进行编码码控参数的控制。
控制方法:
用户通过设定ss_mpi_venc_send_svc_region接口,传送的智能检测框信息,区分出前景区域、背景区域及ROI区域,根据侧重码率节省或侧重保护前景的不同需求,使用ss_mpi_venc_set_svc_param_ex接口,在不同区域设定不同的Qpdelta值。
接口的相关参数信息及具体使用方法请参考《MPP 媒体处理软件Vx.y 开发参考》的“视频编码”章节。
SVC RC码控参数调节:
- 用户可根据自己传送的智能检测目标的个数、运动面积、检测前景的重要性的信息作为指导调节码率控制的参数;
- 若侧重码率节省,则主动调节码控参数,降低目标码率;若侧重保护智能目标的图像质量,则主动调节码控参数,提高目标码率;
- 理论上,目标个数越多、运动面积越大可相应提高目标码率,若目标个数越少、运动面积越小可相应降低目标码率。
- 智能编码关于码率的调整(目前仅在AVBR码控下做过适配及调优),接口的相关参数信息及具体使用方法请参考《MPP媒体处理软件Vx.y开发参考》的“视频编码”章节。
MD运动检测算法
MD运动检测算法
MD运动检测算法是利用编码器内部的运动搜索结果,区分出场景中不同的运动程度区域,利用Qpdelta和SkipMap,控制不同区域的图像质量。编码器自身已具备MD检测的能力,从而无需额外的计算成本。可以帮助客户实现轻智能编码的功能。
MD运动检测结果示意
红色的区域即为检测的区域(运动程度分为两档结果),从检测的结果看,可以较好检测画面中的运动区域。用户对于检测区域进行参数的调整和控制。如图1所示。

MD运动检测使用说明
MD运动检测控制机制主要是对不同运动程度的区域的Qpdelta及Skip倾向性进行调整(其中Skip倾向性调整,只能在AVBR码控下使用)。
MD Qpdelta及Skip倾向性的调节:
- 通过设置参数划定区域:调用 ss_mpi_venc_set_md接口,区分出前景区域、背景区域,是由参数threshold_gain、threshold_offset划定。threshold_gain、threshold_offset为一对参数,共同决定出一个阈值,数值越大,代表该区域的运动程度越大。
- 设置不同区域的Qpdelta及Skip倾向性:使用ss_mpi_venc_set_md接口,在不同区域设定不同的Qpdelta及Skip倾向性。其中Qpdelta为相对的宏块级QP值,可控制对应区域的图像质量。Skip倾向性调节通常用于背景区域,但倾向性不宜设置过大。
- 接口的相关参数信息及具体使用方法请参考《MPP 媒体处理软件Vx.y 开发参考》的“视频编码”章节。