X264编码


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

参数解释

1. profile

profile 翻译成中文是“配置文件”的意思,可以理解为通过这个参数对 x264 编码的一些基本参数进行了限制。

可以取的值包括:


/* x264_param_apply_profile:

 *      Applies the restrictions of the given profile.

 *      Currently available profiles are, from most to least restrictive: */

static const char * const x264_profile_names[] = { "baseline", "main", "high", "high10", "high422", "high444", 0 };

baseline

这个级别是设置最严格的配置文件,支持 I/p 帧不支持 B 帧,只支持无交错(逐行Progressive、隔行interlaced)和 CAVLC 编码,一般用于低阶和需要额外容错的应用,例如视频通话和会议电视等实时视频通信。


main

支持 I/P/B 帧,支持无交错(progressive)和交错(interlaced),同样提供对 CAVLC 和 CABAC 的支持,用于主流的消费电子类产品,如低规格的 mp4、便携的视频播放器等。


high

在 main 级别的基础上增加了 8*8 内部预测、自定义量化、无损视频编码和更多的 YUV 格式,用于广播及视频碟片存储、高清电视应用等。


三种 profile 应用的领域不同,baseline 多应用于实时通信领域,main 多应用于流媒体领域,high 多应用于广电和存储领域。


参数优先级

这个参数会覆盖 preset 和 tune 中,以及其他相关的设定值,保证输出 profile 兼容的视频流。如果使用这个选项,将不能进行无损压缩。


2. preset

这个值是 x264 的预设,用于设置 x264 的编码速度。可以取的值有:


static const char * const x264_preset_names[] = { "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo", 0 };


参数优先级

该参数设置了压缩效率和运算时间平衡的预设值,如果设定了,它会在其他选项生效前生效。


3. tune

tune 是 x264 中重要性仅次于 preset 的选项,是视觉优化参数,tune 可以理解为视频偏好(或者视频类型),设置 tune 实际上设置了一套参数集。

可以取的值有:


film

电影类型,对视频质量要求非常严格时使用该选项。

animation

动画片,压缩的视频是动画片时使用该选项。

grain

该选项适用于颗粒感很重的视频。

stillimage

静态图像,该选项适用于静止画面比较多的视频。

psnr

提高 psnr,该选项编码出来的视频的 psnr 比较高。

ssim

提高 ssim,该选项编码出来的视频 ssim 比较高。

fastdecode

快速解码,该选项有利于快速解码。

zerolatency

零延迟,该选项主要用于视频直播。


参数优先级

在 preset 选项的基础上进一步优化输出,如果设定了 tune 值,它将在 preset 后,其他选项前生效。


4. 帧率相关

帧率设置

帧率设置与两个参数有关,分别是:i_fps_num 和 i_fps_den, i_fps_num 默认值为 25,ip_fps_den 默认值为 1,我们通常只需要设置 i_fps_num值即可。

例如,如果我们设置 i_fps_num = 20,那么意味着设置的帧率就是 i_fps_num / i_fps_den = 20。

其中:num 是 numerator 的简写,den 是 denominator 的简写。


关键帧间隔设置

Gop,idr,

Group of picture, Instantaneous Decoding Refresh

Ibbpbbpbbpbbp  Ibbpbbpbbpbbp 

IbPPbppbpp

Fps 25,

Gop 250

Gop 125

IDR,

I,

int         i_keyint_max;       /* Force an IDR keyframe at this interval */

int         i_keyint_min;       /* Scenecuts closer together than this are coded as I, not IDR. */

1

2

IDR 帧时视频流的“分隔符”,所有的帧都不可以使用越过关键帧的帧作为参考帧。这意味着 IDR 帧可以作为视频搜索的起点。


i_keyint_max 表示最大的 IDR 帧间隔,每当收到 IDR 帧,解码器就会清空参考队列,并且更新 SPS 和 PPS 参数。这个值设置的比较小有利于流畅的播放视频,但是会降低压缩效率,建议设置为帧率的 10 倍。这个值设置较大会减少搜索一个随机帧所需的平均时间。默认值为 250,是默认帧率的 10 倍。如果为蓝光、直播流或者其他什么专业流编码,可能需要更小的图像组长(一般等于 fps)。


i_keyint_min 表示最小的关键帧间隔,默认值为 X264_KEYINT_MIN_AUTO。建议取默认值,或者与帧率相等。

Scenecuts 是两个单词的合并,scene cut,表示场景切换。




libx264类库的接口

x264_param_default():设置参数集结构体x264_param_t的缺省值。

x264_picture_alloc():为图像结构体x264_picture_t分配内存。

x264_encoder_open():打开编码器。

x264_encoder_encode():编码一帧图像。

x264_encoder_close():关闭编码器。

x264_picture_clean():释放x264_picture_alloc()申请的资源。



x264_param_t


x264_picture_t

x264_t


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***