FFmpeg 压缩视频文件
文章目录
- FFmpeg 压缩视频文件
- 基本压缩命令(保持 MP4 格式)
- 转换为其他格式示例:
- 关键参数说明:
- 额外优化选项:
- 在FFmpeg中使用多线程加速
- 1. 帧级多线程 (frame-level multithreading)
- 2. 切片级多线程 (slice-level multithreading)
- 3. 编码器特定多线程选项
- H.264/H.265 (libx264/libx265)
- VP9
- 4. 硬件加速
- 5. 并行处理多个文件
- 最佳实践建议
FFmpeg 压缩视频文件
使用 FFmpeg 压缩视频文件(包括 MPEG-4/MP4 格式)并输出为其他格式的基本命令如下:
基本压缩命令(保持 MP4 格式)
ffmpeg -i input.mp4 -vcodec libx264 -crf 23 -preset medium -acodec aac -b:a 128k output.mp4
转换为其他格式示例:
- 输出为 MKV 格式:
ffmpeg -i input.mp4 -vcodec libx265 -crf 28 -preset fast -acodec libvorbis output.mkv
- 输出为 WebM (VP9) 格式:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm
- 输出为 MOV 格式:
ffmpeg -i input.mp4 -vcodec mpeg4 -q:v 5 -acodec aac output.mov
关键参数说明:
-crf
:质量系数(18-28 是常用范围,值越大压缩率越高)-preset
:编码速度/效率平衡(ultrafast/superfast/veryfast/faster/fast/medium/slow/slower/veryslow)- 视频编码器:
libx264
:H.264/AVC(兼容性好)libx265
:H.265/HEVC(压缩率高)libvpx-vp9
:WebM 专用
- 音频编码器:
aac
:MP4 常用libopus
:WebM 专用libvorbis
:MKV 常用
额外优化选项:
- 缩放视频:
-vf "scale=1280:-1"
(设置宽度为1280,高度自动计算) - 降低帧率:
-r 24
(改为24fps) - 裁剪视频:
-ss 00:01:30 -t 10
(从1分30秒开始,截取10秒)
注意:实际使用时请先确保已安装 FFmpeg,且支持相关编解码器(可通过 ffmpeg -codecs
查看)。
在FFmpeg中使用多线程加速
FFmpeg提供了多种方式利用多线程来加速视频处理,主要包括以下几种方法:
1. 帧级多线程 (frame-level multithreading)
使用 -threads
参数可以开启帧级多线程处理:
ffmpeg -threads 4 -i input.mp4 output.mp4
或者分别控制不同组件的线程数:
ffmpeg -threads 4 -i input.mp4 -threads 8 output.mp4
2. 切片级多线程 (slice-level multithreading)
某些编码器支持切片编码,可以并行处理:
ffmpeg -i input.mp4 -c:v libx264 -slices 4 output.mp4
3. 编码器特定多线程选项
不同编码器有自己特定的多线程选项:
H.264/H.265 (libx264/libx265)
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 -x264-params threads=8 output.mp4
# 或者
ffmpeg -i input.mp4 -c:v libx265 -x265-params pools=8 output.mp4
VP9
ffmpeg -i input.mp4 -c:v libvpx-vp9 -row-mt 1 -threads 8 output.webm
4. 硬件加速
虽然不是严格的多线程,但硬件加速可以显著提高速度:
# NVIDIA硬件加速
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4
5. 并行处理多个文件
使用GNU parallel等工具并行处理多个文件:
parallel ffmpeg -i {} -c:v libx264 {.}.mp4 ::: *.mov
最佳实践建议
- 线程数通常设置为CPU核心数或略多
- 不同阶段(I/O、解码、编码)可以设置不同线程数
- 使用
-threads 0
让FFmpeg自动选择最佳线程数 - 监控CPU使用率调整线程数以达到最佳效果
注意:过多的线程可能会导致性能下降,因为线程管理开销会增加。