QP是在视频采集编码过程中的量化参数,其值与画面质量成反比,即QP值越大画面质量越小,其具体调整方法如下:
typedef struct rkVENC_RC_PARAM_S {
RK_U32 u32ThrdI[RC_TEXTURE_THR_SIZE]; // [0, 255]
RK_U32 u32ThrdP[RC_TEXTURE_THR_SIZE]; // [0, 255]
RK_U32 u32RowQpDeltaI; // [0, 10]
RK_U32 u32RowQpDeltaP; // [0, 10]
RK_U32 s32FirstFrameStartQp; // RW; Start QP value of the first frame
union {
VENC_PARAM_H264_S stParamH264;
VENC_PARAM_H265_S stParamH265;
VENC_PARAM_MJPEG_S stParamMjpeg;
};
} VENC_RC_PARAM_S;
RK_U32 u32ThrdI[RC_TEXTURE_THR_SIZE];
RK_U32 u32ThrdP[RC_TEXTURE_THR_SIZE];
分别表示I帧与P帧的阈值,一般来说不改动,这个数组是控制宏块画面质量,对于一帧图片来说改动其内部宏块的意义其实不大,因此我们通常不改动。
RK_U32 u32RowQpDeltaI; // [0, 10]
RK_U32 u32RowQpDeltaP; // [0, 10]
分别表示I帧、P帧的宏块的QP值与整个帧的QP值之间的可接受的波动范围。
RK_U32 s32FirstFrameStartQp; // RW; Start QP value of the first frame
第一帧的QP值,默认-1。
下面是H264QP结构体的具体内容:
/* The param of H264e cbr*/
typedef struct rkVENC_PARAM_H264_S {
RK_U32 u32StepQp;
RK_U32 u32MaxQp; // RW; Range:[8, 51];the max QP value
RK_U32 u32MinQp; // RW; Range:[0, 48]; the min QP value,can not be larger than
// u32MaxQp
RK_U32 u32MaxIQp; // RW; max qp for i frame
RK_U32 u32MinIQp; // RW; min qp for i frame,can not be larger
// than u32MaxIQp
// RK_S32 s32MaxReEncodeTimes; /* RW; Range:[0, 3]; Range:max number
// of re-encode times.*/
} VENC_PARAM_H264_S;
RK_U32 u32StepQp;
整个是帧的QP的关键的配置项,其越小画面质量越好,通常配置在1-51之间
RK_U32 u32MaxQp; // RW; Range:[8, 51];the max QP value
RK_U32 u32MinQp; // RW; Range:[0, 48]; the min QP value,can not be larger than
P帧最大最小的QP值
RK_U32 u32MaxIQp; // RW; max qp for i frame
RK_U32 u32MinIQp;
I帧最大最小的QP值
下面是关于QP的使用,其实我们只需要在VENC下面定义结构体
VENC_RC_PARAM_S venc_rc_param;
配置该结构体后使用该函数进行初始化即可
ret = RK_MPI_VENC_SetRcParam(0, &venc_rc_param);
即可,其不需要单独的进行管道的配置
效果如下:
在文件大小中第一个视频的大小为20m第二个为3m,静态图片从键盘来看,第一个图片的清晰度远大于第二个