FFmpeg 视频压缩指令参考
FFmpeg 被誉为多媒体处理领域的“瑞士军刀”。在处理视频文件时,它能通过精准的参数控制,在保持高清画质的同时,轻松将文件体积缩小 50% 以上。
1. CRF 质量控制模式
CRF (Constant Rate Factor) 是最推荐的压缩方式。它不是简单地限制码率,而是通过预设的质量等级来动态调整。
- 数值范围:0–51(0 为无损,51 为最差)。
- 建议区间:18–23 是画质与体积的最佳平衡点。
1
2
|
# 使用 CRF 20 进行高质量压缩
ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset slow output.mp4
|
💡 小技巧: -preset 参数控制压缩速度。slow 或 slower 虽然耗时更长,但能提供更高的压缩效率(即相同画质下文件更小)。
2. 调整分辨率
将 4K 或 1080p 视频缩减为 720p,是减小文件体积最简单粗暴且有效的方法。
1
2
|
# 强制缩放到 720p,-1 表示自动计算高度以保持宽高比
ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -crf 23 output.mp4
|
3. 码率控制 (Bitrate)
如果你需要将视频上传到有严格码率限制的平台(如某些社交媒体),可以直接指定目标码率。
1
2
|
# 设置视频码率为 1Mbps,音频为 128kbps
ffmpeg -i input.mp4 -b:v 1000k -b:a 128k -c:v libx264 output.mp4
|
4. 使用 H.265 (HEVC)
H.265 是 H.264 的继任者。在同等清晰度下,它的文件体积通常比 H.264 小 30%-50%。
1
2
|
# 使用 H.265 编码进行极限压缩
ffmpeg -i input.mp4 -c:v libx265 -crf 23 -preset slow output.mp4
|
注意:虽然 H.265 压缩率极高,但在一些老旧设备或浏览器上的兼容性可能不如 H.264。
5. 综合优化
如果你想一次性搞定分辨率、帧率、视频编码和音频采样率,可以使用如下组合命令:
1
2
3
4
5
6
|
ffmpeg -i input.mp4 \
-vf scale=1280:720 \
-r 24 \
-c:v libx264 -crf 24 \
-b:v 800k -b:a 96k \
output.mp4
|
参数速查表
| 需求场景 |
推荐参数 |
优点 |
| 通用高清 |
-crf 20 -preset slow |
画质极佳,适合收藏 |
| 快速分享 |
-vf scale=720:-1 -crf 23 |
体积小,上传快 |
| 设备限制 |
-b:v 1000k |
严格控制文件最终大小 |
| 极限存储 |
-c:v libx265 -crf 24 |
存储空间占用最低 |
批量执行脚本
批量处理是 FFmpeg 真正的“杀手锏”。通过脚本,你可以一键压缩整个文件夹的视频,而不需要手动输入几十遍命令。
1. Windows 环境 (PowerShell)
在存放视频的文件夹里右键点击“在终端中打开”,然后粘贴并运行:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 创建输出文件夹防止覆盖原文件
if (!(Test-Path "compressed")) { New-Item -ItemType Directory -Path "compressed" }
# 循环处理所有 .mp4 文件
Get-ChildItem *.mp4 | ForEach-Object {
$output = "compressed\$($_.Name)"
Write-Host "正在处理: $($_.Name)" -ForegroundColor Cyan
# 这里使用了常见的 CRF 23 压缩配置
ffmpeg -i $_.FullName -c:v libx264 -crf 23 -preset medium -c:a copy $output
}
Write-Host "所有视频处理完成!" -ForegroundColor Green
|
2. macOS / Linux 环境 (Bash)
创建一个 .sh 脚本文件,或者直接在终端运行以下命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
# 创建输出目录
mkdir -p compressed
# 循环处理当前目录下所有的 mp4 文件
for f in *.mp4; do
echo "正在压缩: $f"
# -n 表示如果目标文件已存在则跳过,防止意外覆盖
ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy "compressed/${f%.mp4}_compressed.mp4"
done
echo "任务完成!"
|
3. 跨平台通用方案 (Python)
如果你希望脚本更具可读性或需要更复杂的逻辑(比如过滤掉小于 10MB 的文件),Python 是最佳选择:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import os
import subprocess
# 配置区域
input_dir = "./"
output_dir = "./compressed"
ffmpeg_params = "-c:v libx264 -crf 23 -preset medium -c:a copy"
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for filename in os.listdir(input_dir):
if filename.endswith(".mp4"):
input_path = os.path.join(input_dir, filename)
output_path = os.path.join(output_dir, filename)
print(f"Processing: {filename}")
command = f'ffmpeg -i "{input_path}" {ffmpeg_params} "{output_path}"'
subprocess.run(command, shell=True)
print("Batch processing complete!")
|
💡 脚本说明
-c:a copy:我在脚本中使用了这个参数。它的作用是直接复制音频流而不重新编码,这样可以节省处理时间并保持音质。
- 路径安全:脚本中都加入了双引号
",以确保即使你的文件名里有空格,程序也不会崩溃。
- 目录管理:所有脚本都会自动创建一个
compressed 文件夹,将处理好的视频存放在里面,避免污染原始文件夹。