1. FFmpeg 初识:从命令行到音视频处理的瑞士军刀

说实话,我第一次接触 FFmpeg 是在一个视频转码项目里。那时候甲方丢过来一堆 .mov 文件,要求全部转成 MP4,还要压缩到 50MB 以内。我翻遍了各种 GUI 工具,要么收费,要么转出来画质惨不忍睹。后来一个老同事甩了句:「试试 FFmpeg,一行命令搞定。」

嗯,从那以后,我就再也没用过别的转码工具了。

1.1 FFmpeg 发展史:一个开源项目的 20 年

FFmpeg 诞生于 2000 年,由法国程序员 Fabrice Bellard 发起。你可能没听过这个名字,但他还搞过 QEMU(虚拟机)和 TinyCC(微型 C 编译器)——是个真正的极客。

项目名字很有意思:FF 代表 Fast Forward,mpeg 是 Moving Picture Experts Group 的缩写。合起来就是「快速处理音视频」的意思。

我简单梳理了几个关键节点:

年份 事件 我的感受
2000 Fabrice Bellard 发布初始版本 那时候我还在上学,完全不知道这东西
2004 加入 libavcodec、libavformat 核心库 奠定了 FFmpeg 的架构基础
2011 Libav 分支分裂事件 社区动荡,但 FFmpeg 活下来了
2015 支持硬件加速(NVIDIA CUDA、Intel QSV) 转码速度直接起飞
2020 至今 持续迭代,支持 AV1、VVC 等新编码 老项目依然能打

为什么它能活 20 年?说白了,就是「开源 + 社区 + 实用」。你想想看,一个命令行工具能搞定几乎所有音视频格式的转换、裁剪、拼接、滤镜……这本身就是个奇迹。

1.2 核心组件:FFmpeg 的「五脏六腑」

很多人以为 FFmpeg 就是一个可执行文件。其实它是一套库的集合。我习惯把它拆成四个核心组件:

  • libavformat —— 封装/解封装引擎。负责把视频文件拆成音频流、视频流、字幕流,或者反过来组装。我遇到过最坑的情况:一个 .ts 文件用 libavformat 解析出来有 7 条音轨,但播放器只认前两条……
  • libavcodec —— 编解码核心。H.264、HEVC、AAC、MP3……所有编码器的实现都在这里。注意,它不包含某些专利编码器(比如 Fraunhofer 的 AAC 编码器),需要额外编译。
  • libavfilter —— 滤镜系统。缩放、裁剪、加水印、调色、变速……你能想到的滤镜操作,它都有。我曾经用 libavfilter 给一个 4K 视频加了 8 个滤镜,CPU 直接飙到 100%,但效果确实好。
  • libswscale —— 图像缩放与色彩空间转换。YUV 转 RGB、720p 转 1080p……这些脏活累活都是它干。

一句话总结:FFmpeg = libavformat(拆包/打包)+ libavcodec(编解码)+ libavfilter(滤镜)+ libswscale(缩放/色彩转换)。

另外还有几个辅助库:libswresample(音频重采样)、libpostproc(后处理),但核心就是上面四个。

1.3 应用场景:你每天都在用 FFmpeg

你可能没意识到,很多你熟悉的软件底层就是 FFmpeg:

  • 视频网站:B站、YouTube 的上传转码,背后都是 FFmpeg 集群在跑
  • 直播平台:OBS Studio 推流用的就是 FFmpeg 的 libavformat
  • 播放器:VLC、MPV、IINA 都重度依赖 FFmpeg
  • 移动端:抖音、快手、Instagram 的滤镜和剪辑功能,底层也是 FFmpeg
  • 专业工具:Adobe Premiere Pro 的某些导出预设也调用了 FFmpeg

我自己的项目里,FFmpeg 主要干三件事:

  1. 批量转码:把几百个 .flv 文件转成 .mp4,一行 for 循环搞定
  2. 视频截图:每隔 5 秒截一张图,用于内容审核
  3. 音频提取:从视频里抽取出纯净的 WAV 文件,做语音识别

小技巧:如果你只是偶尔用一次 FFmpeg,完全不需要学编程。记住几个常用命令就够了。但如果你想深入定制,那就得啃源码了。

1.4 安装与验证:Windows / Mac / Linux 全平台指南

安装 FFmpeg 其实很简单。但不同平台有不同坑,我踩过不少,给你列出来:

Windows

  • 官方渠道:从 ffmpeg.org/download.html 下载 Windows 构建版(推荐选择 gyan.dev 或 BtbN 的版本)
  • 解压:把 zip 包解压到 C:\ffmpeg
  • 配置环境变量:把 C:\ffmpeg\bin 添加到系统 PATH
  • 验证:打开 cmd,输入 ffmpeg -version

避坑指南:我曾经在 Windows 上直接双击 ffmpeg.exe,结果闪一下就没了。记住,FFmpeg 是命令行工具,必须在终端里运行。双击是没用的。

macOS

  • 推荐方式:用 Homebrew 安装,一行命令:brew install ffmpeg
  • 可选方式:从官网下载静态构建版
  • 验证:终端输入 ffmpeg -version

我个人习惯用 Homebrew,因为它会自动处理依赖。但要注意,Homebrew 默认不包含某些非自由编码器(比如 Fraunhofer AAC),需要加 --with-fdk-aac 参数。

Linux

  • Ubuntu/Debian:sudo apt install ffmpeg
  • CentOS/RHEL:需要先启用 EPEL 源,然后 sudo yum install ffmpeg
  • Arch Linux:sudo pacman -S ffmpeg
  • 验证:终端输入 ffmpeg -version

Linux 下最容易出问题的是依赖库版本。我遇到过 libx264 版本太旧导致编码失败的情况,建议用官方源或者自己编译。

验证是否安装成功

不管哪个平台,安装完后都跑一下这个命令:

ffmpeg -version

如果看到类似下面的输出,就说明安装成功了:

ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 13.2.0 (GCC)
configuration: --enable-gpl --enable-version3 --enable-nonfree
libavutil      58. 29.100 / 58. 29.100
libavcodec     60. 31.102 / 60. 31.102
libavformat    60. 16.100 / 60. 16.100
libavfilter     9. 12.100 /  9. 12.100
libswscale      7.  5.100 /  7.  5.100
libswresample   4. 12.100 /  4. 12.100

注意看 libavcodec、libavformat 这些核心库的版本号。如果某个库显示 N/A,说明编译时没包含它。

1.5 FFmpeg 知识体系总览

为了让你对 FFmpeg 的整体结构有个直观印象,我画了一张图:

FFmpeg 核心知识体系 FFmpeg 命令行 libavformat libavcodec libavfilter libswscale 封装/解封装 MP4/MKV/FLV/TS 编解码 H.264/HEVC/AAC/MP3 滤镜处理 缩放/裁剪/水印/变速 图像缩放/色彩转换 YUV↔RGB/分辨率 libswresample libpostproc 转码/压缩 直播推流 视频剪辑 音频处理 FFmpeg = 命令行 + 4 大核心库 + 2 个辅助库 → 覆盖所有音视频处理场景 本课程将逐一深入每个模块,从命令行到 API 调用

这张图把 FFmpeg 的层次关系讲清楚了。从上到下依次是:命令行工具 → 四大核心库 → 辅助库 → 实际应用场景。后面的课程,我们会一层一层往下挖。

1.6 本章小结

嗯,第一章的内容就这些。说白了,FFmpeg 就是一个「音视频处理的瑞士军刀」。你不需要一开始就搞懂所有库的源码,先学会安装、验证、跑通第一个命令,后面的事情就水到渠成了。

我记得自己第一次用 FFmpeg 转码时,连 -c:v 和 -c:a 都分不清。但跑通之后,那种「一行命令搞定一切」的快感,至今难忘。