全部文章

FFmpeg 完整指南

FFmpeg 安装、常用命令、视频转码、音频处理、字幕合并与批量操作

目录 25 节

FFmpeg 完整指南

FFmpeg 是最强大的开源音视频处理工具,几乎所有媒体软件的底层都依赖它。

这页更适合作为“音视频处理任务手册”来用:先判断自己是在做转封装、转码、抽轨、压缩还是字幕处理,再选对应命令。FFmpeg 的难点通常不在命令多,而在于你是否清楚自己想保画质、保兼容性,还是优先缩体积。

先按任务选

最常见的需求可以先这样归类:

  • 只是换容器格式:优先尝试 -c copy
  • 要缩体积或改编码:再做重新编码
  • 只提取音频 / 字幕 / 缩略图:优先 -map-vn-an
  • 准备发网页或移动端:优先考虑 H.264 + AAC + MP4 的兼容组合

安装

# Scoop(推荐)
scoop install ffmpeg

# Winget
winget install Gyan.FFmpeg

# yt-dlp 团队维护的静态构建版
# https://github.com/yt-dlp/FFmpeg-Builds

验证:

ffmpeg -version

基础操作

格式转换

# 视频转码
ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a aac output.mp4

# 无损容器转换(不重新编码)
ffmpeg -i input.mkv -c copy output.mp4

# 音频转换
ffmpeg -i input.flac -c:a libmp3lame -q:a 0 output.mp3
ffmpeg -i input.wav -c:a libopus -b:a 128k output.opus

提取音视频

# 提取音频
ffmpeg -i video.mp4 -vn -c:a copy output.m4a

# 提取视频(去除音频)
ffmpeg -i video.mp4 -an -c:v copy output.mp4

# 提取指定音轨
ffmpeg -i video.mkv -map 0:a:1 -c:a copy second_audio.m4a

裁剪与拼接

# 裁剪(从 1:00 到 2:30)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:30 -c copy output.mp4

# 精确裁剪(重新编码)
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:01:30 -c:v libx264 -c:a aac output.mp4

# 拼接(先创建文件列表)
# filelist.txt 内容:
# file 'part1.mp4'
# file 'part2.mp4'
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

推荐处理流程

一个稳妥的处理顺序通常是:

  1. 先用 ffprobe 看清源文件编码、分辨率、音轨、字幕轨
  2. 判断能否直接 -c copy,避免无意义重编码
  3. 必须转码时,再选择目标编码器与参数
  4. 输出后抽查时长、音画同步、字幕、移动端兼容性

如果你不先看源文件信息,就很容易出现“其实只需要换封装,却误做整段转码”的浪费。

视频编码

H.264(兼容性最好)

ffmpeg -i input.mkv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4

CRF 值:0(无损)→ 23(默认)→ 51(最差),推荐 18-28。

H.265/HEVC(体积更小)

ffmpeg -i input.mkv -c:v libx265 -crf 28 -preset medium -c:a aac output.mp4

AV1(最新一代)

# SVT-AV1(速度较快)
ffmpeg -i input.mkv -c:v libsvtav1 -crf 30 -preset 6 -c:a libopus output.mkv

字幕处理

# 提取字幕
ffmpeg -i video.mkv -map 0:s:0 subtitle.srt

# 硬烧字幕(嵌入画面)
ffmpeg -i video.mp4 -vf "subtitles=sub.srt" output.mp4

# 软字幕(封装进容器)
ffmpeg -i video.mp4 -i sub.srt -c copy -c:s mov_text output.mp4

图片与 GIF

# 视频截图
ffmpeg -i video.mp4 -ss 00:00:30 -frames:v 1 screenshot.png

# 视频转 GIF
ffmpeg -i video.mp4 -vf "fps=15,scale=480:-1" -loop 0 output.gif

# 图片序列转视频
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4

音频处理

# 调整音量
ffmpeg -i input.mp3 -af "volume=1.5" output.mp3

# 音频标准化
ffmpeg -i input.mp3 -af loudnorm output.mp3

# 淡入淡出
ffmpeg -i input.mp3 -af "afade=t=in:d=3,afade=t=out:st=57:d=3" output.mp3

# 合并多个音频
ffmpeg -i "concat:01.mp3|02.mp3|03.mp3" -c copy output.mp3

质量与体积怎么取舍

一个简单的经验判断:

  • 追求兼容libx264 + aac + mp4
  • 追求更小体积libx265libsvtav1
  • 音频为主:优先 opusaac
  • 网页播放:输出 MP4 时可加 -movflags +faststart

例如网页视频常见写法:

ffmpeg -i input.mkv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k -movflags +faststart output.mp4

不要一味追求最低 CRF。体积、编码时间、播放设备兼容性往往要一起平衡。

实用技巧

查看文件信息

ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

批量转换(PowerShell)

Get-ChildItem *.mkv | ForEach-Object {
    ffmpeg -i $_.FullName -c:v libx264 -crf 23 -c:a aac "$($_.BaseName).mp4"
}

硬件加速

# NVIDIA GPU 加速编码
ffmpeg -i input.mkv -c:v h264_nvenc -preset p4 -crf 23 -c:a aac output.mp4

# Intel QSV
ffmpeg -i input.mkv -c:v h264_qsv -global_quality 23 -c:a aac output.mp4

常见问题

转完之后文件更大了

这通常说明:

  • 原文件本身已经压得很紧
  • 你用的目标参数比原片更高码率
  • 进行了不必要的重编码

先用 ffprobe 看清原始编码参数,再决定是否真的需要转。

字幕报错或乱码

  • 确认字幕文件编码是否为 UTF-8
  • Windows 路径里有空格时,滤镜参数要注意引号
  • 硬烧字幕走滤镜,软字幕走封装,二者不要混淆

音画不同步

优先确认源文件本身是否异常,再检查:

  • -ss 放在输入前还是输入后
  • 拼接文件是否编码参数一致
  • 是否混用了 VFR / CFR 素材

延伸阅读

参考链接

阅读建议
  • - 先读标题和摘要,再结合目录决定从哪个章节开始精读。
  • - 看到具体命令、配置或步骤时,尽量在自己的环境里同步验证。
  • - 如果你只是快速查资料,可先看目录和相关文档,再决定是否深入全文。
适合谁看
  • - 希望把零散经验整理成长期可复用工作流的人
  • - 需要处理图像、视频、音频或创作流水线的人
  • - 希望阅读时顺手建立自己的操作清单或收藏体系的人
执行前检查
  • - 先浏览标题、摘要和目录,带着问题阅读会更高效
  • - 确认素材路径、导出格式和磁盘空间是否满足当前任务
  • - 如果页面里提到相关文档,尽量一起打开对照,效果通常更完整
同类内容
← 上一篇Docker Compose 常用配置