本文是一篇面向初学者的超详细 FFmpeg 教程,包括 FFmpeg 下载、安装、配置、基本语法 与 避坑指南。覆盖 Windows、macOS、Linux 平台的安装方式与 环境变量 设置,通过示例深入讲解 FFmpeg 常见参数(-i
输入、-c:v/libx264
视频编解码、-c:a/aac
音频编码、-b:v
/-crf
码率控制、-s
分辨率、-r
帧率、-vf
/-af
滤镜等),展示 格式转换、视频裁剪分割、合并拼接、截取缩略图、录制屏幕/摄像头 等核心操作。文章还详细讲解 版本兼容问题、编解码器授权、路径与权限、命令行拼写、输出质量与体积平衡、日志调试技巧 等常见坑与解决方案,帮助大家快速掌握 FFmpeg 视频转码、音频处理、流媒体推流与多媒体编辑的一劳永逸方法。
作者✍️ 猫头虎技术团队。
在多媒体开发和处理领域,FFmpeg 几乎是一个“神器”级别的工具。无论你是需要进行格式转换、剪辑分割、流媒体推流,还是需要对视频做简单的裁剪、合并、提取音频等操作,FFmpeg 都能一站式满足。但对于初学者而言,FFmpeg 由于命令行参数众多、文档繁多,常常会造成许多困惑和“踩坑”。本教程将从“零基础”出发,用最通俗的语言讲解 FFmpeg 的下载、安装、配置、基本语法、以及使用过程中最容易遇到的坑与对应的避坑思路。全文尽可能使用 > 引用语法来突出关键点与小贴士,方便阅读与分享。
FFmpeg 是一个开源的音视频处理工具套件,包含丰富的多媒体处理库和命令行工具。
ffmpeg
: 用于音视频转码、格式转换、剪辑、合并等操作。ffprobe
: 用于分析多媒体文件的编码信息、元数据。ffplay
: 简易媒体播放器,便于快速预览。FFmpeg 支持几乎所有主流音视频格式、容器、编解码器,而且更新频繁,社区活跃。它的最大特点之一就是“一劳永逸”:一旦学会基本命令,几乎所有常见的音视频需求都可以在命令行里完成,非常适合开发者、运维以及需要批处理大量文件的场景。
在开始安装之前,我们需要先从官方网站(或其他可信镜像源)下载适合自己操作系统的版本。
小贴士:
在国内访问国际站点,下载速度可能很慢。以下是几个常用的国内镜像:
https://mirrors.tuna.tsinghua.edu.cn/ffmpeg/
(仅包含源码)https://ffmpeg.zeranoe.com/builds/
(已停止更新,作为历史参考)。小贴士:
本节针对 Windows、macOS、Linux 三大平台做详细示例。请根据自身环境选择对应章节。
下载 ZIP 压缩包
ffmpeg-<version>-full_build.zip
。解压到指定目录
右键选择“解压到当前文件夹”或直接用 WinRAR、7-Zip 解压。
建议解压到 C:\ffmpeg\
(方便后续配置),解压后目录结构类似:
C:\ffmpeg\
├── bin\
│ ├── ffmpeg.exe
│ ├── ffprobe.exe
│ └── ffplay.exe
├── doc\
├── presets\
└── ...
配置环境变量(详见第 5 节)
C:\ffmpeg\bin
添加到系统 Path 环境变量中。验证安装是否成功
打开命令提示符(Win+R,输入 cmd
回车)。
输入:
ffmpeg -version
若输出 FFmpeg 版本信息(示例如下),即说明安装成功:
ffmpeg version 4.4.1-full_build ...
configuration: --enable-gpl --enable-nonfree ...
libavutil 56. 70.100 / 56. 70.100
...
常见问题:
'ffmpeg' 不是内部或外部命令,也不是可运行的程序
,请检查是否将 C:\ffmpeg\bin
正确添加到 Path,并且当前 cmd 已重新打开。C:\ffmpeg\bin\ffmpeg.exe
。macOS 上安装 FFmpeg 最简单的方法是使用 Homebrew:
安装 Homebrew(如已安装可跳过)
打开“终端”(Applications → Utilities → Terminal),执行:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
使用 Homebrew 安装 FFmpeg
终端执行:
brew update # 更新 Homebrew 本地索引
brew install ffmpeg
安装完成后,Homebrew 会自动将 FFmpeg 可执行文件放到 /usr/local/bin
或 /opt/homebrew/bin
下(具体取决于 Intel/Apple Silicon)。
验证安装
在终端执行:
ffmpeg -version
能看到类似如下信息即表示安装成功:
ffmpeg version 5.0.1 ...
configuration: --prefix=/usr/local/Cellar/ffmpeg/5.0.1 ...
libavutil 56. 70.100 / 56. 70.100
...
小贴士:
brew edit ffmpeg
,在配方里添加 --enable-xxx
,然后再 brew install ffmpeg
。brew doctor
,按照提示清理环境。Linux 发行版众多,这里列举几种常见的包管理器安装命令。若你需要最新版本或定制化编译,推荐自行编译,详见官网文档。
sudo apt update
sudo apt install -y ffmpeg
注意:
Ubuntu 官方源中的 FFmpeg 版本可能略旧,若需要最新,建议添加 PPA:
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt update
sudo apt install -y ffmpeg
安装完成后执行 ffmpeg -version
查看版本信息。
CentOS 默认源通常没有 FFmpeg,需先安装 EPEL 源和 RPM Fusion 源:
sudo yum install -y epel-release
sudo yum install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
sudo yum install -y ffmpeg ffmpeg-devel
sudo dnf install -y @development-tools
sudo dnf install -y ffmpeg ffmpeg-devel
sudo pacman -Syu
sudo pacman -S ffmpeg
小贴士:
yasm
、nasm
、pkg-config
),然后下载源码,执行 ./configure ... && make && sudo make install
。--enable-gpl --enable-nonfree --enable-libx264 --enable-libvpx
等,具体可参考官网编译文档。即使安装成功,若不配置环境变量,终端或命令行中依然无法直接调用
ffmpeg
。
ffmpeg
,无需每次都输入完整路径。moviepy
)中直接调用 ffmpeg
。小贴士:
bin
目录执行 .\ffmpeg.exe
。打开“控制面板” → “系统和安全” → “系统” → “高级系统设置”。
点击“环境变量”。
在“系统变量”下,找到 Path
,双击打开编辑窗口。
点击“新建”,输入 C:\ffmpeg\bin
(根据你实际解压路径填写)。
点击“确定”保存。重启所有打开的命令提示符窗口。
在 CMD 中执行:
ffmpeg -version
若成功显示版本信息即配置完成。
小贴士:
where ffmpeg
来查看系统中所有 ffmpeg.exe
的路径。$Env:Path
查看环境变量设置,但更改依然需在“环境变量”界面完成。在 macOS 或 Linux 上,如果通过包管理器安装,一般会自动把可执行文件放到 /usr/local/bin
、/usr/bin
、/opt/homebrew/bin
等目录,系统默认已在 PATH 中,因此无需手动配置。
如果你是 从源码编译 或 手动下载 并解压到自定义目录(如 ~/tools/ffmpeg
),则需将其添加到环境变量。以 Bash 为例,编辑 ~/.bashrc
或 ~/.zshrc
(使用 Zsh 时):
# 将以下内容追加到文件末尾
export FFMPEG_HOME="$HOME/tools/ffmpeg"
export PATH="$FFMPEG_HOME/bin:$PATH"
然后执行:
source ~/.bashrc
# 或者
source ~/.zshrc
验证:
ffmpeg -version
若输出信息正常,则配置成功。
小贴士:
~/.config/fish/config.fish
:set -Ux FFMPEG_HOME ~/tools/ffmpeg
set -Ux PATH $FFMPEG_HOME/bin $PATH
理解命令行结构与常见参数是用好 FFmpeg 的关键。本节从最基础的
命令 + 参数
结构入手,逐步剖析常见参数的含义与用法。
一个完整的 FFmpeg 命令行大致分为以下几个部分:
ffmpeg [全局选项] -i <输入文件/流> [针对输入的过滤与参数] [输出选项] <输出文件/流>
ffmpeg
:可执行程序,直接调用。[全局选项]
:影响整个 FFmpeg 进程的参数,如日志级别(-loglevel
)、线程数(-threads
)等。-i <输入>
:指定输入文件、URL 或设备。 如果需要多个输入,可多次使用 -i
。[针对输入的过滤与参数]
:可以对输入进行一些局部参数调整,比如输入裁剪、开始偏移、抓取帧率等。[输出选项]
:包括输出文件格式、编解码器、码率、分辨率、帧率等设置。<输出>
:输出到本地文件、管道、网络推流地址等。示例框架:
ffmpeg -loglevel error -i input.mp4 -c:v libx264 -b:v 800k -s 1280x720 output.mp4
下面从最常见的输入/输出、编解码器、质量控制、分辨率帧率等维度逐一说明。
-i
、输出路径)-i <文件路径或 URL>
:指定输入源。
-i ./video.mp4
-i https://example.com/video.flv
-i video="Integrated Camera"
。-f mp3
)或输出文件后缀自动推断。
小贴士:
-i
,但要留意输入顺序和对应的流映射。-f matroska -
将数据输出到标准输出,便于与其他进程联动。-c:v
、-c:a
)-c:v <视频编码器>
:指定视频编码器。常见选项:
libx264
:H.264 编码器,高效且兼容性好。libx265
:H.265 编码器,压缩效率高,但兼容性稍差。mpeg4
:旧版 MPEG-4 编码(.mp4
容器)。copy
:流复制(不重新编码)。-c:a <音频编码器>
:指定音频编码器。常见选项:
aac
:AAC 编码(内置或外部库)。libmp3lame
:MP3 编码。copy
:流复制。示例:
ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4
该命令将输入视频转为 H.264 视频流、AAC 音频流,输出 MP4 容器。
-b:v
、-crf
)-b:v <视频码率>
:设置输出视频的目标码率(比特率)。
-b:v 800k
表示 800kbps。-crf <常量质量因子>
:常量质量模式,仅适用于某些编码器(如 x264、x265)。
-crf
值范围通常是 0 ~ 51,值越小质量越高,文件越大;常见取值范围在 18 ~ 28。-crf 23
左右;H.265 使用 -crf 28
左右。示例(使用常量质量模式):
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy output.mp4
该命令使用 CRF 模式转码视频,保留原始音频。
-s
、-r
)-s <width>x<height>
:设置输出分辨率,如 -s 1280x720
或者标准符号 -s hd720
、-s pal
等。-r <fps>
:设置帧率(帧/秒),如 -r 30
、-r 24
等。示例:
ffmpeg -i input.mp4 -s 640x360 -r 25 -c:v libx264 -crf 25 output.mp4
该命令将视频分辨率改为 640×360,帧率改为 25fps,同时采用 CRF 编码。
-ss
、-t
、-vf
、-af
)-ss <时间偏移>
:跳转到指定时间位置再开始处理。可以放在输入前或输出参数前:
-ss 00:01:00 -i input.mp4 -c copy clip.mp4
(先跳到 1 分钟处再读取)-i input.mp4 -ss 00:01:00 -c copy clip.mp4
(读取整个文件后再跳到 1 分钟位置输出)-t <持续时长>
:指定持续时间,例如 -t 00:00:30
表示处理 30 秒。
-vf <视频滤镜链>
:一系列视频滤镜,例如缩放、裁剪、水印、水平翻转等。
-vf "scale=1280:720,transpose=1"
。-af <音频滤镜链>
:音频滤镜,例如扬声器环绕、音量调整、降噪等。
-af "volume=1.5,atempo=0.9"
。小贴士:
,
分隔,滤镜参数使用 =
。ffmpeg -filters
查看所有内置滤镜列表及参数说明。本节通过实际案例逐步演示常见操作,方便初学者上手。
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.avi
input.mp4
:源文件。-c:v libx264
:用 H.264 编码输出。-c:a aac
:用 AAC 编码输出。output.avi
:输出文件格式根据后缀自动推断为 AVI。注意:
ffmpeg -i input.mp4 -c copy output.avi
但仅在编解码器在两种容器均兼容时才有效。
ffmpeg -ss 00:00:30 -i input.mp4 -t 00:00:10 -c copy clip.mp4
-ss 00:00:30
:从第 30 秒开始。-t 00:00:10
:持续 10 秒。-c copy
:直接复制流,无需重新编码,速度快,但只能在关键帧处截断。ffmpeg -ss 00:00:30 -i input.mp4 -t 00:00:10 -c:v libx264 -c:a aac clip.mp4
-c:v libx264
下,能保证精确到帧级别地裁剪,但需要重新编码,耗时更长。创建一个文本文件 filelist.txt
,内容示例:
file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'
执行命令:
ffmpeg -f concat -safe 0 -i filelist.txt -c copy merged.mp4
-f concat
: 使用 concat 模式。-safe 0
: 允许使用绝对路径。-c copy
: 直接复制流,无重新编码。小贴士:
# 先统一编码格式、分辨率等
ffmpeg -i input1.mp4 -c:v libx264 -c:a aac temp1.mp4
ffmpeg -i input2.mkv -c:v libx264 -c:a aac temp2.mp4
# 生成 filelist.txt
echo "file 'temp1.mp4'" > filelist.txt
echo "file 'temp2.mp4'" >> filelist.txt
# 拼接
ffmpeg -f concat -safe 0 -i filelist.txt -c copy merged.mp4
ffmpeg -ss 00:00:05 -i input.mp4 -frames:v 1 -q:v 2 thumb.jpg
-ss 00:00:05
:跳转到第 5 秒。-frames:v 1
:只截取一帧。-q:v 2
:图像质量控制,范围 2~31,数值越小质量越高,2 就是较高质量。ffmpeg -i input.mp4 -vf fps=1/10 thumb_%03d.jpg
-vf fps=1/10
:每 10 秒截取一帧,生成序列图像,文件名形如 thumb_001.jpg
, thumb_002.jpg
。ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -crf 18 -pix_fmt yuv420p screen_record.mp4
-f gdigrab
:使用 Windows GDI 视频抓取。-framerate 30
:以 30fps 抓取。-i desktop
:录制整个桌面。-crf 18
:高质量录制。-pix_fmt yuv420p
:保证大多数播放器兼容性。ffmpeg -f avfoundation -framerate 30 -i "1:none" -c:v libx264 -crf 18 -pix_fmt yuv420p screen.mp4
-f avfoundation
:使用 AVFoundation 框架。-i "1:none"
:1
表示屏幕设备(可用 ffmpeg -f avfoundation -list_devices true -i ""
列出所有设备),none
表示不录制音频。ffmpeg -f x11grab -framerate 25 -video_size 1280x720 -i :0.0+0,0 -c:v libx264 -crf 23 -pix_fmt yuv420p screen.mp4
-f x11grab
:X11 屏幕抓取。-video_size 1280x720
:录制区域大小。-i :0.0+0,0
:屏幕显示编号 :0.0
,从左上角 (0,0)
开始。初学者在使用 FFmpeg 过程中,最常见的“踩坑”往往不是命令无效,而是:参数写错、格式不兼容、路径问题、版本不匹配等。下面针对各种场景进行剖析并给出解决思路。
坑点:
避坑思路:
查看当前版本支持情况:
ffmpeg -encoders | grep libx265
ffmpeg -decoders | grep h264
如果未找到对应条目,说明该版本不支持。
自行编译:在源码编译时添加需要的参数,例如:
./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-libx265 --enable-libfdk-aac
make -j$(nproc)
sudo make install
使用静态编译包:如 Windows 用户可直接下载“full”版预编译包;Linux 用户可使用第三方仓库(如 RPM Fusion、Homebrew on Linux)等。
小贴士:
避免同时安装多个版本,以防 PATH 冲突。
如果要并存多个版本,可使用别名管理:
alias ffmpeg_old="/usr/bin/ffmpeg"
alias ffmpeg_new="/usr/local/bin/ffmpeg"
坑点:
避坑思路:
libvpx
(VP8/VP9)、AV1
编码(如使用 libaom-av1
)。libopus
。小贴士:
AVFoundation
框架自带 H.264、AAC 编码支持,可直接通过 -c:v h264
、-c:a aac
。坑点:
避坑思路:
尽量避免空格或中文路径,若必须使用,请确保使用双引号括住路径:
ffmpeg -i "C:\我的 视频\example.mp4" "D:\输出 文件\out.mp4"
检查读写权限:在 Linux/macOS 上,使用 ls -l
查看权限,若无写权限可执行:
chmod +rw output.mp4
使用绝对路径:可避免相对路径上下文不明确导致的找不到文件。
小贴士:
Permission denied
,请首先检查父目录是否可写。C:\Program Files
),否则需要管理员权限。坑点:
-
)和长横(—
)容易弄混。*
、?
)可能被 Shell 本身解析。避坑思路:
仔细检查命令:确保所有短横 -
是 ASCII 45 号键(不要从网页复制后出现非 ASCII 字符)。
使用引号规范命令:
ffmpeg -i "input.mp4" -vf "scale=640:360,transpose=1" "output.mp4"
在出错时查看 FFmpeg 的日志级别:
ffmpeg -loglevel verbose -i input.mp4 ...
通过更高日志级别可以看到详细报错信息,定位问题。
小贴士:
ffmpeg -h
或 ffmpeg -help
查看命令概览。坑点:
避坑思路:
了解不同编码器下的质量与码率关系:
-crf 23
(默认)时质量已较好,若想更清晰可尝试 -crf 18
;如果希望更小体积可尝试 -crf 28
。-crf 28
(清晰) 到 -crf 32
(偏模糊)做调节。两遍编码(2-pass):对于要求码率更精确的场景可使用两遍编码:
# 第一遍
ffmpeg -i input.mp4 -c:v libx264 -b:v 1000k -pass 1 -an -f null /dev/null
# 第二遍
ffmpeg -i input.mp4 -c:v libx264 -b:v 1000k -pass 2 -c:a aac output.mp4
可获得更稳定的码率控制与质量平衡。
先做小片段测试:用短片段(如 30 秒)测试不同参数,确定最佳取舍后再批量处理。
小贴士:
-preset veryfast
或更快的预设,减少延迟。-preset slow
、-preset veryslow
)来获得更好压缩效率。坑点:
避坑思路:
调整日志级别:
-loglevel quiet
:安静模式,无任何输出。
-loglevel panic
:只打印 panic 级别的信息。
-loglevel error
:只打印错误信息。
-loglevel warning
:打印警告及以上级别信息(默认)。
-loglevel info
:打印常规信息。
-loglevel verbose
:打印更详细的调试信息。
-loglevel debug
:打印最详细的调试信息(包含内部调试帧信息)。
示例:
ffmpeg -loglevel verbose -i input.mp4 -c:v libx264 output.mp4
将日志输出到文件:
ffmpeg -loglevel debug -i input.mp4 -c:v libx264 output.mp4 2> ffmpeg_debug.log
然后使用文本编辑器打开 ffmpeg_debug.log
,查找具体报错原因。
使用 ffprobe
检查文件信息:
ffprobe -v error -show_streams -show_format input.mp4
可获得输入文件的编解码信息、分辨率、时长、码率等,有助于判断为何输出失败。
小贴士:
$OutputEncoding = [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
来保证中文不乱码。以下链接可供进一步学习与查询,均为官方或社区常用文档、教程及工具。
作者✍️ 猫头虎技术团队
本文从 FFmpeg 的下载、安装、环境配置,到基本语法、常见场景示例、以及常见坑与避坑思路,进行了超详细、逐步剖析,力求让初学者“零门槛”上手。在实际使用中,不同版本、不同平台、不同编解码器都会带来各类问题,最核心的理念是:“理解命令背后的原理”,而不是死搬硬套某个命令。只有理解了输入、输出、编解码、容器格式以及滤镜等核心概念,才能在遇到新需求时,灵活地组装命令并迅速定位问题。