Featured image of post FFmpeg视频压缩常用命令

FFmpeg视频压缩常用命令

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 参数控制压缩速度。slowslower 虽然耗时更长,但能提供更高的压缩效率(即相同画质下文件更小)。


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!")

💡 脚本说明

  1. -c:a copy:我在脚本中使用了这个参数。它的作用是直接复制音频流而不重新编码,这样可以节省处理时间并保持音质。
  2. 路径安全:脚本中都加入了双引号 ",以确保即使你的文件名里有空格,程序也不会崩溃。
  3. 目录管理:所有脚本都会自动创建一个 compressed 文件夹,将处理好的视频存放在里面,避免污染原始文件夹。
使用 Hugo 构建
主题 StackJimmy 设计