视频压缩是 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
压缩策略建议
针对不同场景的压缩参数
社交媒体分享
bashffmpeg -i input.mp4 -c:v libx264 -crf 26 -preset medium -vf scale=1280:-1 -c:a aac -b:a 128k output.mp4
网络传输
bashffmpeg -i input.mp4 -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -preset fast -c:a aac -b:a 96k output.mp4
本地存储
bashffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 192k output.mp4
移动设备
bashffmpeg -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
最佳实践
- 选择合适的 CRF 值:18-28 之间,根据质量需求调整
- 使用合适的 preset:平衡编码时间和压缩效率
- 调整分辨率:根据目标设备选择合适的分辨率
- 优化音频:不要忽视音频压缩
- 测试不同参数:找到最适合自己需求的参数组合
- 使用两遍编码:在时间允许的情况下获得更好的压缩效果
视频压缩需要在质量、文件大小和编码时间之间找到平衡,建议根据具体应用场景选择合适的压缩策略。