乐闻世界logo
搜索文章和话题

如何使用 FFmpeg 进行视频压缩和质量优化?CRF、preset 和 tune 参数如何使用?

2月18日 11:03

视频压缩是 FFmpeg 的核心功能之一,合理的压缩策略可以在保持视频质量的同时显著减小文件大小。

视频压缩基础

压缩原理

视频压缩主要通过以下方式实现:

  • 空间压缩:减少帧内的冗余信息
  • 时间压缩:利用帧间的相似性
  • 编码优化:使用高效的编码算法

常见编码格式对比

格式压缩率质量兼容性适用场景
H.264 (AVC)极好通用视频
H.265 (HEVC)良好4K/8K 视频
VP9良好Web 视频
AV1极高一般新一代视频
MPEG-4旧设备

H.264 编码参数优化

CRF (Constant Rate Factor)

CRF 是控制视频质量的核心参数,值越小质量越高,文件越大。

bash
# 高质量(文件较大) ffmpeg -i input.mp4 -c:v libx264 -crf 18 output.mp4 # 默认质量(推荐) ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4 # 中等质量 ffmpeg -i input.mp4 -c:v libx264 -crf 26 output.mp4 # 低质量(文件较小) ffmpeg -i input.mp4 -c:v libx264 -crf 30 output.mp4

Preset 选择

Preset 控制编码速度和压缩效率的平衡。

bash
# 超快速度(压缩率低) ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 23 output.mp4 # 非常快 ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -crf 23 output.mp4 # 较快 ffmpeg -i input.mp4 -c:v libx264 -preset faster -crf 23 output.mp4 # 快 ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 output.mp4 # 中等(推荐) ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4 # 慢(压缩率高) ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 23 output.mp4 # 较慢 ffmpeg -i input.mp4 -c:v libx264 -preset slower -crf 23 output.mp4 # 非常慢(压缩率最高) ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 23 output.mp4

Tune 参数

Tune 参数针对特定类型的内容进行优化。

bash
# 电影内容 ffmpeg -i input.mp4 -c:v libx264 -tune film output.mp4 # 动画内容 ffmpeg -i input.mp4 -c:v libx264 -tune animation output.mp4 # 快速动作内容 ffmpeg -i input.mp4 -c:v libx264 -tune fastdecode output.mp4 # 低延迟流媒体 ffmpeg -i input.mp4 -c:v libx264 -tune zerolatency output.mp4 # 静态图像内容 ffmpeg -i input.mp4 -c:v libx264 -tune stillimage output.mp4

比特率控制

CBR (Constant Bitrate)

恒定比特率,适合流媒体传输。

bash
# 2Mbps CBR ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 2M -minrate 2M -bufsize 4M output.mp4 # 5Mbps CBR ffmpeg -i input.mp4 -c:v libx264 -b:v 5M -maxrate 5M -minrate 5M -bufsize 10M output.mp4

VBR (Variable Bitrate)

可变比特率,适合本地存储。

bash
# 目标 2Mbps,最大 4Mbps ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -maxrate 4M -bufsize 8M output.mp4 # 使用 CRF 和最大比特率 ffmpeg -i input.mp4 -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M output.mp4

两遍编码

两遍编码可以获得更好的压缩效率。

bash
# 第一遍:分析 ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -f null /dev/null # 第二遍:编码 ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 output.mp4

分辨率优化

调整分辨率

bash
# 降低到 720p ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -crf 23 output.mp4 # 降低到 480p ffmpeg -i input.mp4 -vf scale=854:480 -c:v libx264 -crf 23 output.mp4 # 保持宽高比 ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -crf 23 output.mp4 # 按比例缩放 ffmpeg -i input.mp4 -vf scale=iw*0.5:ih*0.5 -c:v libx264 -crf 23 output.mp4

帧率调整

bash
# 降低到 24fps ffmpeg -i input.mp4 -r 24 -c:v libx264 -crf 23 output.mp4 # 降低到 15fps ffmpeg -i input.mp4 -r 15 -c:v libx264 -crf 23 output.mp4 # 保持原帧率 ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

H.265 (HEVC) 编码

H.265 提供比 H.264 更高的压缩效率。

bash
# H.265 编码 ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4 # H.265 两遍编码 ffmpeg -i input.mp4 -c:v libx265 -b:v 1M -pass 1 -f null /dev/null ffmpeg -i input.mp4 -c:v libx265 -b:v 1M -pass 2 output.mp4 # H.265 预设 ffmpeg -i input.mp4 -c:v libx265 -preset medium -crf 28 output.mp4

音频压缩

音频编码优化

bash
# AAC 编码(推荐) ffmpeg -i input.mp4 -c:a aac -b:a 128k output.mp4 # 高质量 AAC ffmpeg -i input.mp4 -c:a aac -b:a 192k output.mp4 # 低质量 AAC ffmpeg -i input.mp4 -c:a aac -b:a 96k output.mp4 # MP3 编码 ffmpeg -i input.mp4 -c:a libmp3lame -b:a 128k output.mp4 # Opus 编码(高质量) ffmpeg -i input.mp4 -c:a libopus -b:a 64k output.opus

压缩策略建议

针对不同场景的压缩参数

社交媒体分享

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 26 -preset medium -vf scale=1280:-1 -c:a aac -b:a 128k output.mp4

网络传输

bash
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -preset fast -c:a aac -b:a 96k output.mp4

本地存储

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 192k output.mp4

移动设备

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset medium -vf scale=854:480 -c:a aac -b:a 96k output.mp4

压缩效果评估

质量评估工具

bash
# 查看 PSNR(峰值信噪比) ffmpeg -i input.mp4 -i output.mp4 -lavfi psnr -f null - # 查看 SSIM(结构相似性) ffmpeg -i input.mp4 -i output.mp4 -lavfi ssim -f null - # 查看文件大小 ls -lh input.mp4 output.mp4 # 查看比特率 ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 output.mp4

最佳实践

  1. 选择合适的 CRF 值:18-28 之间,根据质量需求调整
  2. 使用合适的 preset:平衡编码时间和压缩效率
  3. 调整分辨率:根据目标设备选择合适的分辨率
  4. 优化音频:不要忽视音频压缩
  5. 测试不同参数:找到最适合自己需求的参数组合
  6. 使用两遍编码:在时间允许的情况下获得更好的压缩效果

视频压缩需要在质量、文件大小和编码时间之间找到平衡,建议根据具体应用场景选择合适的压缩策略。

标签:FFmpeg