FFmpeg 转码详解:封装格式、编码器、码率控制
上一篇讲了 20 个常用命令,这篇深入讲转码------FFmpeg 最核心的功能。什么是封装格式?什么是编码格式?CRF 和 CBR 怎么选?H.264 和 H.265 差在哪?看完这篇,你再也不会对着一堆参数瞎猜了。
大家好,我是黒漂技术佬。
很多人用 FFmpeg 转码就是改个后缀名,或者随便抄个命令------能用是能用,但体积大、质量差、速度慢,问题一堆。转码这件事,参数调好了,体积小一半画质还更好;调不好,又大又糊还慢。
这篇把转码的核心概念全部讲清楚:封装、编码、码率控制、preset 速度档位------搞懂这些,你调出来的视频参数就不会差。
一、先搞清楚两个概念:封装 vs 编码
新手最容易搞混的就是这俩。
封装格式(Container)
就是我们常说的 MP4、MKV、AVI、MOV 这些文件后缀。它相当于一个箱子,里面装着视频流、音频流、字幕流、元数据等。
MP4 文件 = 视频流(H.264) + 音频流(AAC) + 字幕 + 元数据
同一个视频,换封装格式(比如 MP4 转 MKV),视频和音频本身没变,只是换了个箱子装 。这时候用 -c copy 直接复制流就行,速度极快。
编码格式(Codec)
编码是视频/音频的压缩算法。常见的:
- 视频编码:H.264 (AVC)、H.265 (HEVC)、VP9、AV1
- 音频编码:AAC、MP3、Opus、FLAC
编码才是决定画质、体积、兼容性的核心。转码通常指的就是重新编码------把一种编码格式换成另一种,或者同一种编码调整码率/质量。
💡 一句话总结:封装是箱子,编码是箱子里东西的压缩方式。换箱子不用重新压,改压缩方式才需要重新编码。
二、常见视频编码器对比
H.264 / AVC
- 最通用,所有设备都支持
- FFmpeg 里用
libx264(软件编码) - 性价比高,兼容性最好
- 适合:通用场景、发微信、上传视频平台
H.265 / HEVC
- 压缩率比 H.264 高 30%-50%,同等画质体积更小
- FFmpeg 里用
libx265 - 缺点:编码慢(比 x264 慢 2-3 倍)、老设备不支持
- 适合:存储录像、4K 视频、带宽有限的场景
VP9 / AV1
- Google 主推的开源编码,免专利费
- AV1 压缩率比 H.265 还高,但编码巨慢
- 适合:Web 视频、YouTube
硬件编码器
- NVIDIA:
h264_nvenc/hevc_nvenc - Intel:
h264_qsv/hevc_qsv - RK3588:
h264_rkmpp/hevc_rkmpp - 速度快(实时编码无压力),但画质比软件编码略差
- 适合:直播推流、实时处理、摄像头录像
三、码率控制的四种模式
这是转码最核心的参数,直接决定画质和体积的平衡。
1. CBR(Constant BitRate,固定码率)
bash
ffmpeg -i input.mp4 -b:v 2M -maxrate 2M -bufsize 2M output.mp4
- 码率从头到尾基本固定
- 优点:码率可控,适合直播、流媒体服务器
- 缺点:简单场景浪费码率,复杂场景不够用,画质波动大
适用场景:直播推流、视频会议、带宽严格受限的环境
2. VBR(Variable BitRate,动态码率)
bash
ffmpeg -i input.mp4 -b:v 2M output.mp4
- 码率随画面复杂度变化,动的地方码率高,静的地方码率低
- 平均码率接近目标值,但峰值可能超
- 总体比 CBR 画质好
适用场景:普通视频压缩、本地存储
3. CRF(Constant Rate Factor,恒定质量)
bash
ffmpeg -i input.mp4 -vcodec libx264 -crf 23 output.mp4
- 最推荐的模式,保证画质恒定,码率自动调整
- 数值范围 0-51,数值越小画质越好、体积越大
- 常用范围:18-28
- 18:视觉无损,一般人看不出和原片区别
- 23:默认值,性价比最高
- 28:体积小很多,画质可接受
我平时压视频发微信、存资料,一律用 CRF 28 + medium preset,体积小一半,肉眼基本看不出差别。
适用场景:本地存储、视频分享、绝大多数非直播场景
4. ABR(Average BitRate,平均码率)
介于 CBR 和 VBR 之间,目标是达到指定的平均码率。实际用得不多。
四、Preset:速度和压缩率的权衡
-preset 参数控制编码速度和压缩效率的平衡。
bash
ffmpeg -i input.mp4 -vcodec libx264 -preset medium -crf 23 output.mp4
从快到慢一共这些档位:
ultrafast → superfast → veryfast → faster → fast → medium → slow → slower → veryslow
- 越快:编码速度快,但压缩率低(同质量体积大)
- 越慢:编码速度慢,但压缩率高(同质量体积小)
medium 是默认值,大多数场景够用。
我的经验:
- 批量处理、赶时间:
fast或veryfast - 日常转码:
medium(默认就行) - 珍藏视频、追求最小体积:
slow或slower(慢但体积能小 10-20%)
⚠️ 注意:preset 不影响画质,只影响压缩率和速度。同样 CRF 值下,veryslow 和 ultrafast 画质差不多,但体积可能差 30%。
五、Tune:针对内容优化
-tune 参数针对不同视频内容做优化:
bash
ffmpeg -i input.mp4 -vcodec libx264 -tune film -crf 23 output.mp4
| tune 值 | 适用场景 |
|---|---|
film |
电影、真人视频 |
animation |
动画、卡通(色块多、边缘清晰) |
grain |
胶片颗粒感强的视频 |
stillimage |
幻灯片、静态画面多 |
fastdecode |
降低解码复杂度,低配设备播放 |
zerolatency |
零延迟,适合直播、视频通话 |
做动画剪辑就加 -tune animation,做直播就加 -tune zerolatency,细节优化还是挺明显的。
六、Profile 和 Level:兼容性控制
H.264 有不同的 profile,决定了用哪些编码特性:
- Baseline:最基础,老设备、低功耗设备支持
- Main:中等,大部分设备支持
- High:最高压缩率,新设备都支持
bash
ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 4.1 output.mp4
一般用 High profile 就行。如果要兼容很老的设备(比如十年前的手机),降到 Main 或 Baseline。
七、音频编码参数
视频讲完了,音频也简单说下。
AAC 编码
最通用的音频编码,MP4 默认就是 AAC。
bash
ffmpeg -i input.mp4 -acodec aac -b:a 128k output.mp4
-b:a 128k:128kbps 立体声,接近 CD 音质- 一般视频 128k 够用,音乐视频可以到 192k 或 256k
MP3 编码
bash
ffmpeg -i input.mp3 -acodec libmp3lame -q:a 2 output.mp3
-q:a 是 VBR 质量模式,0 最好,9 最差:
- 0-2:接近无损
- 2-3:高音质,推荐
- 4-5:中等
- 6+:低码率
八、常用转码组合(直接抄作业)
1. 日常压缩 MP4(推荐)
bash
ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -preset medium -acodec aac -b:a 128k output.mp4
体积小一半,画质基本没损失,通用场景首选。
2. 高画质珍藏
bash
ffmpeg -i input.mp4 -vcodec libx264 -crf 18 -preset slow -acodec aac -b:a 192k output.mp4
视觉无损,适合重要视频存档。
3. H.265 超小体积
bash
ffmpeg -i input.mp4 -vcodec libx265 -crf 28 -preset medium output.mp4
比 H.264 再小 30-40%,但编码慢很多。适合硬盘空间紧张的场景。
4. 直播推流(CBR)
bash
ffmpeg -i input.mp4 -vcodec libx264 -b:v 2M -maxrate 2M -bufsize 4M -preset veryfast -tune zerolatency -acodec aac -b:a 128k -f flv rtmp://推流地址
5. 兼容老设备
bash
ffmpeg -i input.mp4 -vcodec libx264 -profile:v main -level 3.1 -crf 23 -acodec aac -b:a 128k output.mp4
九、转码速度怎么优化?
1. 用更快的 preset
medium 改 fast 或 veryfast,速度提升明显,体积增加不多。
2. 多线程
libx264/x265 默认就是多线程的,一般不用手动调。但可以指定:
bash
ffmpeg -i input.mp4 -vcodec libx264 -threads 8 -crf 23 output.mp4
3. 硬件加速
有显卡的话直接上硬件编码,速度是软件的 5-10 倍:
bash
# NVIDIA 显卡
ffmpeg -i input.mp4 -vcodec h264_nvenc -crf 23 output.mp4
# RK3588
ffmpeg -i input.mp4 -vcodec h264_rkmpp -b:v 2M output.mp4
硬件加速后面专门有一篇细讲。
十、新手常见的三个误区
误区 1:码率越高画质越好
不一定。超过一定阈值之后,码率再涨画质也不会提升,就是浪费。CRF 模式就是解决这个问题的------保证质量刚好,码率自动适配。
误区 2:分辨率越高越清晰
源文件只有 720p,你转成 1080p 也不会变清晰,只是体积变大了。转码只能往下转,不能往上提升画质。
误区 3:转一次损失一次画质
只要用的是有损编码(H.264、H.265 都是),每转一次就损失一次。所以尽量少转码 ,能用 -c copy 就用,非要转就一步到位,别反复转。
十一、本篇小结
- 封装是箱子,编码是压缩方式,别搞混
- CRF 模式优先,23 默认,28 性价比高
- preset 控制速度和压缩率,medium 够用,赶时间用 fast
- tune 针对内容优化,动画、直播各有对应
- 音频 AAC 128k 基本够用
- 能
-c copy就别重新编码,减少画质损失
下一篇讲视频滤镜详解:scale、crop、overlay、drawtext 这些常用滤镜深入讲,还有 filter_complex 复杂滤镜链的用法------给视频加水印、加字幕、画中画,一篇搞定。
我是黒漂技术佬。