背景

创建 x264 编码器后,其有一组默认的编码器配置参数,也可以根据需要修改参数,来满足编码要求。

具体参数

可修改的参数,比较多,这边只列举一些常用的。

获取可以配置的参数

方式1

查看 ffmpeg源码 libx264.c,其中
static const AVOption options[] = {xx};这表示其可修改的参数,其他编码器类似。

static const AVOption options[] = {{ "preset","Set the encoding preset (cf. x264 --fullhelp)", OFFSET(preset),AV_OPT_TYPE_STRING, { .str = "medium" }, 0, 0, VE},{ "tune","Tune the encoding params (cf. x264 --fullhelp)",OFFSET(tune),AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE},{ "profile", "Set profile restrictions (cf. x264 --fullhelp)",OFFSET(profile_opt), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE},{ "fastfirstpass", "Use fast settings when encoding first pass",OFFSET(fastfirstpass), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE},{"level", "Specify level (as defined by Annex A)", OFFSET(level), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},{"passlogfile", "Filename for 2 pass stats", OFFSET(stats), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},{"wpredp", "Weighted prediction for P-frames", OFFSET(wpredp), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},{"a53cc","Use A53 Closed Captions (if available)",OFFSET(a53_cc),AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, VE},{"x264opts", "x264 options", OFFSET(x264opts), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, VE},{ "crf", "Select the quality for constant quality mode",OFFSET(crf), AV_OPT_TYPE_FLOAT,{.dbl = -1 }, -1, FLT_MAX, VE },{ "crf_max", "In CRF mode, prevents VBV from lowering quality beyond this point.",OFFSET(crf_max), AV_OPT_TYPE_FLOAT, {.dbl = -1 }, -1, FLT_MAX, VE },{ "qp","Constant quantization parameter rate control method",OFFSET(cqp),AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, INT_MAX, VE },{ "aq-mode", "AQ method", OFFSET(aq_mode), AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, INT_MAX, VE, "aq_mode"},{ "none",NULL,0, AV_OPT_TYPE_CONST, {.i64 = X264_AQ_NONE}, INT_MIN, INT_MAX, VE, "aq_mode" },{ "variance","Variance AQ (complexity mask)", 0, AV_OPT_TYPE_CONST, {.i64 = X264_AQ_VARIANCE}, INT_MIN, INT_MAX, VE, "aq_mode" },{ "autovariance","Auto-variance AQ",0, AV_OPT_TYPE_CONST, {.i64 = X264_AQ_AUTOVARIANCE}, INT_MIN, INT_MAX, VE, "aq_mode" },#if X264_BUILD >= 144{ "autovariance-biased", "Auto-variance AQ with bias to dark scenes", 0, AV_OPT_TYPE_CONST, {.i64 = X264_AQ_AUTOVARIANCE_BIASED}, INT_MIN, INT_MAX, VE, "aq_mode" },#endif{ "aq-strength", "AQ strength. Reduces blocking and blurring in flat and textured areas.", OFFSET(aq_strength), AV_OPT_TYPE_FLOAT, {.dbl = -1}, -1, FLT_MAX, VE},{ "psy", "Use psychovisual optimizations.", OFFSET(psy), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },{ "psy-rd","Strength of psychovisual optimization, in : format.", OFFSET(psy_rd), AV_OPT_TYPE_STRING,{0 }, 0, 0, VE},{ "rc-lookahead","Number of frames to look ahead for frametype and ratecontrol", OFFSET(rc_lookahead), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE },{ "weightb", "Weighted prediction for B-frames.", OFFSET(weightb), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },{ "weightp", "Weighted prediction analysis method.",OFFSET(weightp), AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, INT_MAX, VE, "weightp" },{ "none",NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_WEIGHTP_NONE}, INT_MIN, INT_MAX, VE, "weightp" },{ "simple",NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_WEIGHTP_SIMPLE}, INT_MIN, INT_MAX, VE, "weightp" },{ "smart", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_WEIGHTP_SMART},INT_MIN, INT_MAX, VE, "weightp" },{ "ssim","Calculate and print SSIM stats.", OFFSET(ssim),AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },{ "intra-refresh", "Use Periodic Intra Refresh instead of IDR frames.",OFFSET(intra_refresh),AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },{ "bluray-compat", "Bluray compatibility workarounds.", OFFSET(bluray_compat) ,AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE },{ "b-bias","Influences how often B-frames are used",OFFSET(b_bias),AV_OPT_TYPE_INT,{ .i64 = INT_MIN}, INT_MIN, INT_MAX, VE },{ "b-pyramid", "Keep some B-frames as references.", OFFSET(b_pyramid), AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, INT_MAX, VE, "b_pyramid" },{ "none",NULL,0, AV_OPT_TYPE_CONST, {.i64 = X264_B_PYRAMID_NONE}, INT_MIN, INT_MAX, VE, "b_pyramid" },{ "strict","Strictly hierarchical pyramid", 0, AV_OPT_TYPE_CONST, {.i64 = X264_B_PYRAMID_STRICT}, INT_MIN, INT_MAX, VE, "b_pyramid" },{ "normal","Non-strict (not Blu-ray compatible)", 0, AV_OPT_TYPE_CONST, {.i64 = X264_B_PYRAMID_NORMAL}, INT_MIN, INT_MAX, VE, "b_pyramid" },{ "mixed-refs","One reference per partition, as opposed to one reference per macroblock", OFFSET(mixed_refs), AV_OPT_TYPE_BOOL, { .i64 = -1}, -1, 1, VE },{ "8x8dct","High profile 8x8 transform.", OFFSET(dct8x8),AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE},{ "fast-pskip",NULL,OFFSET(fast_pskip),AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE},{ "aud", "Use access unit delimiters.", OFFSET(aud), AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE},{ "mbtree","Use macroblock tree ratecontrol.",OFFSET(mbtree),AV_OPT_TYPE_BOOL, { .i64 = -1 }, -1, 1, VE},{ "deblock", "Loop filter parameters, inform.", OFFSET(deblock), AV_OPT_TYPE_STRING, { 0 },0, 0, VE},{ "cplxblur","Reduce fluctuations in QP (before curve compression)", OFFSET(cplxblur), AV_OPT_TYPE_FLOAT,{.dbl = -1 }, -1, FLT_MAX, VE},{ "partitions","A comma-separated list of partitions to consider. " "Possible values: p8x8, p4x4, b8x8, i8x8, i4x4, none, all", OFFSET(partitions), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE},{ "direct-pred", "Direct MV prediction mode", OFFSET(direct_pred), AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, INT_MAX, VE, "direct-pred" },{ "none",NULL,0,AV_OPT_TYPE_CONST, { .i64 = X264_DIRECT_PRED_NONE }, 0, 0, VE, "direct-pred" },{ "spatial", NULL,0,AV_OPT_TYPE_CONST, { .i64 = X264_DIRECT_PRED_SPATIAL },0, 0, VE, "direct-pred" },{ "temporal",NULL,0,AV_OPT_TYPE_CONST, { .i64 = X264_DIRECT_PRED_TEMPORAL }, 0, 0, VE, "direct-pred" },{ "auto",NULL,0,AV_OPT_TYPE_CONST, { .i64 = X264_DIRECT_PRED_AUTO }, 0, 0, VE, "direct-pred" },{ "slice-max-size","Limit the size of each slice in bytes", OFFSET(slice_max_size),AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, INT_MAX, VE },{ "stats", "Filename for 2 pass stats", OFFSET(stats), AV_OPT_TYPE_STRING, { 0 },0, 0, VE },{ "nal-hrd", "Signal HRD information (requires vbv-bufsize; " "cbr not allowed in .mp4)",OFFSET(nal_hrd), AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, INT_MAX, VE, "nal-hrd" },{ "none",NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_NAL_HRD_NONE}, INT_MIN, INT_MAX, VE, "nal-hrd" },{ "vbr", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_NAL_HRD_VBR},INT_MIN, INT_MAX, VE, "nal-hrd" },{ "cbr", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_NAL_HRD_CBR},INT_MIN, INT_MAX, VE, "nal-hrd" },{ "avcintra-class","AVC-Intra class 50/100/200/300/480",OFFSET(avcintra_class),AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, 480 , VE},{ "me_method","Set motion estimation method", OFFSET(motion_est),AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, X264_ME_TESA, VE, "motion-est"},{ "motion-est", "Set motion estimation method", OFFSET(motion_est),AV_OPT_TYPE_INT,{ .i64 = -1 }, -1, X264_ME_TESA, VE, "motion-est"},{ "dia", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_DIA },INT_MIN, INT_MAX, VE, "motion-est" },{ "hex", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_HEX },INT_MIN, INT_MAX, VE, "motion-est" },{ "umh", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_UMH },INT_MIN, INT_MAX, VE, "motion-est" },{ "esa", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_ESA },INT_MIN, INT_MAX, VE, "motion-est" },{ "tesa",NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_TESA }, INT_MIN, INT_MAX, VE, "motion-est" },{ "forced-idr", "If forcing keyframes, force them as IDR frames.",OFFSET(forced_idr),AV_OPT_TYPE_BOOL, { .i64 = 0 }, -1, 1, VE },{ "coder","Coder type", OFFSET(coder), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE, "coder" },{ "default",NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, INT_MIN, INT_MAX, VE, "coder" },{ "cavlc",NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 },INT_MIN, INT_MAX, VE, "coder" },{ "cabac",NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 },INT_MIN, INT_MAX, VE, "coder" },{ "vlc",NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 },INT_MIN, INT_MAX, VE, "coder" },{ "ac", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 },INT_MIN, INT_MAX, VE, "coder" },{ "b_strategy", "Strategy to choose between I/P/B-frames",OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 2, VE },{ "chromaoffset", "QP difference between chroma and luma",OFFSET(chroma_offset), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, VE },{ "sc_threshold", "Scene change threshold", OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX, VE },{ "noise_reduction", "Noise reduction", OFFSET(noise_reduction), AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX, VE },{ "udu_sei","Use user data unregistered SEI if available",OFFSET(udu_sei),AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },{ "x264-params","Override the x264 configuration using a :-separated list of key=value parameters", OFFSET(x264_params), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE },{ NULL },};

方式2

通过 ffmpeg 命令行查找
ffmpeg -h encoder=libx264

常用参数讲解

preset

主要调节编码速度和质量的平衡
可以设置的值,{ “ultrafast”, “superfast”, “veryfast”, “faster”, “fast”, “medium”, “slow”, “slower”, “veryslow”, “placebo”, 0 };
如何获取可以设置哪些值,看注释是编译 x264,然后运行 x264 –fullhelp 可以看到。我这边嫌麻烦没有编译,看 x264 源码获取的

tune

主要配合视频类型和视觉优化的参数
可以设置的值,{ “film”, “animation”, “grain”, “stillimage”, “psnr”, “ssim”, “fastdecode”, “zerolatency”, 0 };
film: 电影、真人类型;
animation: 动画;
grain: 需要保留大量的grain时用;
psnr: 为提高psnr做了优化的参数;
ssim: 为提高ssim做了优化的参数;
fastdecode: 可以快速解码的参数;
zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。

profile

支持一组特定的编码功能,并支持一类特定的应用
x264_profile_names[] = { “baseline”, “main”, “high”, “high10”, “high422”, “high444”, 0 };
baseline:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;   
main:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),也支持CAVLC 和CABAC 的支持;
high:高级画质。在main Profile 的基础上增加了8×8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;

level

每个profile 都规定了一个算法特征和限制的子集,任何遵守某个profile 的解码器都应该支持与其相应的子集。
每个level都规定了一组对标准中语法成员(syntax element)所采用的各种参数值的限制。

nal-hrd

码率控制方式 。
none —— 不使用 hrd
vbr —— 可变码率
cbr —— 稳定码率

crf

qp

psy

rc-lookahead

参考文献

https://blog.csdn.net/liuzehn/article/details/124995312
https://www.cnblogs.com/poissonnotes/p/6904728.html
https://blog.csdn.net/A199222/article/details/85785198