1.Profile
profile是代表编码器能力的,一般有BP、MP、HP。越高级的profile性能需求越强。
typedef enum VENC_H264PROFILETYPE {
VENC_H264ProfileBaseline = 66, /**< Baseline profile */
VENC_H264ProfileMain = 77, /**< Main profile */
VENC_H264ProfileHigh = 100, /**< High profile */
}VENC_H264PROFILETYPE;
Baseline
I/P 帧、CAVLC,无交错(Progressive),不支持CABAC。
一般用于实时通讯,比如视频通话等;
Main
兼容Baseline,支持I/P/B 帧,支持无交错(Progressive)和交错(Interlaced)、CAVLC 和CABAC 、支持interlaced 场视频格式、加权预测。
常用于流媒体,比如网络视频播放,mp4等媒体设备。
High
兼容Main Profile,支持8x8 transform内部预测等功能。
用于较高的商业场合,比如蓝光、电影、高清电视等。
CAVLC :基于上下文的自适应可变长编码。CABAC:基于上下文的自适应二进制算术编码。CAVLC是低质量的,易于解码的选项,CABAC是高质量的,难于解码的选项。> 通常来说CABAC被认为比CAVLC效率高5%-15%。
2.level
对应不同的分辨率、比特率、宏块数和帧率等。level越高,对应级别越大。
typedef enum VENC_H264LEVELTYPE {
VENC_H264Level1 = 10, /**< Level 1 */
VENC_H264Level11 = 11, /**< Level 1.1 */
VENC_H264Level12 = 12, /**< Level 1.2 */
VENC_H264Level13 = 13, /**< Level 1.3 */
VENC_H264Level2 = 20, /**< Level 2 */
VENC_H264Level21 = 21, /**< Level 2.1 */
VENC_H264Level22 = 22, /**< Level 2.2 */
VENC_H264Level3 = 30, /**< Level 3 */
VENC_H264Level31 = 31, /**< Level 3.1 */
VENC_H264Level32 = 32, /**< Level 3.2 */
VENC_H264Level4 = 40, /**< Level 4 */
VENC_H264Level41 = 41, /**< Level 4.1 */
VENC_H264Level42 = 42, /**< Level 4.2 */
VENC_H264Level5 = 50, /**< Level 5 */
VENC_H264Level51 = 51, /**< Level 5.1 */
}VENC_H264LEVELTYPE;
参考:H264 Profile和Level
3.QPRange
typedef struct VencQPRange {
int nMaxqp;
int nMinqp;
}VencQPRange;
QP 区间。QP值对应量化步长的序号,对于亮度取值0-51, 对于色度取值0~39。
值越小,量化步长越小,量化的精度就越高,意味着同样画质的情况下,产生的数据量可能会更大。QP值每增加6,量化步长就增加一倍。
4.MotionParam
移动侦测的参数。
typedef struct MotionParam {
int nMotionDetectEnable;
int nMotionDetectRatio; /* 0~12, advise set 0 */
int nStaticDetectRatio; /* 0~12, should be larger than nMotionDetectRatio, advise set 2 */
int nMaxNumStaticFrame; /* advise set 4 */
double nStaticBitsRatio; /* advise set 0.2~0.3 at daytime, set 0.1 at night */
double nMV64x64Ratio; /* advise set 0.01 */
short nMVXTh; /* advise set 6 */
short nMVYTh; /* advise set 6 */
}MotionParam;
运动补偿包括全局运动补偿 和 分块运动补偿两类。
全局运动补偿,反映摄像机的各种运动,包括平移,旋转,变焦等等。这种模型特别适合对静止场景的编码。 分块运动补偿,每帧被分为若干像素块
(在大多数视频编码标准,如MPEG中,是分为16x16的像素块)。从参考帧的某个位置的等大小的块对当前块进行预测,预测的过程中只有平移,平移的大小被称为运动矢量。比如一固定物体从画面的一端移动到另一端。
5.FixQP
固定 QP 参数,不使用码率控制,固定 QP。
typedef struct VencH264FixQP {
int bEnable;
int nIQp;
int nPQp;
}VencH264FixQP;
bEnable
0:码率控制固定QP模式关闭;1:码率控制估计QP模式打开;
nIQp
int I 帧的 QP(0~51);
nPQp
int P 帧的 QP(0~51);
6.CodingMode
编码模式
typedef enum VENC_CODING_MODE {
VENC_FRAME_CODING = 0,
VENC_FIELD_CODING = 1,
}VENC_CODING_MODE;
帧编码与场编码:
在帧编码中,参考为帧图像,采用帧运动补偿,两个场是联合编码;在场编码中,参考为场图像,两个场是分别编码,采用场运动补偿。
场编码适用场合:对于运动激烈的情况,也就是画面变化快,画面中的人物、背景等等短时间里就会有很大的变化。这样,如果使用帧编码,由于相邻两行(一行在顶场,一行在底场)的扫描时间相差了许多(因为是隔行扫描),那么由于变化剧烈(画面在短时间内就会产生很大的差异),相邻行没有太多的相关性。而对于场图像来说,相邻行的扫描时间非常短,所以即使运动剧烈,但还是有很强的时间相关性。所以在这种情况下用场编码,就能去除时间上的冗余。
帧编码适用场合:对于相对静止没有什么变化的情况应该相对好理解,因为画面内容没有太大的变化,扫描时间的长短并不影响相关性。倒是帧场的相邻行由于是真正意义上的相邻,所以空间相关性肯定要比场的相邻行(其实是隔行)的空间相关性要大。那么在这种情况下使用帧编码,就能去除空间上的冗余。
7.ROI
感兴趣区域
typedef struct VencROIConfig {
int bEnable;
int index; /* (0~3) */
int nQPoffset;
unsigned char roi_abs_flag;
VencRect sRect;
}VencROIConfig;
ROI(Region of Interest)是指图像中的指定需要特殊关注或处理的区域。
8.AspectRatio
VUI 扩展选项,对播放视频时的显示比例进行限制。
typedef struct VencH264AspectRatio {
unsigned char aspect_ratio_idc;
unsigned short sar_width;
unsigned short sar_height;
}VencH264AspectRatio;
一 般 把aspect_ratio_idc 设为 255,显示 比 例 取 sar_width 和sar_height 的比值。
9.SVCSkip
时域可伸缩编码及跳帧,不能与插帧混用。
typedef struct VencH264SVCSkip {
T_LAYER nTemporalSVC;
SKIP_FRAME nSkipFrame;
int bEnableLayerRatio;
unsigned int nLayerRatio[4];
}VencH264SVCSkip;