你是否经常遇到这种情况?
- 想把 .mov 转成 .mp4,结果文件暴涨 2 倍?
- 用某宝压缩视频,画质一塌糊涂?
- 剪视频软件动辄 2G,加载还卡顿?
- 手里有几十个视频要统一转码,不想手动点鼠标?
只需一个命令就能搞定这些事的神奇工具,就是——FFmpeg
!
🛠️ 第 1 节:安装 FFmpeg
各平台安装方式
Windows 安装
- 到 FFmpeg 官网下载页 → 选择 Windows 版本
- 推荐下载 gyaan/ffmpeg-release 或 gyan.dev 提供的 zip 包(含完整二进制)
- 解压后,将 bin 目录加入系统环境变量 Path
- 打开 CMD,输入 ffmpeg -version 检查是否安装成功
🎯 不想设置环境变量?可以用绿色版,直接进入 bin 目录运行。
macOS 安装
推荐使用 Homebrew:
brew install ffmpeg
如需支持更多格式(如 x264、fdk-aac):
brew install ffmpeg --with-fdk-aac --with-libvpx --with-x265
Linux 安装
Ubuntu/Debian:
sudo apt update
sudo apt install ffmpeg
CentOS/Fedora:
sudo dnf install ffmpeg
安装完成后,用这个命令验证版本:
ffmpeg -version
📐 第 2 节:命令结构快速理解
我们来看一条最基础的 FFmpeg 命令:
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 output.mp4
命令逐项解析
-i input.mp4
:输入文件-vf scale=1280:720
:缩放-c:v libx264
:使用 H.264 编码器output.mp4
:输出文件名
📌 小技巧:最小命令也能用!
你甚至可以不写任何参数:
ffmpeg -i input.mp4 output.avi
它会自动根据扩展名判断格式,非常适合小白。
🔁 第 3 节:常用操作速查
🎞️ 格式转换(转码)
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1:flags=lanczos" -c:v gif output.gif
fps=10
:控制帧率,越低越小巧scale=480:-1
:宽 480,自动等比缩放
ffmpeg -i input.mov -c:v libx264 -crf 23 -preset fast output.mp4
-crf
数值越低画质越好(0~51,推荐 18~28)
✂️ 视频剪辑
ffmpeg -ss 00:00:30 -i input.mp4 -t 10 -c copy output.mp4
-ss
:开始时间-t
:持续时长-c copy
:不重新编码,超快!
ffmpeg -i input.mp4 -vf "crop=640:360" output.mp4
# 1. 创建文件列表.txt
echo "file '1.mp4'" > list.txt
echo "file '2.mp4'" >> list.txt
# 2. 合并
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
🔊 音视频操作
ffmpeg -i input.mp4 -q:a 0 -map a output.mp3
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -map 0:v:0 -map 1:a:0 -shortest output.mp4
ffmpeg -i input.mp4 -an output.mp4
📏 视频参数调整
ffmpeg -i input.mp4 -vf "scale=640:-1" output.mp4
-1
表示自动等比例缩放
ffmpeg -i input.mp4 -r 24 output.mp4
ffmpeg -i input.mp4 -b:v 1000k -b:a 128k output.mp4
-b:v
:视频比特率(越小越模糊)-b:a
:音频比特率
🖼 添加水印和字幕
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp4
overlay=10:10
表示左上角(x=10, y=10)
ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output.mp4
字幕文件必须是 .srt
格式,且 UTF-8 编码。
🧙 第 4 节:FFmpeg 滤镜魔法
-vf
(Video Filter)。是 FFmpeg 视频处理的灵魂核心。
📋 滤镜的基本格式
ffmpeg -i input.mp4 -vf "滤镜1=参数,滤镜2=参数" output.mp4
-vf
:指定视频滤镜(Video Filter),
分隔多个滤镜,按顺序处理(滤镜链)filter_complex
:用于更复杂的滤镜图(后面讲)
🎯 常见滤镜实战
我们一个个来,不多讲,直接用。
① scale
:视频缩放
ffmpeg -i input.mp4 -vf "scale=720:-1" output.mp4
- 把视频宽度缩放为 720,高度按比例自动调整
② crop
:裁剪画面
ffmpeg -i input.mp4 -vf "crop=640:360:100:50" output.mp4
crop=w:h:x:y
- 宽 640、高 360
- 从位置
(100, 50)
开始裁剪
③ fade
:淡入/淡出特效
淡入前 30 帧:
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1" output.mp4
淡出最后 1 秒:
ffmpeg -i input.mp4 -vf "fade=t=out:st=9:d=1" output.mp4
t=in/out
:类型st
:开始时间(秒)d
:持续时间(秒)
④ hue
:调色滤镜
调节色相、饱和度等:
ffmpeg -i input.mp4 -vf "hue=s=0" output.mp4
s=0
:去饱和度,效果类似黑白
更多玩法:
ffmpeg -i input.mp4 -vf "hue=h=60:s=2" output.mp4
⑤ drawtext
:添加文字(内置字幕)
ffmpeg -i input.mp4 -vf "drawtext=text='你好FFmpeg':fontcolor=white:fontsize=36:x=10:y=20" output.mp4
需安装字体支持库,如 Linux 下需 libfreetype
- 可用参数:
x/y
:坐标fontsize
:字体大小fontfile
:指定字体路径enable='between(t,2,5)'
:只显示第 2\~5 秒
🔗 滤镜链 vs 滤镜图
进阶概念:filterchain vs filtergraph
✅ 滤镜链(Filterchain)
-vf "scale=640:-1,eq=contrast=1.5"
- 滤镜按顺序执行,适合线性处理
✅ 滤镜图(Filtergraph)
-filter_complex "[0:v]scale=640:360,fade=t=in:st=0:d=2[out]" -map "[out]"
- 适合复杂分支、混流、多轨合成
🧪 第 5 节:编码器与压缩优化
🎞️ 视频编码器选项速览
编码器 | 优点 | 缺点 | 常见扩展名 |
---|---|---|---|
libx264 | 兼容性最好,速度快 | 文件偏大 | .mp4 |
libx265 | 体积更小,同等画质更强 | 编码更慢,不支持老设备 | .mp4 |
libvpx-vp9 | 开源,浏览器支持广 | 压制较慢 | .webm |
aom-av1 | 体积最小,画质极佳 | 压制极慢,硬件支持差 | .mkv |
libx264
或 libx265
,平衡兼容性与压缩效率。
🎛️ 常用压缩参数组合
我们用 H.264(libx264)为例,来压一个高清 MP4。
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
参数解析:
-c:v libx264
:选择 H.264 编码器-crf 23
:质量控制(越小越清晰,范围 051,推荐 1828)-preset medium
:编码速度(推荐值:ultrafast → slow)-c:a aac -b:a 128k
:音频编码器与码率
📊 CRF 不同数值的效果对比
CRF 值 | 画质 | 文件大小 |
---|---|---|
18 | 几乎无损 | 最大 |
23 | 兼顾清晰与体积 | 推荐默认 |
28 | 有轻微模糊 | 更小体积 |
⚡ preset
的效果对比
-preset ultrafast / superfast / veryfast / faster / fast / medium / slow / slower / veryslow
- 越慢越小,但越耗 CPU
- 推荐一般用
medium
,极限压缩才用slower
💡 多线程加速压缩(高级用法)
FFmpeg 会自动启用多线程,但你可以手动指定:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset fast -threads 4 output.mp4
-threads 4
:限制为 4 核压制(可省略)
🎯 libx265 的压缩优势
对同样一段 1080p 视频,用 H.264 和 H.265 压缩对比如下:
编码器 | 文件大小 | 肉眼清晰度 | 编码耗时 |
---|---|---|---|
libx264 | 120MB | 清晰 | 2 分钟 |
libx265 | 75MB | 清晰 | 3 分半 |
aac
,例如:ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset slow -c:a aac -b:a 128k output.mp4
🧨 NVIDIA + hevc_nvenc 兼容性坑
在使用 hevc_nvenc
编码器时,第一帧(尤其是 seek 后重新编码的第一帧)如果不是关键帧或初始化参数未设置完整,会出现以下情况:
- 首帧画面是绿屏或马赛克
ffmpeg
没有报错,但第一秒异常- 多发生在精准 seek (
-ss
+-accurate_seek
) + HEVC 编码器时
这是 NVIDIA 硬件编码器的一个“兼容性坑”。
📦 第 6 节:批处理与自动化
💻 批量转码当前目录下所有 .mp4
文件
macOS / Linux 示例(bash
)
for f in *.mp4; do
ffmpeg -i "$f" -c:v libx264 -crf 24 -preset medium -c:a aac -b:a 128k "out_$f"
done
Windows 示例(.bat
文件)
@echo off
for %%f in (*.mp4) do (
ffmpeg -i "%%f" -c:v libx264 -crf 24 -preset medium -c:a aac -b:a 128k "out_%%f"
)
保存为 batch_compress.bat
,放在视频目录下双击运行即可。
🧪 与 Python/Powershell 联动处理
Python 示例(调用 FFmpeg 命令)
import subprocess
from pathlib import Path
for f in Path(".").glob("*.mp4"):
output = f"compressed_{f.name}"
subprocess.run([
"ffmpeg", "-i", str(f),
"-c:v", "libx264", "-crf", "24", "-preset", "fast",
"-c:a", "aac", "-b:a", "128k", output
])
可以将 FFmpeg 与 Flask、Gradio 等结合做成本地 Web 转码器。
🗃️ 文件名优化/自动重命名
ffmpeg -i input.mp4 -c:v libx264 -crf 24 output_$(date +%Y%m%d_%H%M).mp4
- 通过 shell 插入时间戳,避免文件覆盖
🔚 结语:你的 FFmpeg 超能力已解锁!
你现在可以:
- 🚀 批量压缩 20G 视频资料包
- 🎬 制作带字幕的教学视频
- 🖼 把视频画面变成 GIF + 淡入淡出 + 水印
- 🎞 一行命令生成短视频片头片尾
🎁 推荐工具/文档/资源合集
Caleb https://reinness.com/posts/276 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自小陈博客 !