X264的文档内容比较多,参数也不少,我就挑一些重要的参数给大家分享一下。
#nal_unit_type_e//NAL的类型
enum nal_unit_type_e
{
NAL_UNKNOWN = 0,//未知类型
NAL_SLICE = 1,//不分区、不是IDR 图像的片
NAL_SLICE_DPA = 2,//片分区A
NAL_SLICE_DPB = 3,//片分区B
NAL_SLICE_DPC = 4,//片分区C
NAL_SLICE_IDR = 5, /* ref_idc != 0 *///序列参数集
NAL_SEI = 6, /* ref_idc == 0 *///图像参数集
NAL_SPS = 7,//分界符
NAL_PPS = 8,//序列结束
NAL_AUD = 9,//码流结束
NAL_FILLER = 12,//填充模式
/* ref_idc == 0 for 6,9,10,11,12 */
};
enum nal_priority_e
enum nal_priority_e//NAL单元的优先级
{
NAL_PRIORITY_DISPOSABLE = 0,
NAL_PRIORITY_LOW = 1,
NAL_PRIORITY_HIGH = 2,
NAL_PRIORITY_HIGHEST = 3,
};
typedef struct x264_nal_t
typedef struct x264_nal_t
{
int i_ref_idc; //nal的优先级
int i_type; //nal单元的类型
int b_long_startcode; // 是否采用长前缀码0x00000001
int i_first_mb; // 如果Nal为一条带,则表示该条带第一个宏块的指数
int i_last_mb; // 如果Nal为一条带,则表示该条带最后一个宏块的指数
int i_payload; // payload 的字节大小
uint8_t *p_payload; // 存放编码后的数据,已经封装成Nal单元
int i_padding;//尾部补全的字节数
} x264_nal_t;
Analyse flags
/* Analyse flags */
#define X264_ANALYSE_I4x4 0x0001 /* Analyse i4x4 */
#define X264_ANALYSE_I8x8 0x0002 /* Analyse i8x8 (requires 8x8 transform) */
#define X264_ANALYSE_PSUB16x16 0x0010 /* Analyse p16x8, p8x16 and p8x8 */
#define X264_ANALYSE_PSUB8x8 0x0020 /* Analyse p8x4, p4x8, p4x4 */
#define X264_ANALYSE_BSUB16x16 0x0100 /* Analyse b16x8, b8x16 and b8x8 */
#define X264_DIRECT_PRED_NONE 0//直接预测方法
#define X264_DIRECT_PRED_SPATIAL 1//空间
#define X264_DIRECT_PRED_TEMPORAL 2//时间
#define X264_DIRECT_PRED_AUTO 3
#define X264_ME_DIA 0//运动估计方法
#define X264_ME_HEX 1
#define X264_ME_UMH 2
#define X264_ME_ESA 3
#define X264_ME_TESA 4
#define X264_CQM_FLAT 0//自定义量化矩阵方法
#define X264_CQM_JVT 1
#define X264_CQM_CUSTOM 2
#define X264_RC_CQP 0// 码率控制方法
#define X264_RC_CRF 1
#define X264_RC_ABR 2
#define X264_QP_AUTO 0
#define X264_AQ_NONE 0
#define X264_AQ_VARIANCE 1
#define X264_AQ_AUTOVARIANCE 2
#define X264_AQ_AUTOVARIANCE_BIASED 3
#define X264_B_ADAPT_NONE 0 // 自适应B帧
#define X264_B_ADAPT_FAST 1
#define X264_B_ADAPT_TRELLIS 2
#define X264_WEIGHTP_NONE 0// P帧权重
#define X264_WEIGHTP_SIMPLE 1
#define X264_WEIGHTP_SMART 2
#define X264_B_PYRAMID_NONE 0// 参见param->i_bframe_pyramid ,B帧可作为参考帧
#define X264_B_PYRAMID_STRICT 1
#define X264_B_PYRAMID_NORMAL 2
#define X264_KEYINT_MIN_AUTO 0// IDR帧间距param->i_keyint_max / i_keyint_min
#define X264_KEYINT_MAX_INFINITE (1<<30)
static const char * const x264_direct_pred_names[] = { "none", "spatial", "temporal", "auto", 0 };
static const char * const x264_motion_est_names[] = { "dia", "hex", "umh", "esa", "tesa", 0 };
static const char * const x264_b_pyramid_names[] = { "none", "strict", "normal", 0 };
static const char * const x264_overscan_names[] = { "undef", "show", "crop", 0 };
static const char * const x264_vidformat_names[] = { "component", "pal", "ntsc", "secam", "mac", "undef", 0 };
static const char * const x264_fullrange_names[] = { "off", "on", 0 };
static const char * const x264_colorprim_names[] = { "", "bt709",
"undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "film", "bt2020", 0 };
static const char * const x264_transfer_names[] = { "", "bt709", "undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "linear", "log100", "log316",
"iec61966-2-4", "bt1361e", "iec61966-2-1", "bt2020-10", "bt2020-12", 0 };
static const char * const x264_colmatrix_names[] = { "GBR", "bt709", "undef", "", "fcc", "bt470bg", "smpte170m", "smpte240m", "YCgCo", "bt2020nc", "bt2020c", 0 };
static const char * const x264_nal_hrd_names[] = { "none", "vbr", "cbr", 0 };
Colorspace type
/* Colorspace type:设置输出的视频的采样格式 */
#define X264_CSP_MASK 0x00ff /* */
#define X264_CSP_NONE 0x0000 /* Invalid mode */
#define X264_CSP_I420 0x0001 /* yuv 4:2:0 planar */
#define X264_CSP_YV12 0x0002 /* yvu 4:2:0 planar */
#define X264_CSP_NV12 0x0003 /* yuv 4:2:0, with one y plane and one packed u+v */
#define X264_CSP_NV21 0x0004 /* yuv 4:2:0, with one y plane and one packed v+u */
#define X264_CSP_I422 0x0005 /* yuv 4:2:2 planar */
#define X264_CSP_YV16 0x0006 /* yvu 4:2:2 planar */
#define X264_CSP_NV16 0x0007 /* yuv 4:2:2, with one y plane and one packed u+v */
#define X264_CSP_V210 0x0008 /* 10-bit yuv 4:2:2 packed in 32 */
#define X264_CSP_I444 0x0009 /* yuv 4:4:4 planar */
#define X264_CSP_YV24 0x000a /* yvu 4:4:4 planar */
#define X264_CSP_BGR 0x000b /* packed bgr 24bits */
#define X264_CSP_BGRA 0x000c /* packed bgr 32bits */
#define X264_CSP_RGB 0x000d /* packed rgb 24bits */
#define X264_CSP_MAX 0x000e /* end of list */
#define X264_CSP_VFLIP 0x1000 /* the csp is vertically flipped */
#define X264_CSP_HIGH_DEPTH 0x2000 /* the csp has a depth of 16 bits per pixel component */
Rate control parameters
/* Rate control parameters*/
struct
{
int i_rc_method; //码率控制
int i_qp_constant; //QP值,范围0~51,值越大图像越模糊,默认23
int i_qp_min; //允许的最小量化值
int i_qp_max; //允许的最大量化值
int i_qp_step; //帧间最大量化步长
int i_bitrate; //设置平均码率
float f_rf_constant; //是实际质量,越大图像越花,越小越清晰
float f_rf_constant_max; //图像质量的最大值
float f_rate_tolerance;//允许的误差
int i_vbv_max_bitrate;//平均码率模式下,最大瞬时码率,默认0(与-B设置相同)
int i_vbv_buffer_size;//率控制缓冲区的大小,单位kbit,默认0
float f_vbv_buffer_init; // <=1: fraction of buffer_size. >1: kbit码率控制缓冲区数据保留的最[大数据](http://lib.csdn.net/base/20)量与缓冲区大小之比,范围0~1.0,默认0.9
float f_ip_factor;//ip--i帧p帧的qp的差值
float f_pb_factor;//pb--p帧b帧的qp的差值
/* VBV filler: force CBR VBV and use filler bytes to ensure hard-CBR.
* Implied by NAL-HRD CBR. */
int b_filler;
int i_aq_mode; // 自适应量化(AQ)模式。
// 0:关闭AQ
// 1:允许AQ在整个视频中和帧内重新分配码
// 2:自方差AQ(实验阶段),尝试逐帧调整强度
float f_aq_strength;//AQ强度,减少平趟和纹理区域的块效应和模糊度
int b_mb_tree; //是否开启基于macroblock的qp控制方法,开启之后质量有所提升
int i_lookahead; // 决定mbtree向前预测的帧数
/* 2pass */
int b_stat_write; //是否将统计数据写入到文件psz_stat_out中
char *psz_stat_out; // 输出文件用于保存第一次编码统计数据
int b_stat_read; // 是否从文件psz_stat_in中读入统计数据
char *psz_stat_in; // 输入文件存有第一次编码的统计数据
/* 2pass params (same as ffmpeg ones) */
float f_qcompress; //量化曲线(quantizer curve)压缩因子。范围0-1
0.0 => cbr(constant bitrate), 1.0 => constant qp(constatnt quantity(p frame))
越小-》码率越恒定,越大-》量化越恒定
float f_qblur; //时间上模糊量化,减少QP的波动(after curve compression)
float f_complexity_blur; //时间上模糊复杂性,减少QP的波动(before curve compression)
x264_zone_t *zones; // 码率控制覆盖
int i_zones; /* number of zone_t's */
char *psz_zones; /* alternate method of specifying zones */
} rc;
x264_level_t
//在给定的profile下,level通常与解码器的处理能力和内存容量相对应。每一个档次设置不同的参数
//(如取样速率、图像尺寸、编码比特率等),得到对应的编解码器性能的不同level。
typedef struct x264_level_t
{
int level_idc;
int mbps; //兆比特每秒
int frame_size; //最大帧的大小
int dpb; // 最大的解码图像缓冲区
int bitrate; //比特率
int cpb; /* max vbv buffer (kbit) */
int mv_range; //最大的垂直的mv分量的范围
int mvs_per_2mb; /* max mvs per 2 consecutive mbs. */
int slice_rate; /* ?? */
int mincr; /* min compression ratio */
int bipred8x8; /* limit bipred to >=8x8 */
int direct8x8; /* limit b_direct to >=8x8 */
int frame_only; /* forbid interlacing */
} x264_level_t;
x264_image_t
x264_image_t 结构用于存放一帧图像实际像素数据
typedef struct
{
int i_csp; // 设置彩色空间,通常取值 X264_CSP_I420,所有可能取值定义在x264.h中
int i_plane; // 图像平面个数,例如彩色空间是YUV420格式的,此处取值3
int i_stride[4]; // 每个图像平面的跨度,也就是每一行数据的字节数
uint8_t *plane[4]; // 每个图像平面存放数据的起始地址, plane[0]是Y平面,
// plane[1]和plane[2]分别代表U和V平面
} x264_image_t;
x264_picture_t
x264_picture_t 结构体描述一视频帧的特征
typedef struct
{
int i_type; // 帧的类型,取值有
X264_TYPE_KEYFRAME、X264_TYPE_P、
// X264_TYPE_AUTO等。初始化为
auto,则在编码过程自行控制。
int i_qpplus1; // 此参数减1代表当前帧的量化参数值
int i_pic_struct; // 帧的结构类型,表示是帧还是场,是逐行还是隔行,
// 取值为枚举值 pic_struct_e,定义在x264.h中
int b_keyframe; // 输出:是否是关键帧
int64_t i_pts; // 一帧的显示时间戳
int64_t i_dts; // 输出:解码时间戳。当一帧的pts非常接近0时,该dts值可能为负。
/* 编码器参数设置,如果为NULL则表示继续使用前一帧的设置。某些参数
(例如aspect ratio) 由于收到H264本身的限制,只能每隔一个GOP才能改变。
这种情况下,如果想让这些改变的参数立即生效,则必须强制生成一个IDR帧。*/
x264_param_t *param;
x264_image_t img; // 存放一帧图像的真实数据
x264_image_properties_t prop;
x264_hrd_t hrd_timing; // 输出:HRD时间信息,仅当i_nal_hrd设置了才有效
void *opaque; // 私有数据存放区,将输入数据拷贝到输出帧中
} x264_picture_t ;
x264_nal_t
x264_nal_t中的数据在下一次调用x264_encoder_encode之后就无效了,因此必须在调用
x264_encoder_encode 或 x264_encoder_headers 之前使用或拷贝其中的数据。
typedef struct
{
int i_ref_idc; // Nal的优先级
int i_type; // Nal的类型
int b_long_startcode; // 是否采用长前缀码0x00000001
int i_first_mb; // 如果Nal为一条带,则表示该条带第一个宏块的指数
int i_last_mb; // 如果Nal为一条带,则表示该条带最后一个宏块的指数
int i_payload; // payload 的字节大小
uint8_t *p_payload; // 存放编码后的数据,已经封装成Nal单元
} x264_nal_t;
cli_opt_t
结构体主要记录一些与编码关系较小的设置信息,其变量可通过读取main()的参数获得。
typedef struct
{
int b_progress; // bool类型的变量,用来控制是否显示编码进度。取值为0或1。
int i_seek; // 整数类型 表示开始从哪一帧开始编码。
// 因为不一定从文件的第一帧开始编码,这是可以控制的。
/* hnd_t(hnd=handle)是一个空指针, 定义在x264cli.h 中。void *在C语言里空指针是有几个
特性的,它是一个一般化指针,可以指向任何一种类型,但却不能解引用,需要解引
用的时候,需要进行强制转换。采用空指针的策略,是为了声明变量的简便和统一。 */
hnd_t hin; // 指向输入yuv文件的指针
hnd_t hout; // 指向编码过后生成的文件的指针。
/* 一个指向文件类型的指针,它是文本文件,其每一行的格式是 :framenum frametye
QP用于强制指定某些帧或者全部帧的帧类型和QP(quant param量化参数)的值. */
FILE *qpfile;
} cli_opt_t;