你是否曾经遇到过这样的情况:下载了一个视频,却发现手机无法播放;或者拍了一段有趣的素材,想要截取其中一段发到朋友圈,却不知道用什么软件?如果你不想安装那些体积庞大、充满广告的视频编辑软件,那么 FFmpeg 绝对是你的救星。
FFmpeg 是一款开源、免费、强大的音视频处理工具,它主要通过命令行操作,但一旦上手,你会发现它比任何图形界面软件都要高效。本文将手把手教你如何在 Windows 系统下安装和使用 FFmpeg。
说点与教程无关的,其实,放在三年前,我不会推荐小白去使用 FFmpeg,但是到变了,AI 时代的到来改变了很多东西,即使你对电脑一无所知,也可以借助 AI 编写命令行代码,譬如我自己,我用了很久的 FFmpeg,几乎从未手写过命令,言归正传,我们接着回到安装教程。
第一部分:FFmpeg 的安装
-
访问官网下载页面
打开浏览器,访问 FFmpeg 的官方下载地址:https://www.gyan.dev/ffmpeg/builds/
-
选择合适的版本
在页面中找到你需要的安装包,带有
essentials字样的是精简版,带有full字样的是完整版,理论上精简版足以满足大部分功能,不过我建议下载完整版,毕竟大家电脑应该都不差这一点存储空间。如果你打不开网页或者懒得分辨安装包也没事,我给大家准备好了,访问https://pan.quark.cn/s/3f38c878a456即可
-
解压并放置
解压下载的压缩包,然后粘贴到一个你容易找到的位置,例如 **
E:\FFmpeg**。
第二部分:配置环境变量(让 FFmpeg 随处可用)
-
找到 bin 路径
进入刚才解压的 FFmpeg 文件夹,找到名为
bin的子文件夹。比兔我的是E:\ffmpeg\bin。请复制这个路径。 -
打开环境变量设置
-
按住
Win键,搜索框输入环境变量
-
右键点击 "此电脑" 或 "我的电脑",选择 "属性"。

-
-
修改 Path 变量
-
点击【环境变量(N)】
-
在 "系统变量" 列表中,找到并双击
Path变量。
-
点击右上角的 "新建 ",将刚才复制的
bin文件夹路径粘贴进去。 -
一路点击 "确定" 保存。
-
-
验证安装
按下
Win + R,输入cmd打开命令提示符,输入以下命令:bashffmpeg -version如果屏幕上显示出 FFmpeg 的版本信息和配置参数,恭喜你,安装成功了!
第三部分:FFmpeg 基础使用教程
这方面,你需要做的就是将你的需求准确的描述给 AI,你可以先问这个需求可不可以用 FFmpeg 实现,然后让 AI 给你具体代码,不会就问,如果报错就再把错误信息复制粘贴发给 AI,多来几次就熟能生巧了,然后常用的功能可以建一个 txt 文本文件夹,编写一个脚本文件,给大家分享一下我常用的提示词模板。
使用的时候要把 AI 给你的命令复制到命令行窗口中,可以按下 Win + R,输入 cmd 打开命令提示符,粘贴命令;也可以按下Win键,搜索Powershell并打开,这俩有什么区别我就不介绍少了,就当作业吧,大家自己查查或者问问 AI 都行。
markdown
[在这里输入需求]
输入参数如下:
1. 输入文件完整路径
2. 输出文件夹
3. 根据要求设计你的输入参数
下面是我烧录字幕设置的提示词
markdown
编写 FFmpeg 脚本
实现功能:将字幕烧录到视频中(即硬字幕)
接收参数:
1. 字幕文件路径
2. 视频文件路径
3. 是否使用 GPU 加速
4. 速度
5. 视频质量
6. 编码格式
7. 文件格式
8. 输出文件夹路径
要求:
1. 视频重编码,音频直接复制,如原本有字幕轨道,清空
2. powershell脚本,可直接粘贴运行
能够得到一个这样的脚本
bash
# --- 配置区域 (在此修改参数) ---
$VideoPath = "E:\Videos\英语视频\BranchEducation\GPU 是如何工作的\00.mp4"
$SubtitlePath = "E:\Videos\英语视频\BranchEducation\GPU 是如何工作的\00.ass"
$OutputDir = "" # 留空 "" 则默认输出到原视频文件夹
$UseGPU = $true # $true 为使用 NVIDIA 显卡加速,$false 为使用 CPU
$Speed = "p7" # GPU: p1(最快)-p7(最强) | CPU: ultrafast, medium, veryslow
# ============ 画质控制 ============
$Quality = 27 # ← 在此设置画质等级
$EncFormat = "av1" # 编码格式: "av1", "h264" 或 "h265"
$OutContainer = "mp4" # 输出文件后缀: mp4, mkv 等
# 1. 路径验证与处理
if (-not (Test-Path -LiteralPath $VideoPath)) {
Write-Host "错误: 找不到视频文件 -> $VideoPath" -ForegroundColor Red
Read-Host "按任意键退出"; exit 1
}
if (-not (Test-Path -LiteralPath $SubtitlePath)) {
Write-Host "错误: 找不到字幕文件 -> $SubtitlePath" -ForegroundColor Red
Read-Host "按任意键退出"; exit 1
}
if ([string]::IsNullOrWhiteSpace($OutputDir)) {
$OutputDir = Split-Path -Parent $VideoPath
} elseif (-not (Test-Path -LiteralPath $OutputDir)) {
New-Item -ItemType Directory -Force -Path $OutputDir | Out-Null
}
$FileName = [System.IO.Path]::GetFileNameWithoutExtension($VideoPath)
$OutputFile = Join-Path $OutputDir ("{0}_hardsub.{1}" -f $FileName, $OutContainer)
# 正确转义含空格的字幕路径
$EscapedSubPath = $SubtitlePath -replace '\\', '/' -replace ':', '\:' -replace "'", "\'"
# ============ 新增: 字幕与字体预检 ============
Write-Host "正在预检字幕文件和字体..." -ForegroundColor Cyan
$PreCheckArgs = @(
"-hide_banner",
"-loglevel", "warning",
"-i", $VideoPath,
"-vf", "subtitles='$EscapedSubPath'",
"-frames:v", "1", # 只测试1帧,速度极快
"-f", "null", # 不输出实体文件
"-"
)
# 捕获预检输出 (合并 stderr 和 stdout)
$PreCheckOutput = & ffmpeg $PreCheckArgs 2>&1
# 检查是否包含指定的 libass 字体报错/回退警告
$FontError = $PreCheckOutput | Where-Object {
$_ -match "Using default font" -or
$_ -match "fontselect:" -or
$_ -match "Glyph .* not found" -or
$_ -match "Cannot load default config file"
}
if ($FontError) {
Write-Host "`n[致命错误] 字幕字体预检失败!系统缺失 ASS 中指定的字体,FFmpeg 已强制回退为默认字体。" -ForegroundColor Red
Write-Host "拦截到的底层报错信息如下:" -ForegroundColor Yellow
$FontError | ForEach-Object { Write-Host " $_" }
Read-Host -Prompt "`n请安装缺失字体,或检查字幕文件配置后再试。按任意键退出"
exit 1
}
# ==============================================
# 2. 确定编码器参数
$VideoCodec = ""
$QualityArgs = @()
if ($UseGPU) {
if ($EncFormat -eq "av1") { $VideoCodec = "av1_nvenc" }
elseif ($EncFormat -eq "h265") { $VideoCodec = "hevc_nvenc" }
else { $VideoCodec = "h264_nvenc" }
$QualityArgs = @("-cq", "$Quality", "-b:v", "0")
} else {
if ($EncFormat -eq "av1") { $VideoCodec = "libsvtav1" }
elseif ($EncFormat -eq "h265") { $VideoCodec = "libx265" }
else { $VideoCodec = "libx264" }
$QualityArgs = @("-crf", "$Quality")
}
# 3. 构建FFmpeg参数数组 (修复了 PowerShell 数组传递时自带双引号导致路径解析失败的隐患)
$FFmpegArgs = @(
"-hide_banner",
"-loglevel", "warning",
"-stats",
"-i", $VideoPath,
"-vf", "subtitles='$EscapedSubPath'",
"-c:v", $VideoCodec,
"-preset", $Speed
) + $QualityArgs + @(
"-c:a", "copy",
"-sn",
"-y",
$OutputFile
)
Write-Host "开始处理: $FileName (编码: $EncFormat | 画质: $Quality)" -ForegroundColor Cyan
# 执行FFmpeg
$StartTime = Get-Date
& ffmpeg $FFmpegArgs
$ExitCode = $LASTEXITCODE
$EndTime = Get-Date
# 结果判断
if ($ExitCode -eq 0) {
Write-Host "`n[成功] 视频导出完毕,耗时: $(($EndTime - $StartTime).ToString('hh\:mm\:ss'))" -ForegroundColor Green
} else {
Write-Host "`n[失败] FFmpeg 退出异常 (代码: $ExitCode),请检查上方输出。" -ForegroundColor Red
}
Read-Host -Prompt "`n按任意键关闭窗口"
然后我比较喜欢用 powershell,所以都让写的 powershell 脚本,你也可以让 AI 编写 cmd 脚本,没差儿。
结语
FFmpeg 的魅力在于它的"轻量"与"强大"。虽然刚开始接触命令行可能会让人感到有些陌生,有畏难情绪,但这东西玩着玩着就明白了,甚至上头之后反而可能不喜欢有图形界面的[doge],总之别给自己设限,多尝试一下。
今日互动: 你第一次接触 FFmpeg 是用来解决什么问题的?欢迎分享你的故事。