你是否曾经遇到过这样的情况:下载了一个视频,却发现手机无法播放;或者拍了一段有趣的素材,想要截取其中一段发到朋友圈,却不知道用什么软件?如果你不想安装那些体积庞大、充满广告的视频编辑软件,那么 FFmpeg 绝对是你的救星。

FFmpeg 是一款开源、免费、强大的音视频处理工具,它主要通过命令行操作,但一旦上手,你会发现它比任何图形界面软件都要高效。本文将手把手教你如何在 Windows 系统下安装和使用 FFmpeg。

说点与教程无关的,其实,放在三年前,我不会推荐小白去使用 FFmpeg,但是到变了,AI 时代的到来改变了很多东西,即使你对电脑一无所知,也可以借助 AI 编写命令行代码,譬如我自己,我用了很久的 FFmpeg,几乎从未手写过命令,言归正传,我们接着回到安装教程。

第一部分:FFmpeg 的安装

  1. 访问官网下载页面
    打开浏览器,访问 FFmpeg 的官方下载地址:https://www.gyan.dev/ffmpeg/builds/

  2. 选择合适的版本
    在页面中找到你需要的安装包,带有essentials字样的是精简版,带有full字样的是完整版,理论上精简版足以满足大部分功能,不过我建议下载完整版,毕竟大家电脑应该都不差这一点存储空间。
    如果你打不开网页或者懒得分辨安装包也没事,我给大家准备好了,访问https://pan.quark.cn/s/3f38c878a456即可

  3. 解压并放置
    解压下载的压缩包,然后粘贴到一个你容易找到的位置,例如 E:\FFmpeg

第二部分:配置环境变量(让 FFmpeg 随处可用)

  1. 找到 bin 路径
    进入刚才解压的 FFmpeg 文件夹,找到名为 bin 的子文件夹。比兔我的是E:\ffmpeg\bin请复制这个路径

  2. 打开环境变量设置

    • 按住Win键,搜索框输入环境变量在这里插入图片描述

    • 右键点击 “此电脑” 或 “我的电脑”,选择 “属性”。在这里插入图片描述

  3. 修改 Path 变量

    • 点击【环境变量(N)】

    • 在 “系统变量” 列表中,找到并双击 Path 变量。在这里插入图片描述

    • 点击右上角的 “新建”,将刚才复制的 bin 文件夹路径粘贴进去。

    • 一路点击 “确定” 保存。

  4. 验证安装
    按下 Win + R,输入 cmd 打开命令提示符,输入以下命令:

    ffmpeg -version
    

    如果屏幕上显示出 FFmpeg 的版本信息和配置参数,恭喜你,安装成功了!

第三部分:FFmpeg 基础使用教程

这方面,你需要做的就是将你的需求准确的描述给 AI,你可以先问这个需求可不可以用 FFmpeg 实现,然后让 AI 给你具体代码,不会就问,如果报错就再把错误信息复制粘贴发给 AI,多来几次就熟能生巧了,然后常用的功能可以建一个 txt 文本文件夹,编写一个脚本文件,给大家分享一下我常用的提示词模板。

使用的时候要把 AI 给你的命令复制到命令行窗口中,可以按下 Win + R,输入 cmd 打开命令提示符,粘贴命令;也可以按下Win键,搜索Powershell并打开,这俩有什么区别我就不介绍少了,就当作业吧,大家自己查查或者问问 AI 都行。

[在这里输入需求]
输入参数如下:
1. 输入文件完整路径
2. 输出文件夹
3. 根据要求设计你的输入参数

下面是我烧录字幕设置的提示词

编写 FFmpeg 脚本
实现功能:将字幕烧录到视频中(即硬字幕)
接收参数:
1. 字幕文件路径
2. 视频文件路径
3. 是否使用 GPU 加速
4. 速度
5. 视频质量
6. 编码格式
7. 文件格式
8. 输出文件夹路径
要求:
1. 视频重编码,音频直接复制,如原本有字幕轨道,清空
2. powershell脚本,可直接粘贴运行

能够得到一个这样的脚本

# --- 配置区域 (在此修改参数) ---
$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 是用来解决什么问题的?欢迎分享你的故事。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐