从视频里提取一段音频、把 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,不要在 ffmpegbin 之间多套一层版本目录。如果目标目录已有旧版,先保留旧版,另建版本目录安装,避免直接覆盖。

4. 配置用户 PATH

  1. 在 Windows 搜索中输入“编辑账户的环境变量”,打开对应设置。
  2. 在用户变量中找到 Path,点击“编辑”。
  3. 点击“新建”,添加 D:\Program Files\ffmpeg\bin
  4. 保留其他条目,点击“确定”保存。
  5. 关闭整个终端窗口,再从开始菜单重新打开 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 数值越大,通常体积越小、细节损失越明显;数值越小,通常画质越高、体积越大。可以从 2326 开始,根据效果调整。

preset 控制编码速度与压缩效率。机器较慢时,可以改成 fastveryfast。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.jpgframe-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 滤镜文档 fpsscalepalettegenpaletteuse

音轨、合并与字幕

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.mp4subtitle.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 秒;其他素材和编码参数应以各自结果为准。

参考资料