4、编码器日志:x264/x265 参数输出解析
转码日志里,编码器那一段往往是最长的,也是最容易被忽略的。很多人扫一眼就过去了,觉得那是编码器自己报的参数,跟分析问题没关系。其实不然——编码器日志里藏着大量调优线索,就看你会不会读。
我个人习惯,拿到一段转码日志,先定位编码器初始化那几行。x264 和 x265 都会在启动时把自己的配置参数打印出来,包括 preset、tune、profile、level、码控模式等等。这些信息,说白了就是编码器的「体检报告」。
4.1 x264 编码器参数输出解析
先看一段典型的 x264 日志开头:
x264 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
x264 [info]: profile High, level 4.0, 4:2:0, 8-bit
x264 [info]: Preset: medium
x264 [info]: Tune: psnr
x264 [info]: ratecontrol: crf=23.0
这几行信息量很大。我来拆开讲:
- cpu capabilities:编码器检测到的 CPU 指令集。如果这里缺少 AVX2 或 SSE4.2,说明你的机器比较老,编码速度会受影响。我在项目中遇到过,同一段视频在不同服务器上编码速度差了一倍,最后发现就是 CPU 指令集差异导致的。
- profile / level:决定了编码器的兼容性。High profile 是主流,level 4.0 对应 1080p@30fps 左右。如果输出设备比较老,可能需要降到 Main 或 Baseline。
- Preset / Tune:这两个参数直接影响编码质量和速度,下面会细讲。
- ratecontrol:码控模式。CRF 还是 ABR,日志里会明确写出来。
x264 [warning]: frame MB size (120x68) > level limit (8192),说明当前分辨率超过了 level 的限制。这时候要么降低分辨率,要么提高 level 值。
4.2 x265 编码器参数输出解析
x265 的日志比 x264 更详细,但也更啰嗦。看一个例子:
x265 [info]: HEVC encoder version 3.5
x265 [info]: build info [Linux][GCC 9.3.0][64 bit] 8bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX AVX2 FMA3
x265 [info]: Main profile, Level-4 (Main tier)
x265 [info]: Preset: medium
x265 [info]: Tune: psnr
x265 [info]: Rate Control: crf=23.0
跟 x264 类似,但多了几项:
- encoder version:版本号很重要。不同版本的 x265 编码行为可能有差异。我曾经因为升级了 x265 版本,导致一批转码任务的码率波动变大,排查了半天才发现是新版本的默认参数变了。
- build info:编译信息。如果用的是 10bit 或 12bit 版本,这里会显示。8bit 和 10bit 的编码效率差距不小。
- Level-4 (Main tier):HEVC 的 level 体系比 AVC 更复杂,有 Main tier 和 High tier 之分。High tier 允许更高的码率。
x265 [warning]: --psnr used with --no-psy 之类的警告。这些警告不是错误,但往往暗示你的参数组合有问题。比如同时开启 PSNR 计算和关闭心理视觉优化,会导致 PSNR 数值虚高,没有实际参考价值。
4.3 编码器预设(preset)对日志的影响
preset 是编码器最核心的参数之一。它控制着编码速度和压缩率的平衡。从 ultrafast 到 placebo,速度越来越慢,压缩率越来越高。
日志里 preset 的体现,不仅仅是那一行 Preset: xxx。不同 preset 下,编码器会启用或禁用大量内部工具。比如:
| Preset | 典型日志特征 | 速度 | 压缩率 |
|---|---|---|---|
| ultrafast | 无 subme、无 me、无分析信息 | 极快 | 低 |
| medium | subme=7, me=hex, ref=3 | 中等 | 中等 |
| slow | subme=9, me=umh, ref=5, b-adapt=2 | 慢 | 高 |
| placebo | subme=11, me=tesa, ref=16, b-adapt=2, no-fast-pskip | 极慢 | 极高 |
你想想看,如果日志里显示 subme=7,但你的目标是最高质量,那显然 preset 选得太低了。反过来,如果日志里显示 subme=11,但你的编码速度只有 0.5fps,那可能就得考虑 trade-off 了。
我的经验:在实际项目中,我很少用 placebo。它带来的压缩率提升微乎其微(通常不到 1%),但编码时间可能是 slow 的 10 倍以上。性价比最高的 preset 是 medium 到 slow 之间。
4.4 调优(tune)对日志的影响
tune 参数是对 preset 的微调,针对特定场景优化编码行为。常见的 tune 有:
- film:针对电影内容,保留更多细节
- animation:针对动画,优化平坦区域和线条
- grain:保留胶片颗粒感
- psnr:以 PSNR 最大化为目标
- ssim:以 SSIM 最大化为目标
- fastdecode:优化解码速度
- zerolatency:零延迟模式,用于直播
日志里 tune 的影响非常明显。比如使用 tune=psnr 时,编码器会关闭心理视觉优化(psy-rd),因为 psy 会降低 PSNR 数值。日志里会看到:
x264 [info]: Tune: psnr
x264 [info]: psy_rd: 0.00 0.00 # 心理视觉优化被关闭
而使用 tune=film 时,psy-rd 会被调高:
x264 [info]: Tune: film
x264 [info]: psy_rd: 1.00 0.15 # 心理视觉优化被增强
我曾经犯过一个错误:给动画内容用了 tune=film,结果编码出来的视频在平坦区域出现了明显的噪点。后来改成 tune=animation,问题就解决了。说白了,tune 就是告诉编码器「你在处理什么类型的内容」,选对了事半功倍。
4.5 CRF 与 ABR 模式下的日志差异
码控模式是编码器日志里最值得关注的部分。CRF 和 ABR 的日志差异非常大,直接反映了编码器的行为逻辑。
CRF 模式
CRF(Constant Rate Factor)模式下,编码器以恒定质量为目标,码率会随内容复杂度波动。日志里会看到:
x264 [info]: ratecontrol: crf=23.0
x264 [info]: encoded 1200 frames, avg QP=24.3, avg bitrate=4520 kb/s
关键信息:
- crf=23.0:目标质量值。值越小质量越高,文件越大。
- avg QP=24.3:实际平均量化参数。如果这个值跟 CRF 值差距很大,说明内容复杂度高,编码器在努力维持质量。
- avg bitrate=4520 kb/s:实际平均码率。这个值是编码完成后统计的,不是预设的。
CRF 模式下,日志里不会出现码率控制的警告,因为编码器不关心最终文件大小。但要注意:如果 CRF 值设得太低(比如 10),日志里可能会出现 ratecontrol: VBV underflow 之类的警告,说明码率超过了缓冲区限制。
ABR 模式
ABR(Average Bitrate)模式下,编码器以目标码率为准,质量会波动。日志里会看到:
x264 [info]: ratecontrol: abr, bitrate=5000 kb/s
x264 [info]: encoded 1200 frames, avg QP=25.1, avg bitrate=4980 kb/s
关键信息:
- abr, bitrate=5000 kb/s:目标码率。
- avg QP=25.1:实际平均 QP。如果这个值波动很大,说明编码器在努力控制码率。
- avg bitrate=4980 kb/s:实际码率,应该接近目标值。
ABR 模式下,日志里经常会出现码率控制的调试信息:
x264 [info]: ratecontrol: qscale=25.0, ipb ratio: 1.40 1.20 1.00
x264 [info]: ratecontrol: VBV maxrate=8000 kb/s, buffer=16000 kb/s
这些信息告诉你编码器是如何分配码率的。如果 ipb ratio 异常(比如 I 帧的 QP 比 P 帧还高),说明码率控制出了问题。
避坑指南:我曾经在 ABR 模式下遇到过一个问题——编码出来的视频前几秒质量极差,后面才恢复正常。后来看日志发现,编码器在开头几帧的 QP 高达 40+,因为 VBV 缓冲区还没填满。解决方案是加上 --vbv-init=0.9 参数,让缓冲区提前填充。
4.6 核心知识体系
下面这张图总结了编码器日志分析的核心逻辑:
4.7 实战建议
最后,给几个实战中的建议:
- 日志要保留完整:不要只截取最后几行。编码器初始化时的参数输出,往往比编码结束时的统计信息更有价值。
- 对比日志找差异:如果两个转码任务结果不同,先对比它们的编码器日志。preset、tune、码控模式是否一致?CPU 指令集是否相同?这些差异往往是问题的根源。
- 关注警告信息:编码器日志里的 warning 不是错误,但往往是性能瓶颈或质量问题的预兆。比如
VBV underflow意味着码率波动过大,lookahead depth too small意味着场景切换时质量会下降。 - 不要盲目抄参数:网上有很多「最佳编码参数」的帖子,但那些参数不一定适合你的场景。我建议你每次调参后都看一遍日志,确认参数是否生效。有时候你设了
--preset slow,但日志里显示的还是medium,说明参数没传进去。
ffmpeg -i input.mp4 -c:v libx264 -preset slow -tune film -crf 18 -f null - 这样的命令,可以只输出日志不生成文件,方便快速测试参数效果。