H264硬编码
1、功能概述
H264编码主要用于将YUV422的数据通过硬件编码,输出H264图像数据,并且压缩图像数据量
2、开发资料
当前avdk提供了详细的sdk接口,参考文件路径:
.\bk_idk\middleware\driver\h264为了方便客户使用,重新封装了编码功能,当前只需要开关摄像头,然后针对图像质量,也提供一个api接口去调节,参考文件:
.\components\multimedia\app\media_app.c
3、接口说明
基于h264图像质量的调试说明:media_app_set_compression_ratio:
结构体参数说明:
compress_ratio_t
yuv_mode_t mode: 当前需要调节的模式,仅支持JPEG和H264,此处应该选择H264
h264_qp_t h264_qp: h264编码QP的调整,仅支持H264
uint8_t enable: 启动压缩率调节,1/0:启动/关闭
uint16_t jpeg_up: 数据JPEG图像大小的上限值,单位byte,仅在JPEG模式下有效
uint16_t jpeg_low: 数据JPEG图像大小的下限值,单位byte,仅在JPEG模式下有效
uint16_t imb_bits: H264编码输出I帧宏块的大小,单位byte,仅在H264模式下有效,值越大,压缩率越小,图像质量越高,编码输出图像越大,范围[1, 4095]
uint16_t pmb_bits: H264编码输出P帧宏块的大小,单位byte,仅在H264模式下有效,值越大,压缩率越小,图像质量越高,编码输出图像越大,范围[1, 4095]
结构体参数说明:
h264_qp_t
uint8_t init_qp; H264编码时初始化QP,范围[0, 51];
uint8_t i_min_qp; I帧编码的QP最小值,范围[0, 51];
uint8_t i_max_qp; I帧编码的QP最大值,范围[0, 51];
uint8_t p_min_qp; P帧编码的QP最小值,范围[0, 51];
uint8_t p_max_qp; P帧编码的QP最大值,范围[0, 51];
备注
上面的值除了需要注意在有效范围内之外,还需要注意,I/P帧编码的最大值一定要大于其最小值,方可生效。通过上面的接口可以调节图像质量,需要注意提高图像质量无疑会加大数据量,当前一帧yuv422数据编码完成的输出最大空间为64KB,如果调节图像质量, 编码输出的H264图像大于64K,会出现不稳定的问题。
4、编码挡位调节
默认SDK提供了h264编码挡位调节的配置,通过配置宏来定义:
CONFIG_H264_QUALITY_LEVEL,具体说明如下:
取值范围:[0, 3],定义三个挡位,定义的值分别为:1/2/3,分别对应h264压缩图像质量由低到高,图像越清晰。
如果CONFIG_H264_QUALITY_LEVEL=0,不使用三个挡位的参数,而使用默认的值进行配置,默认值参考路径:
.\bk_idk\middleware\soc\bk7258\hal\h264_default_config.h,可以通过修改默认值来达到预期效果。默认SDK的挡位定义在中间挡位,CONFIG_H264_QUALITY_LEVEL=2。用户可以在工程中的配置中将宏改为需要的值。
随着值的增大,图像质量变高更清晰,码率变得更大。
5、P帧个数的调节
默认情况下,SDK配置的H264编码一个帧组(GOP)的P帧个数为5,可以通过宏CONFIG_H264_P_FRAME_CNT进行调节,其有效范围是[0, 1023]。 增加P帧的个数可以降低编码输出的整体码率。
6、调整图像质量的一些建议
SDK提供了三种H264图像质量的预设,通过宏CONFIG_H264_QUALITY_LEVEL进行控制。调节图像质量主要涉及compress_ratio_t结构体中的参数。
调试步骤:
1、调整P帧个数:根据图像内容变化情况,增加P帧个数以降低码率。
2、调整frame_buffer大小:默认为64K,根据需要调整以防止I帧过大导致不出图。建议将CONFIG_H264_FRAME_SIZE的值调到102400(100K)。
3、配置H264图像质量等级:使用CONFIG_H264_QUALITY_LEVEL=0使用SDK原始编码参数。
4、实时调节压缩率:同步观察图像质量和码率,采用控制变量的方法一次只修改一个参数。
5、获取/配置编码参数:使用命令行工具获取编码参数,获取:media h264 get_config,配置:media compress h264 init_qp iframe_max_qp pframe_max_qp num_ibits num_pbits
6、调整初始量化参数(init_qp):从1开始,每次增加5,最大值不超过51,直到图像画面没有明显的宏块跳动。
7、调整I帧编码参数(num_ibits):增大此值,每次增加20,直到图像质量满意,但注意不要过高以避免码率增加,建议最大值不超过200。
8、调整P帧编码参数(num_pbits):与I帧调整类似,增大此值,每次增加20,但注意不要过高以避免码率增加,建议最大值不超过150。
9、循环步骤7-8:继续调整直到找到最佳参数。
10、调整I帧和P帧的最大量化参数(iframe_max_qp和pframe_max_qp):减小这些值可以提高图像质量,也会增大码率,建议最低不应低于32。
11、调整frame_buffer大小:达到最终效果后,如果I帧长度不超过64K,可将其还原为默认值CONFIG_H264_FRAME_SIZE=65536(64K)。
通过这些步骤,您可以优化H264编码过程中的P帧个数和图像质量,以满足特定的应用需求。