FFmpeg 性能优化是处理大规模音视频任务的关键,合理使用硬件加速和编码参数可以显著提升处理速度。
硬件加速
NVIDIA GPU 加速 (NVENC/NVDEC)
bash# 使用 NVDEC 解码 ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4 # 使用 NVENC 编码 ffmpeg -i input.mp4 -c:v h264_nvenc -preset fast -b:v 5M output.mp4 # 完整的 GPU 加速流程 ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 \ -c:v h264_nvenc -preset fast -b:v 5M output.mp4 # 指定 GPU 设备 ffmpeg -hwaccel_device 0 -i input.mp4 -c:v h264_nvenc output.mp4
Intel QSV 加速
bash# 使用 QSV 解码和编码 ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4 # QSV 编码参数 ffmpeg -i input.mp4 -c:v h264_qsv -preset fast -b:v 5M output.mp4
AMD VCE 加速
bash# 使用 VCE 编码 ffmpeg -i input.mp4 -c:v h264_amf -quality speed -b:v 5M output.mp4
VideoToolbox 加速 (macOS)
bash# 使用 VideoToolbox 编码 ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 5M output.mp4 # 使用 ProRes 编码 ffmpeg -i input.mp4 -c:v prores_videotoolbox -profile:v 3 output.mov
编码参数优化
Preset 选择
bash# 超快速度(质量较低) ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast output.mp4 # 快速速度(质量中等) ffmpeg -i input.mp4 -c:v libx264 -preset veryfast output.mp4 # 平衡速度和质量 ffmpeg -i input.mp4 -c:v libx264 -preset medium output.mp4 # 最佳质量(速度较慢) ffmpeg -i input.mp4 -c:v libx264 -preset slow output.mp4
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 28 output.mp4
线程优化
bash# 设置线程数 ffmpeg -i input.mp4 -threads 4 -c:v libx264 output.mp4 # 自动线程数 ffmpeg -i input.mp4 -threads 0 -c:v libx264 output.mp4
多线程处理
并行处理多个文件
bash# 使用 GNU parallel find input_dir -name "*.mp4" | parallel -j 4 ffmpeg -i {} -c:v libx264 output_dir/{/.}.mp4 # 使用 xargs find input_dir -name "*.mp4" | xargs -P 4 -I {} ffmpeg -i {} -c:v libx264 output_dir/{/.}.mp4
分段处理
bash# 分段转码后合并 ffmpeg -i input.mp4 -c copy -f segment -segment_time 60 segment_%03d.mp4 for f in segment_*.mp4; do ffmpeg -i "$f" -c:v libx264 transcoded_"$f"; done ffmpeg -f concat -safe 0 -i <(for f in transcoded_segment_*.mp4; do echo "file '$PWD/$f'"; done) -c copy output.mp4
内存优化
减少内存使用
bash# 使用流式处理 ffmpeg -i input.mp4 -c:v libx264 -f null - # 限制缓冲区大小 ffmpeg -i input.mp4 -c:v libx264 -bufsize 1M output.mp4
性能分析
查看编码信息
bash# 显示详细编码信息 ffmpeg -i input.mp4 -c:v libx264 -v verbose output.mp4 # 显示性能统计 ffmpeg -i input.mp4 -c:v libx264 -stats output.mp4
基准测试
bash# 测试解码性能 ffmpeg -benchmark -i input.mp4 -f null - # 测试编码性能 ffmpeg -benchmark -i input.mp4 -c:v libx264 -f null -
常见性能问题与解决方案
CPU 占用过高
bash# 降低编码复杂度 ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -tune fastdecode output.mp4 # 使用硬件加速 ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4
内存占用过高
bash# 减少线程数 ffmpeg -i input.mp4 -threads 2 -c:v libx264 output.mp4 # 使用流式处理 ffmpeg -i input.mp4 -c:v libx264 -f null -
处理速度慢
bash# 使用更快的 preset ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast output.mp4 # 启用硬件加速 ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4
最佳实践
- 根据硬件选择合适的加速方式:GPU 可用时优先使用硬件编码
- 平衡速度和质量:根据应用场景选择合适的 preset 和 CRF
- 合理设置线程数:通常设置为 CPU 核心数的 1-2 倍
- 使用流式处理:对于大文件,考虑分段处理
- 监控资源使用:使用系统监控工具观察 CPU、GPU 和内存使用情况
性能优化需要根据具体的硬件配置和应用场景进行调整,建议进行多次测试以找到最佳参数组合。