Windows 安装 FFmpeg:从环境配置到音视频常用命令
从视频里提取一段音频、把 MP4 转成 MP3,或者压缩视频、截取片段、添加字幕,都可以用 FFmpeg 完成。配置好环境后,通常只需要一条命令。
本文以 Windows 11、PowerShell 和 Gyan 提供的 FFmpeg Essentials 版为例,将程序安装到 D:\Program Files\ffmpeg,再整理日常用得到的音视频处理命令。
认识 FFmpeg 的三个工具
| 工具 | 主要用途 |
|---|---|
ffmpeg | 音视频转换、剪辑、压缩、合并和滤镜处理 |
ffprobe | 查看编码、分辨率、时长、音轨等文件信息 |
ffplay | 在命令行中启动音视频播放 |
FFmpeg 是命令行工具。安装后没有常规软件那样的操作主界面,需要在 PowerShell 或命令提示符中执行命令。
在 Windows 上独立安装
1. 选择下载来源
进入 FFmpeg 官方下载页 ,在 Windows 区域选择 Windows builds from gyan.dev。
FFmpeg 官网直接提供源代码,Windows 可执行程序由页面列出的第三方提供。这里使用的是官网列出的 Gyan 构建 。
在 Gyan 页面的 release builds 区域下载:
ffmpeg-release-essentials.zip
Essentials 包含常用编码库,例如 MP3 编码器 libmp3lame、H.264 编码器 libx264,适合本文的日常处理场景。Full 增加了更多外部库,Shared 提供动态链接库;第一次使用,选择 Essentials ZIP 即可。
查看构建与编码库说明
本文安装时的版本为 9.0.2-essentials_build-www.gyan.dev。下载链接会随版本更新,实际安装时以页面显示的版本为准。
2. 校验安装包
下载页在 ZIP 旁提供 .sha256 文件。下载完成后,可以用 PowerShell 计算本地压缩包的哈希:
Get-FileHash -LiteralPath "E:\Downloads\ffmpeg-release-essentials.zip" -Algorithm SHA256
将路径换成实际下载位置,对比结果与下载页提供的 SHA-256;两者一致后再解压。哈希字母的大小写不影响比较。
3. 解压到指定目录
右键 ZIP,选择“全部解压”,打开解压后的版本目录,把里面的内容复制到:
D:\Program Files\ffmpeg
最终结构应当是:
D:\Program Files\ffmpeg\
├─ bin\
│ ├─ ffmpeg.exe
│ ├─ ffprobe.exe
│ └─ ffplay.exe
├─ doc\
├─ presets\
├─ LICENSE
└─ README.txt
确认主程序位于 D:\Program Files\ffmpeg\bin\ffmpeg.exe,不要在 ffmpeg 与 bin 之间多套一层版本目录。如果目标目录已有旧版,先保留旧版,另建版本目录安装,避免直接覆盖。
4. 配置用户 PATH
- 在 Windows 搜索中输入“编辑账户的环境变量”,打开对应设置。
- 在用户变量中找到
Path,点击“编辑”。 - 点击“新建”,添加
D:\Program Files\ffmpeg\bin。 - 保留其他条目,点击“确定”保存。
- 关闭整个终端窗口,再从开始菜单重新打开 PowerShell。
PATH 中添加的是 bin 目录,不要填写 ffmpeg.exe,也不需要给 PATH 条目加双引号。
5. 验证安装
在新开的 PowerShell 中执行:
ffmpeg -version
ffprobe -version
where.exe ffmpeg
前两条应显示版本信息,第三条应找到:
D:\Program Files\ffmpeg\bin\ffmpeg.exe
检查常用编码器:
ffmpeg -hide_banner -encoders | Select-String "libmp3lame|libx264|aac"
如果还不能直接识别 ffmpeg,先用完整路径测试:
& "D:\Program Files\ffmpeg\bin\ffmpeg.exe" -version
PowerShell 执行引号包裹的程序路径时,需要前面的 &。如果完整路径能运行,通常应检查 PATH,或重启终端的宿主软件,例如编辑器。
运行命令前,先记住这些约定
下面的示例使用 PowerShell,输入文件名以 input.mp4 为例。可以先切换到素材目录,再复制命令:
Set-Location "E:\Videos"
E:\Videos 是示例目录,请替换为实际存在的素材文件夹。也可以直接把文件名换成带双引号的完整路径。
- 输出文件的父目录需要已经存在。
- 转换命令统一加
-n:输出文件存在时退出,不覆盖旧文件。重新处理时换一个输出文件名。 -c copy表示复制编码后的音视频流,速度快、不重新编码;能否使用取决于源编码与目标容器是否兼容。- 涉及画面缩放、滤镜、烧录字幕或精确剪辑时,需要重新编码。
-map 0:a:0表示选择第一个输入文件的第一条音轨;-map "0:a:0?"末尾的问号表示没有这条音轨也继续处理。
-n、-t、-ss、-map 等参数的完整定义见 FFmpeg 命令行文档
。
音频处理
01. 查看文件的编码、分辨率与音轨
直接查看完整信息:
ffprobe -hide_banner "input.mp4"
只查看时长:
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "input.mp4"
输出单位是秒。做无重编码提取、合并或替换音轨之前,先查看源文件信息会更容易判断参数是否合适。
02. 将 MP4 的完整音频导出为 MP3
ffmpeg -n -i "input.mp4" -map 0:a:0 -vn -c:a libmp3lame -q:a 2 "audio.mp3"
-q:a 2 使用较高质量的可变码率模式。MP3 属于有损编码,这个过程会重新编码音频。
如果希望固定为 192 kbps,可以改用:
ffmpeg -n -i "input.mp4" -map 0:a:0 -vn -c:a libmp3lame -b:a 192k "audio-192k.mp3"
03. 只导出前 60 秒音频
ffmpeg -n -i "input.mp4" -map 0:a:0 -t 60 -vn -c:a libmp3lame -q:a 2 "audio-first-60s.mp3"
-t 60 限制输出时长为 60 秒。输入不足 60 秒时,输出到输入结束。
04. 从第 10 秒开始,截取 20 秒音频
ffmpeg -n -ss 00:00:10 -i "input.mp4" -map 0:a:0 -t 20 -vn -c:a libmp3lame -q:a 2 "audio-10s-30s.mp3"
这里截取的是约第 10~30 秒的内容。-ss 表示起点,-t 表示持续时长,不是结束时间。重新编码时,FFmpeg 默认会解码并丢弃定位点之前多读到的内容。
05. 不重新编码,提取 AAC 音轨为 M4A
先用 ffprobe 确认音频编码为 AAC,再执行:
ffmpeg -n -i "input.mp4" -map 0:a:0 -vn -c:a copy "audio-original.m4a"
这条命令保留原 AAC 音频,不增加一次有损编码。它不会把 AAC 变成 MP3,也不能保证任意音频编码都能封装为 M4A。
06. 转为单声道、16 kHz 的 WAV
ffmpeg -n -i "input.mp4" -map 0:a:0 -vn -c:a pcm_s16le -ar 16000 -ac 1 "audio-16k-mono.wav"
输出为 16 位 PCM、16 kHz、单声道,适合要求这种输入格式的语音识别工具。具体格式仍应以目标工具的要求为准。
视频剪辑与压缩
07. 快速截取视频片段,不重新编码
ffmpeg -n -ss 00:00:10 -i "input.mp4" -t 20 -map 0:v:0 -map "0:a:0?" -c copy -avoid_negative_ts make_zero "clip-fast.mp4"
这种方式速度快,适合快速截取片段。由于视频解码依赖关键帧,实际起点和时长可能有偏差,起点不保证精确到第 10 秒;-avoid_negative_ts 用于调整负时间戳,不能解决关键帧精度问题。
如果要准确控制画面起点,使用下一种方式。
08. 重新编码,准确截取视频片段
ffmpeg -n -ss 00:00:10 -i "input.mp4" -t 20 -map 0:v:0 -map "0:a:0?" -c:v libx264 -preset medium -crf 20 -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "clip-accurate.mp4"
这条命令会重新编码,能够按解码后的时间位置剪辑。最终边界仍受视频帧间隔、音频采样和编码延迟影响,不应把“准确剪辑”理解为任意小数时间都存在对应的视频帧。
09. 转为常用的 H.264 + AAC MP4
下面以 MKV 为输入,其他受支持的输入格式也可以替换使用:
ffmpeg -n -i "input.mkv" -map 0:v:0 -map "0:a:0?" -c:v libx264 -preset medium -crf 23 -pix_fmt yuv420p -c:a aac -b:a 192k -movflags +faststart "compatible.mp4"
yuv420p 有助于兼容常见播放器;+faststart 将 MP4 的播放索引移到文件前部,有利于网页渐进式播放。它不会直接降低码率或缩小画面。
此示例仅保留第一路视频及第一条音轨(若存在),不会自动保留全部多语言音轨、字幕或附件。
10. 用 CRF 调整视频体积
ffmpeg -n -i "input.mp4" -map 0:v:0 -map "0:a:0?" -c:v libx264 -preset medium -crf 26 -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart "compressed.mp4"
对于 libx264,CRF 数值越大,通常体积越小、细节损失越明显;数值越小,通常画质越高、体积越大。可以从 23 或 26 开始,根据效果调整。
preset 控制编码速度与压缩效率。机器较慢时,可以改成 fast 或 veryfast。CRF 不保证固定输出大小,低码率源文件重新编码后也可能更大。
编码器参数可查阅 FFmpeg libx264 说明 。
11. 保持比例,将视频宽度调整为 1280
ffmpeg -n -i "input.mp4" -map 0:v:0 -map "0:a:0?" -vf "scale=1280:-2" -c:v libx264 -preset medium -crf 23 -pix_fmt yuv420p -c:a aac -b:a 128k "resized-1280.mp4"
-2 让 FFmpeg 按原比例计算高度,并使高度能被 2 整除,满足这里的编码格式要求。
此命令固定输出宽度为 1280,小于 1280 的源视频也会被放大;如不希望放大,可将滤镜替换为 scale='min(1280,iw)':-2。示例按常见偶数尺寸素材编写,奇数尺寸输入应先调整到偶数宽高。
截图与 GIF
12. 在第 5 秒截取一张图片
ffmpeg -n -ss 00:00:05 -i "input.mp4" -frames:v 1 -update 1 "snapshot.jpg"
-frames:v 1 只输出一帧。时间点需要处于视频有效时长内。
13. 每 10 秒抽取一帧
先新建一个空的输出目录,例如 frames-v1:
New-Item -ItemType Directory -Path ".\frames-v1" -ErrorAction Stop
ffmpeg -n -i "input.mp4" -vf "fps=1/10" ".\frames-v1\frame-%04d.jpg"
%04d 会生成 frame-0001.jpg、frame-0002.jpg 等文件。fps=1/10 表示每秒输出 0.1 帧;具体采样位置由输入时间戳及滤镜决定。再次运行时换一个新的目录名。
14. 将第 5 秒起的 5 秒片段转为 GIF
ffmpeg -n -ss 00:00:05 -t 5 -i "input.mp4" -filter_complex "[0:v]fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -an -loop 0 "preview.gif"
这里将 GIF 宽度设为 480、帧率设为 10,并生成专用调色板再应用,适合制作简短演示。-loop 0 表示循环播放;GIF 不包含声音。长视频生成 GIF 容易产生大文件,优先缩短片段、降低尺寸或帧率。
相关滤镜见 FFmpeg 滤镜文档
:fps、scale、palettegen 和 paletteuse。
音轨、合并与字幕
15. 去掉视频中的声音
ffmpeg -n -i "input.mp4" -map 0:v:0 -c:v copy -an "video-muted.mp4"
只保留第一路视频,直接复制视频编码流,不重新编码画面。
16. 用另一段音频替换视频声音
下面以输出前 20 秒为例,运行前根据实际需求调整 -t 20:
ffmpeg -n -i "input.mp4" -i "background.mp3" -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -shortest -t 20 "video-new-audio-20s.mp4"
-map 0:v:0 取第一个输入的视频,-map 1:a:0 取第二个输入的音频。这里替换原声音,不进行混音,也不会自动循环背景音频。
-shortest 用于按较短的一路结束输出,-t 20 则显式限制输出时长。本机验证中,仅使用 -shortest 出现过额外的视频尾部,所以示例同时指定时长;结果可再用 ffprobe 检查。若要保留完整视频,需要按实际视频时长调整 -t,并提供足够长的音频。
17. 按顺序合并参数一致的视频
在片段所在目录新建 files.txt,以 UTF-8 无 BOM 保存,内容如下:
file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'
然后执行:
ffmpeg -n -f concat -safe 0 -i "files.txt" -c copy "merged.mp4"
列表中的相对路径相对于 files.txt 所在目录解析。无重编码合并要求片段有匹配的流结构、编码参数和时间基等;分辨率、帧率、音轨配置不一致时,应先统一参数,不能仅凭扩展名相同就直接合并。详见 concat demuxer 文档
。
18. 为 MP4 添加可开关的字幕
ffmpeg -n -i "input.mp4" -i "subtitle.srt" -map 0:v:0 -map "0:a:0?" -map 1:0 -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=zho "video-soft-subtitles.mp4"
字幕会作为独立轨道写入 MP4;能否显示、开关以及呈现样式取决于播放器。原视频和音频编码需要受 MP4 容器支持,SRT 文件建议使用 UTF-8。
19. 将字幕永久烧录到画面
将 input.mp4 与 subtitle.srt 放到当前目录,执行:
ffmpeg -n -i "input.mp4" -map 0:v:0 -map "0:a:0?" -vf "subtitles=subtitle.srt" -c:v libx264 -preset medium -crf 20 -pix_fmt yuv420p -c:a aac -b:a 192k "video-hard-subtitles.mp4"
烧录后的字幕成为画面的一部分,播放器中无法关闭,需要重新编码视频。这里使用字幕的相对路径,避免 Windows 盘符冒号与滤镜转义规则混在一起;中文显示还需要系统中有相应字体。
字幕滤镜依赖 libass,详见 subtitles 滤镜说明
。
批量处理
20. 批量把当前目录的 MP4 转为 MP3
下面的 PowerShell 脚本只处理当前目录,不包含子目录。输出文件与源视频放在一起,名称增加 _audio 后缀:
Get-ChildItem -LiteralPath . -Filter "*.mp4" -File | ForEach-Object {
$outputPath = Join-Path $_.DirectoryName ($_.BaseName + "_audio.mp3")
& ffmpeg -n -nostdin -i $_.FullName -map 0:a:0 -vn -c:a libmp3lame -q:a 2 $outputPath
if ($LASTEXITCODE -ne 0) {
Write-Warning ("未完成转换,请查看错误信息:" + $_.FullName)
}
}
-nostdin 关闭交互输入,适合批处理;-n 保留已有输出。如果某个视频没有音轨或输出已存在,该文件会报错退出,脚本继续处理后续文件。
常见参数速查
| 参数 | 用途 |
|---|---|
-i | 指定输入文件,可以出现多次 |
-n | 不覆盖已有输出文件 |
-ss | 指定起点;放置位置与是否重新编码会影响寻址行为 |
-t | 指定处理持续时长 |
-vn / -an | 不输出视频 / 不输出音频 |
-map | 明确选择输入中的某条流 |
-c copy | 直接复制流,不重新编码 |
-c:v / -c:a | 指定视频 / 音频编码器 |
-q:a / -b:a | 设置音频质量参数 / 音频码率 |
-crf | 为支持它的视频编码器设置质量与体积取舍 |
-preset | 为支持它的编码器选择编码速度档位 |
-vf / -filter_complex | 应用视频滤镜 / 复杂滤镜图 |
-ar / -ac | 设置音频采样率 / 声道数 |
-movflags +faststart | 调整 MP4 索引位置,便于渐进式播放 |
参数通常作用于紧随其后的输入或输出。复制命令时,尽量保持参数顺序,仅修改文件名、起点、时长或质量参数。
常见问题
输入命令后提示找不到 FFmpeg
先用完整路径运行 ffmpeg.exe。若能运行,检查用户 PATH 是否加入了 D:\Program Files\ffmpeg\bin。已经打开的终端需要重新打开;编辑器内置终端还可能需要重启编辑器。
调用到了其他软件自带的 FFmpeg
运行 where.exe ffmpeg 查看搜索结果,再用下面的命令确认 PowerShell 当前解析的程序:
Get-Command ffmpeg -CommandType Application | Select-Object Source
可以先用完整路径调用指定版本,再按需调整 PATH 顺序,不必删除其他软件自带的副本。
文件路径包含空格或中文
给文件路径加双引号。直接执行带空格的程序路径时,PowerShell 需要 &:
& "D:\Program Files\ffmpeg\bin\ffmpeg.exe" -n -i "E:\Videos\示例 视频.mp4" -t 60 -vn -c:a libmp3lame -q:a 2 "E:\Videos\前60秒.mp3"
提示宽度或高度不能被 2 整除
H.264 配合 yuv420p 通常需要偶数宽高。可以添加以下滤镜,将奇数宽高向下调整到最近的偶数:
scale=trunc(iw/2)*2:trunc(ih/2)*2
如果命令已有 -vf,把需要的滤镜用逗号串起来;不要重复写多个 -vf 期待它们自动叠加。
明明截取了 60 秒,播放器却显示略有差异
音频编码延迟、帧边界和播放器的解析方式都可能影响显示时长。可以用 ffprobe 检查实际输出。本文使用生成的 61 秒 MP4 验证“前 60 秒转 MP3”,该次输出经检测为 60.000000 秒;其他素材和编码参数应以各自结果为准。