H264编码常用参数整理

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,量化步长就增加一倍。

  • nMinqp 最小量化步长
    设置x264可以使用的最小量化器。量化参数越小,输出越接近输入。使用某些值时,x264的输出可以和输入看起来完全一样,虽然其实并不是精确相同的,通常就够了没有必要使用更多比特在宏块上了。如果开启了自适应量化器(默认开启),则不鼓励提高qpmin的值,那样可能会降低帧的平坦部分的质量。
  • nMaxqp 最大量化步长
    qpmin的反面,设置x264可以使用的最大量化器。默认值51是H.264标准中的最大值,质量非常低。默认值51其实相当于没有设置qpmax。如果你想控制x264输出的最低品质,也许你想要把这个值调低一点(调到30-40最低了),但一般而言不推荐调节这个值。

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)是指图像中的指定需要特殊关注或处理的区域。

  • nQPoffset
    ROI 区域的 QP 为码率控制产生 的 QP 与 用 户 设 定 的nQPoffset 的差;例如:一帧图像使用固定 QP=30;nQPoffset = 10;那么 ROI 区域的 QP 为:30 - 10 = 20;

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 显示比例高度;

一 般 把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;
  • nTemporalSVC:时域分层数,取值0/2/3/4。
  • nSkipFrame:跳帧倍数
    取 值0/2/4/8。若 nTemporalSVC为 0,则可独立使用;否则没意 义, 实 际 跳 帧 受nTemporalSVC 控制。
    关于SVC可参考H.264 SVC。

你可能感兴趣的:(图像视频)