3、视频转码基础:libx264与libx265编码器、CRF质量控制、码率控制(-b:v)、预设(preset)调优

转码,说白了就是把一种编码格式的视频,换成另一种。但这里头门道不少。你直接拿FFmpeg默认参数跑一遍,出来的文件要么大得离谱,要么画质惨不忍睹。我刚开始接触这行的时候,就吃过这个亏——一个1080p的视频,用默认参数转出来,体积翻了一倍,画面还糊了。后来才明白,核心就在编码器、质量控制和预设这三个点上。

这一章,咱们就把这三个东西彻底聊透。

3.1 编码器选型:libx264 vs libx265

FFmpeg里最常用的两个软件编码器,就是libx264和libx265。它们分别对应H.264和H.265/HEVC标准。

libx264:老牌劲旅,兼容性无敌。几乎所有的播放器、手机、电视盒子都支持。压缩效率不错,但跟H.265比,同等画质下体积要大一些。

libx265:后起之秀,压缩率更高。理论上,同等画质下,体积可以比H.264小30%-50%。但代价是编码速度慢得多,而且部分老旧设备可能不支持硬解。

我个人习惯是:需要广泛分发、兼容性优先的,用libx264;追求极致压缩比、存储成本敏感的,用libx265。比如我做课程视频,最终交付给学员的都是H.264,因为谁也不想看个视频还得先升级播放器。

核心结论:libx264保兼容,libx265保体积。没有绝对的好坏,只有场景的取舍。

下面这个表格,可以帮你快速决策:

对比维度 libx264 (H.264) libx265 (H.265/HEVC)
压缩效率 基准 高30%-50%
编码速度 快 慢(通常慢2-4倍)
兼容性 极好(几乎所有设备) 较好(新设备支持,老设备可能不行)
适用场景 网络分发、直播、存档 超高清(4K/8K)、存储受限、蓝光原盘压制

3.2 CRF质量控制:简单粗暴的“一刀流”

CRF,全称Constant Rate Factor,恒定质量因子。这是我最常用的质量控制方式。为什么?因为它简单。你只需要给一个值,FFmpeg就会自动帮你平衡画质和文件大小。

CRF的取值范围通常是0-51。数值越小,画质越好,文件越大。0代表无损,51代表最差。对于libx264,常用的范围是18-28。我个人觉得,23是一个很好的起点。对于libx265,因为压缩效率更高,同样的视觉质量,CRF值可以比libx264稍微高一点,比如24-28。

命令示例:

# 使用libx264,CRF 23
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output_h264.mp4

# 使用libx265,CRF 25
ffmpeg -i input.mp4 -c:v libx265 -crf 25 output_h265.mp4

你可能会问,CRF这么好用,为什么还要学别的?嗯,这里要注意:CRF无法控制最终输出的码率。也就是说,你没法精确预测输出文件有多大。如果你需要把视频压到某个固定大小(比如1GB),CRF就不好使了。这时候,就得用码率控制。

我的经验:做个人项目或内部存档,我无脑用CRF。省心,效果好。但如果是给客户交付,对方要求“视频不能超过500MB”,那我就会用下一节的方法。

3.3 码率控制(-b:v):精确到每一比特

码率控制,就是直接告诉编码器:“你每秒最多用多少比特来编码”。FFmpeg里用 -b:v 参数指定。

码率控制又分两种:

  • CBR (恒定码率):全程码率基本不变。适合直播、视频会议等对带宽要求稳定的场景。命令:-b:v 2M -minrate 2M -maxrate 2M -bufsize 4M
  • VBR (可变码率):根据画面复杂程度动态调整码率。简单画面用低码率,复杂画面用高码率。效率更高,同等码率下画质更好。这是大多数离线转码的首选。

VBR又分一次编码(1-pass)和两次编码(2-pass)。

1-pass VBR:速度快,但码率分配不够精准。适合对码率精度要求不高的场景。

2-pass VBR:先跑第一遍分析视频,再跑第二遍正式编码。码率分配极其精准,画质最优。但耗时翻倍。我一般在做最终交付版时才会用2-pass。

命令示例(2-pass VBR,目标码率2Mbps):

# 第一遍:分析,不输出视频
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -f mp4 /dev/null

# 第二遍:正式编码
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 output.mp4

避坑指南:我曾经在2-pass时忘了加 -pass 2,结果跑了两遍第一遍,浪费了几个小时。另外,Windows系统下,第一遍的输出文件是 NUL,不是 /dev/null。

3.4 预设(preset)调优:速度与压缩比的博弈

预设,是编码器提供的一组预定义参数集合。它决定了编码器在编码速度和压缩效率之间如何取舍。

libx264和libx265都支持以下预设(从快到慢):

  • ultrafast:极快,但文件巨大,画质一般。适合实时推流或测试。
  • superfast:非常快。
  • veryfast:很快。我经常用这个做临时预览。
  • faster:较快。
  • fast:快。
  • medium:默认值。平衡点。
  • slow:慢。压缩率开始有明显提升。
  • slower:更慢。
  • veryslow:非常慢。压缩率接近极致。
  • placebo:安慰剂。比veryslow还慢,但压缩率提升微乎其微,基本没有实用价值。

我个人习惯是:日常用 medium 或 slow。如果时间充裕,想压到最小,我会用 slower。至于 placebo,我试过一次,一个10分钟的视频压了一整夜,文件只比 veryslow 小了不到1%。从此再也没碰过。

命令示例:

# 使用slow预设,CRF 23
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 23 output.mp4

# 使用veryslow预设,2-pass,码率1M
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -b:v 1M -pass 2 output.mp4

调优建议:预设和CRF/码率是正交的。你可以用 slow 预设配合 -crf 23,也可以用 fast 预设配合 -b:v 2M。它们互不干扰。

3.5 知识体系总览

为了让你更直观地理解这几个概念的关系,我画了一张图:

视频转码核心参数关系图 视频转码核心参数关系图 转码任务 编码器选择 质量控制 预设调优 libx264 libx265 CRF 码率控制(-b:v) fast slow 核心原则 1. 编码器决定基础压缩效率 2. CRF控制质量,码率控制大小,两者选其一 3. 预设调节速度与压缩比的平衡,与CRF/码率正交

这张图把咱们今天聊的三个核心概念串起来了。你从“转码任务”出发,先选编码器,再决定用CRF还是码率控制,最后调预设。每一步都有明确的取舍。

好了,这一章的内容就到这儿。记住,没有最好的参数,只有最适合你场景的参数。多试,多对比,你自然就能找到感觉。