x264编码库libx264实现真正的视频编解码,该编解码算法是基于块的混合编码技术,即帧内/帧间预测,然后对预测值变换、量化,最后熵编码所得。
编码帧的类型分为I帧(x264_type_i)、P帧(x264_type_p)、B帧(x264_type_b),在H264中叫做图像片Slice。X264把整帧图像看作一个Slice,片中有slice_type_i、slice_type_p、slice_type_b之分。I帧只有slice_type_i,P帧有slice_type_i、slice_type_p,B帧三种片都有。
x264的H264视频编码过程可以分为三个步骤:首先根据规则判定当前帧的编码类型,如果是B帧,要缓冲存放、获取;然后对待编码图像进行帧内预测、帧间预测、整数DCT变换、量化和熵编码;最后把压缩的H264数据进行NAL层打包输出。
x264编码器有关的重要结构体:
x264_image_t:实际参与编码的编码帧图像信息。
typedef struct
{
int i_csp; //图像空间颜色
int i_plane; //图像平面数目
int i_stride[4]; //每个图像平面的跨度,也就是每一行数据的字节数
uint8_t *plane[4]; //每个图像平面存放数据的起始地址,plane[0]是Y平面,plane[1]是U平面,plane[2]是V平面
}x264_image_t; //待编码的图像
x264_picture_t:x264编码器定义便于控制的图像帧,描述一帧的特征。包含x264_image_t和x264_param_t结构体。
typedef struct
{
int i_type; //帧的类型,初始化为auto,在编码过程自行控制
int i_qpplus1; //此参数减1代表当前帧的量化参数值
int i_pic_struct; //帧的结构类型
int b_keyframe; //输出是否是关键帧
int64_t i_pts; //一帧的显示时间戳
int64_t i_dts; //输出解码时间戳
x264_param_t *param;
x264_image_t img;
x264_image_properties_t prop;
x264_hrd_t hrd_timing;
void *opaque;
} x264_picture_t; //x264编码视频帧
x264_param_t:初始化编码器。
typedef struct
{
unsigned int cpu; //CPU 标志位
int i_threads; //并行编码多帧
int b_sliced_threads; //如果设置为false,一个slice只编码成一个NALU,默认值是true
int b_deterministic; //是否允许非确定性时线程优化
int b_cpu_independent; //强制采用典型行为,而不是采用独立于CPU的优化算法
int i_sync_lookahead; //线程超前缓存帧数
int i_width; //视