FFmpeg 转码详解:封装格式、编码器、码率控制

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 是默认值,大多数场景够用。

我的经验:

  • 批量处理、赶时间:fastveryfast
  • 日常转码:medium(默认就行)
  • 珍藏视频、追求最小体积:slowslower(慢但体积能小 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

mediumfastveryfast,速度提升明显,体积增加不多。

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 复杂滤镜链的用法------给视频加水印、加字幕、画中画,一篇搞定。

我是黒漂技术佬。

相关推荐
2501_930296994 小时前
模型驱动创作全链路梳理:2026上半年图像与视频生成AI模型全景盘点
人工智能·音视频
潜创微科技4 小时前
# 国产无线投屏接收端主控芯片 QCW5004:原生集成 HDMI TX,1080P@60fps 硬解
音视频
qq_291579256 小时前
AI电商主图视频在线生成:技术解析、工具横评与实战指南
人工智能·音视频
中微极客7 小时前
Gemini Omni Flash:对话式AI视频编辑新范式
人工智能·音视频·新人首发
坐望云起7 小时前
FFmpeg.wasm 纯浏览器端视频压缩与格式转换实战:零服务器、零上传、100% 隐私
服务器·ffmpeg·wasm
阿拉斯攀登7 小时前
数据通道:RTCDataChannel 可靠与不可靠传输
音视频·webrtc·实时音视频·媒体·视频编解码
EasyDSS9 小时前
视频直播点播/音视频点播/云点播/云直播EasyDSS智慧校园:一屏直播,全场景重构“教、学、练、测、评”
重构·音视频
VidDown9 小时前
在线视频下载器技术解析:原理、工具与合规实践
网络·音视频·实时音视频·视频编解码·视频下载
REDcker10 小时前
腾讯TRRO SDK深度剖析
音视频·webrtc·实时音视频·直播·rtc·腾讯