6月1日 23:24

FFmpeg 视频压缩怎么选参数?CRF、preset 和 tune 实战指南

FFmpeg 压缩视频的核心就三个参数:-crf 控制质量,-preset 控制编码速度和压缩率的平衡,-tune 针对特定内容类型优化。理解这三个参数,就能应对 90% 的压缩场景。

CRF:画质旋钮

CRF(Constant Rate Factor)是 H.264/H.265 的质量控制参数,范围 0-51。数字越小质量越高文件越大,数字越大质量越低文件越小。

关键参考值:

  • 18:视觉无损,和原片几乎看不出差别,文件很大
  • 23:默认值,质量和体积的平衡点,大多数场景够用
  • 28:明显有损但能看,适合手机端播放
  • 30+:质量较差,只在极端节省空间时使用
bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

CRF 是感知质量恒定——运动多的场景自动多分配码率,静态场景少分配。所以同一个 CRF 值,不同视频的文件大小可能差很多。如果需要精确控制文件大小,得用两遍编码(two-pass)或指定码率。

Preset:时间换空间

Preset 控制编码器用多少计算时间来寻找更优的压缩方案。越慢的 preset 压缩率越高(同画质文件更小),但编码时间越长。

Preset编码速度同 CRF 文件大小适用场景
ultrafast最快最大(约 2x)实时流媒体
veryfast很快较大直播推流
fast中等日常快转
medium中等(默认)基准一般用途
slow慢(约 3x 时间)较小(约 -15%)离线转码
veryslow很慢(约 6x)更小(约 -25%)归档存储

实际建议:离线处理用 slow,实时场景用 veryfast,不确定就用 medium。ultraslow 不存在,veryslow 已经是极限了。从 medium 切到 slow,编码时间翻 3 倍但文件只小 15%——值不值看你的需求。

bash
# 离线高质量压缩 ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset slow output.mp4 # 快速压缩(直播/即时预览) ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset veryfast output.mp4

Tune:针对性优化

Tune 让编码器针对特定内容类型调整策略:

  • film:电影/真人视频,去胶片颗粒感,优化暗部细节
  • animation:动画片,优化大面积色块和平滑区域
  • stillimage:PPT 录屏/幻灯片,优化静态画面
  • fastdecode:牺牲一点压缩率换取更快解码速度(低端设备播放)
  • zerolatency:零延迟,实时流媒体和直播专用

大部分情况不加 tune 就行。加错了反而比不加差——对真人视频用 animation,细节会糊掉。

bash
# 压缩电影 ffmpeg -i movie.mkv -c:v libx264 -crf 20 -preset slow -tune film output.mp4 # 压缩动画 ffmpeg -i anime.mkv -c:v libx264 -crf 20 -preset slow -tune animation output.mp4 # 压缩录屏教程 ffmpeg -i screen.mp4 -c:v libx264 -crf 23 -preset medium -tune stillimage output.mp4

H.265 压缩:省空间但要考虑兼容性

H.265(HEVC)比 H.264 同画质文件小 30-50%,但编码慢 3-5 倍,且老设备可能不支持播放。如果目标平台是手机/智能电视/浏览器,H.264 兼容性最好。如果目标是存档或只在 PC 上播放,H.265 更划算。

bash
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset slow output.mp4

注意 H.265 的 CRF 值不能和 H.264 直接对比——H.265 的 CRF 28 大致对应 H.264 的 CRF 23,因为 H.265 的范围和感知曲线不同。

两个常见坑

1. 忘了 -movflags +faststart:MP4 文件的元数据(moov atom)默认放在文件末尾,浏览器必须下载完整个文件才能开始播放。加 -movflags +faststart 把元数据移到开头,允许边下载边播放。网络视频必加。

2. 音频不要忘:压缩视频时音频默认也会被重编码。如果只是压缩视频不想动音频,加 -c:a copy 直接拷贝音频流。要压缩音频就用 -c:a aac -b:a 128k,128kbps 对大多数内容够用。

标签:FFmpeg