目录
一、码率控制三选一(最核心,互斥)
二、preset:速度 ↔ 压缩效率的总开关
三、tune:在 preset 之后、手设参数之前生效
四、GOP 与帧结构
五、编码分析
六、VBV:硬限码率(直播/硬件解码必用)
七、实时/低延迟专项(RTMP、WebRTC 网关、采集卡)
八、profile / level(兼容性闸门)
九、线程与日志
十、两条可直接抄的工程模板
1. 存档压片(质量优先)
2. RTMP 推流(延迟优先)
十一、一句话总结
觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。
由于能力水平有限,文中的错误或不严谨的地方在所难免,还请批评指正。
本文系统拆解了 libx264 的核心编码参数体系,覆盖从入门到工程落地的关键逻辑:首先明确码率控制三模式——CRF(固定主观质量)、ABR(平均码率)、CQP(固定QP)的互斥关系与适用场景,给出 CRF 18~28 的实用选型区间;其次厘清 preset(速度/压缩效率权衡)与 tune(内容适配)的层级关系,点出
zerolatency是实时推流核心开关;再详解 GOP 帧结构、VBV 硬限码率(解决直播峰值卡顿)、profile/level 兼容性边界,并对比默认分析参数与手动调优边界。最后提供「存档压片」「RTMP 低延迟推流」两套可直接抄的参数模板,总结“preset 定效率、CRF 定画质、VBV 定网络、tune 定内容”的心智模型,避免新手盲目调参。全文兼顾 FFmpeg 命令行与 C API 映射,偏工程实战而非手册堆砌。
一、码率控制三选一(最核心,互斥)
x264 内部只认三种 RC 模式,qp / bitrate / crf 不能同时设。优先级:bitrate > qp > crf。
模式 | 参数 | 目标 | 文件大小 | 画质分布 | 适用 |
|---|---|---|---|---|---|
CQP |
| 固定 QP | 不可控 | 每帧同损耗 | 算法验证 |
ABR |
| 平均码率 | 可控 | 一般 | 1-pass 流媒体 |
CRF |
| 固定主观质量 | 不可控 | 最好 | 存档/压片 |
CRF 范围 0–51(8-bit),0 无损,23 默认,18≈视觉无损,+6 码率减半,-6 翻倍。
10-bit x264:CRF 范围 0–63。
工程建议:
存档/母版:
-crf 18~20普通压片:
-crf 21~23Web/720p:
-crf 24~28
qpmin/qpmax/qpstep:QP 上下限与帧间跳变限制(默认 0/51/4)。ipratio=1.4 / pbratio=1.3:I/P、P/B 帧间 QP 比例。aq-mode=1(方差 AQ)、aq-strength=1.0:暗部/纹理再分配码率,CRF 下必开。
二、preset:速度 ↔ 压缩效率的总开关
x264_param_default_preset()或-preset:
ultrafast → superfast → veryfast → faster → fast → medium(默认) → slow → slower → veryslow → placebo(别用)越慢 → 同画质体积越小(veryslow 比 medium 小 10–20%),但 CPU 时间指数涨。
preset 内部改的关键项(了解即可,别手改除非你懂):
me=hex→umh→tesasubme=0→11ref=1→16bframes、b-adapt、rc-lookahead、trellis、cabac、8x8dct、partitions
经验:批量转码
veryfast/fast,珍藏slow,实时ultrafast。
三、tune:在 preset 之后、手设参数之前生效
tune不和 preset 互斥,按内容微调:
film:真人电影,轻微降 deblockanimation:动画,加 ref/bframes、强 deblockgrain:保留胶片颗粒(aq-strength↓、deblock↓)stillimage:幻灯片fastdecode:关 cabac/deblock,解端省 CPUzerolatency:实时推流神参,等价设bframes=0 rc-lookahead=0 sync-lookahead=0 no-mb-tree=1 sliced-threads=1
四、GOP 与帧结构
参数 | 含义 | 建议 |
|---|---|---|
| GOP 长度 |
|
| 最小关键帧间隔 | 直播设=keyint |
| 场景切换插 I 帧阈值 | 关实时: |
| 连续 B 帧数 | 默认 3,slow 下 6~8 |
| B 帧放置策略 | 0/1/2,2 最优但慢 |
| 参考帧数 | 3~5 通用,>8 吃 DPB,硬件解码慎超 4~6 |
| 允许 B 帧作参考 | 开(High profile) |
| 权重预测 | 开,zerolatency 关 |
五、编码分析
me=umh:运动估计算法(dia/hex/umh/tesa)subme=9:子像素精修级别partitions=p8x8,b8x8,i8x8,i4x4:宏块划分8x8dct=1:High profile 特性cabac=1:熵编码,关掉省解码 CPU 但体积涨 10–15%deblock=0:0:环内去块,alpha/beta 可调no-fast-pskip=1:防平区域跳过导致细节丢rc-lookahead:前向决策帧类型(默认 40,zerolatency=0)mb-tree:宏观块树 RC,实时关mbtree=0
六、VBV:硬限码率(直播/硬件解码必用)
CRF 也能加 VBV,变成“质量优先但不超峰峰”:
-crf 23 -maxrate 2500k -bufsize 5000k对应:
rc.i_vbv_max_bitraterc.i_vbv_buffer_sizerc.f_vbv_buffer_init=0.9
ABR + VBV 就是“CBR-ish”推流标配。
七、实时/低延迟专项(RTMP、WebRTC 网关、采集卡)
C 层经典初始化:
x264_param_default_preset(&p, "ultrafast", "zerolatency"); p.i_keyint_max = 30; // 1s@30fps p.b_repeat_headers = 1; // 每个 IDR 带 SPS/PPS(FLV 必需) p.rc.i_rc_method = X264_RC_ABR; p.rc.i_bitrate = 2000; p.rc.i_vbv_max_bitrate = 2000; p.rc.i_vbv_buffer_size = 4000; p.b_mb_tree = 0; x264_param_apply_profile(&p, "high");FFmpeg 等价:
-c:v libx264 -preset ultrafast -tune zerolatency \ -x264-params keyint=30:min-keyint=30:no-scenecut=1:bframes=0 \ -b:v 2000k -maxrate 2000k -bufsize 4000k -f flv rtmp://...八、profile / level(兼容性闸门)
baseline:老移动/iOS 硬解,禁 cabac/8x8dct/B-pyramidmain:过渡high:通用(默认选它)high10/422/444:10bit/无损,浏览器不支持
level_idc按分辨率帧率查表(1080p30 一般 4.0,4.1 保险)。
设了
profile后不能 crf 0 / qp 0 无损。
九、线程与日志
i_threads:0=自动(=逻辑核),嵌入式可设 1~2 防同步开销i_log_level:X264_LOG_INFO调试用b_repeat_headers:封装格式(FLV/MP4 流式写入)必须 1
十、两条可直接抄的工程模板
1. 存档压片(质量优先)
ffmpeg -i in.mov -c:v libx264 -preset slow -tune film \ -crf 20 -x264-params ref=4:me=umh:subme=9:b-adapt=2:aq-mode=2 \ -profile:v high -c:a aac -b:a 192k out.mkv2. RTMP 推流(延迟优先)
ffmpeg -i in.mp4 -c:v libx264 -preset ultrafast -tune zerolatency \ -x264-params keyint=30:min-keyint=30:no-scenecut=1:bframes=0:rc-lookahead=0 \ -b:v 2500k -maxrate 2500k -bufsize 5000k -pix_fmt yuv420p \ -f flv rtmp://server/app/stream十一、一句话总结
preset 决定“花多少 CPU 换压缩率”,crf 决定“画质底线”,tune 决定“对什么内容偏心”,VBV 决定“网络/解码器能不能扛”,keyint/bframes 决定“延迟和 seek 体验”。
新手永远先
crf + preset slow + tune 内容类型,别手调 subme/me/aq 直到你能用x264 --fullhelp解释每一行输出。