3. 基础转码命令:libx264与libx265编码器、CRF质量控制、码率控制模式
转码这件事,说白了就是让视频换个「活法」。你手里有个原始素材,可能是相机拍的、录屏软件抓的,或者从网上下来的。你想把它压小一点、换个格式、或者适配某个播放设备。这时候,FFmpeg 就是你手里的瑞士军刀。
这一章我们聚焦两个最常用的编码器——libx264 和 libx265,以及它们背后的质量控制逻辑。搞懂了这些,你才算真正入了转码的门。
3.1 两个核心编码器:libx264 与 libx265
libx264 和 libx265 分别是 H.264 和 H.265/HEVC 标准的开源实现。H.264 是过去十几年最主流的视频编码格式,兼容性极好,几乎所有设备都能播。H.265 是它的继任者,压缩效率更高——同样画质下,码率能省一半左右。
我个人的习惯是:需要广泛兼容、快速交付时,用 libx264;追求极致压缩、带宽有限时,用 libx265。但要注意,H.265 编码的计算量比 H.264 大得多,编码时间可能是后者的 3-5 倍。
3.1.1 基本用法对比
| 编码器 | 命令示例 | 输出格式 | 典型场景 |
|---|---|---|---|
| libx264 | -c:v libx264 |
.mp4 / .mkv | 网页播放、移动端、存档 |
| libx265 | -c:v libx265 |
.mp4 / .mkv | 4K/UHD、流媒体、存储优化 |
最简单的转码命令长这样:
ffmpeg -i input.mp4 -c:v libx264 output.mp4
这条命令会把 input.mp4 重新编码成 H.264。但注意——它用的是默认参数,质量不一定理想。我们通常需要手动控制质量。
3.2 CRF 质量控制:简单又直观
CRF(Constant Rate Factor)是 FFmpeg 里最常用的质量控制模式。它的核心思想是:你告诉我想要多高的质量,我来决定用多少码率。
CRF 的取值范围通常是 0-51,但实际常用的是 18-28。数值越小,质量越高,文件越大。我一般这样选:
- 18-20:视觉无损,适合存档或后期处理
- 21-23:高画质,适合最终交付
- 24-28:平衡画质与体积,适合网络分发
3.2.1 CRF 命令示例
# 使用 libx264,CRF 23
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
# 使用 libx265,CRF 25(H.265 的 CRF 值通常比 H.264 低 2-3 才能达到同等画质)
ffmpeg -i input.mp4 -c:v libx265 -crf 25 output.mp4
这里有个坑:CRF 不是码率上限。它不会限制最大码率,所以如果画面复杂,码率可能飙得很高。我曾经遇到过用 CRF 18 压一段烟花视频,结果码率跑到 80 Mbps 以上——文件比原片还大。嗯,这时候就需要码率控制模式出场了。
3.3 码率控制模式:三种主流方式
除了 CRF,FFmpeg 还提供了几种码率控制模式。它们各有适用场景,我整理了一张对比表:
| 模式 | 参数 | 特点 | 适用场景 |
|---|---|---|---|
| CBR(恒定码率) | -b:v 2M -minrate 2M -maxrate 2M -bufsize 4M |
码率严格恒定,质量波动大 | 直播、视频会议 |
| VBR(可变码率) | -b:v 2M |
码率浮动,质量相对稳定 | 通用转码、文件存储 |
| 2-Pass VBR | 先 -pass 1 再 -pass 2 |
码率分配更精准,质量最优 | 高质量交付、流媒体打包 |
3.3.1 CBR:直播场景的刚需
CBR 要求码率始终保持在目标值附近,不能忽高忽低。直播平台通常要求推流端使用 CBR,否则带宽波动会导致卡顿或断流。
# 推流到 RTMP 时常用的 CBR 设置
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -minrate 2M -maxrate 2M -bufsize 4M -f flv rtmp://example.com/live/stream
3.3.2 VBR:日常转码的默认选择
VBR 允许码率在一定范围内浮动,编码器可以根据画面复杂度动态调整。简单画面用低码率,复杂画面用高码率,整体质量更均衡。
# 目标码率 5 Mbps 的 VBR 转码
ffmpeg -i input.mp4 -c:v libx264 -b:v 5M output.mp4
但 VBR 有个问题:它只设定了目标码率,实际输出码率可能偏差很大。如果你需要精确控制文件大小,就得用 2-Pass。
3.3.3 2-Pass VBR:追求极致质量
2-Pass 分两步走:第一遍扫描整个视频,分析每帧的复杂度;第二遍根据分析结果分配码率。这样能把码率用在刀刃上——简单画面少给点,复杂画面多给点。
# 第一遍:分析
ffmpeg -i input.mp4 -c:v libx264 -b:v 5M -pass 1 -f mp4 /dev/null
# 第二遍:实际编码
ffmpeg -i input.mp4 -c:v libx264 -b:v 5M -pass 2 output.mp4
3.4 知识体系:编码器与码率控制的关系
下面这张图帮你理清本章的核心逻辑:
3.5 避坑指南:我踩过的几个坑
做转码这么多年,有些坑我反复踩过。分享几个给你,省得你走弯路。
- CRF 不是万能药:我曾经用 CRF 18 压一个 1080p 的纪录片,结果输出文件比原片还大。后来发现原片已经是高码率 H.264,再压一遍纯属浪费。记住:CRF 只保证质量,不保证体积。
- H.265 的 CRF 值要调低:很多人直接把 H.264 的 CRF 值套到 H.265 上,结果画质变差。我一般把 H.265 的 CRF 比 H.264 低 2-3 个单位,比如 H.264 用 23,H.265 就用 25。
- 2-Pass 不是万能的:如果你只是临时转个文件自己看,2-Pass 的收益不大。它更适合需要精确控制码率的场景,比如流媒体打包或客户交付。
- 别忘了加 -preset:编码器预设(preset)会影响编码速度和压缩率。我一般用
-preset medium作为平衡点,追求速度用fast,追求压缩用slow。
-preset slow 压 4K 视频,编码时间可能是视频时长的 10 倍以上。建议先用 -preset fast 测试,确认效果后再用慢预设做最终输出。
3.6 实战建议:怎么选?
说了这么多,最后给你一个简单的决策流程:
- 先选编码器:兼容性优先用 libx264,压缩率优先用 libx265。
- 再选质量控制方式:追求画质用 CRF,追求文件大小用码率控制。
- 最后调参数:根据素材类型调整 CRF 值或码率目标,别忘了加
-preset。