4、FFmpeg编译安装:源码下载、依赖库安装、编译配置选项、安装验证

说实话,很多做流媒体的朋友一开始都习惯直接 apt install ffmpeg 或者从官网下载二进制包。但真正到了生产环境,你会发现预编译包缺这少那——比如不支持 libx264、没有 RTMP 复用器、甚至编解码器都不全。

我自己踩过这个坑。有一次项目紧急上线,需要推 HEVC 流到直播平台,结果服务器上的 FFmpeg 压根没编译进 libx265。重新编译?依赖库全要手动装,折腾了大半天。从那以后,我养成了一个习惯:只要涉及流媒体服务,一律源码编译 FFmpeg。

这一节,我就带你走一遍完整的编译流程。从源码下载到最终验证,每一步我都会告诉你为什么这么做,以及我踩过的坑。

核心原则:源码编译不是为了炫技,而是为了精确控制功能集、优化性能、避免运行时依赖缺失。你想想看,一个直播推流服务器,如果因为缺少某个复用器导致推流失败,那代价可就大了。

4.1 源码下载:选对版本很重要

FFmpeg 的源码托管在 GitHub 和官方 Git 仓库。我个人习惯直接从官方 Git 拉取,因为可以自由切换分支和标签。

# 克隆完整仓库(推荐,方便后续切换版本)
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg

# 或者只拉取最新代码(节省时间)
git clone --depth 1 https://git.ffmpeg.org/ffmpeg.git ffmpeg

这里有个小建议:不要用 master 分支做生产部署。master 是开发分支,可能包含未稳定的特性。我一般会切到最近的 release 标签:

git tag | grep '^n' | tail -5
git checkout n6.1.1   # 以 6.1.1 为例

我的习惯:每次编译前,先看 git log --oneline -5 确认当前 commit。曾经有一次我忘了切标签,编译出来的版本有内存泄漏,排查了半天才发现是开发分支的 bug。

4.2 依赖库安装:缺什么补什么

FFmpeg 的编译选项非常多,但核心依赖其实就几类。我按 Ubuntu/Debian 系统举例,CentOS 的包名略有不同,但思路一样。

依赖类别 典型库 作用 安装命令
基础工具链 build-essential, pkg-config 编译器、依赖检测 apt install build-essential pkg-config
编解码核心 libx264, libx265, libvpx H.264/H.265/VP9 编码 apt install libx264-dev libx265-dev libvpx-dev
音频编解码 libmp3lame, libfdk-aac MP3/AAC 编码 apt install libmp3lame-dev libfdk-aac-dev
容器格式 libass, libfreetype 字幕、字体渲染 apt install libass-dev libfreetype6-dev
网络协议 libsrt, librtmp SRT/RTMP 推流 apt install libsrt-dev librtmp-dev

注意:libfdk-aac 由于许可证问题,不在 Ubuntu 官方源中。你需要手动添加 multiverse 源或从源码编译。我一般用 apt install libfdk-aac-dev 如果源里没有,就编译安装。

一次性安装所有常用依赖:

sudo apt update
sudo apt install -y \
  build-essential pkg-config \
  libx264-dev libx265-dev libvpx-dev \
  libmp3lame-dev libfdk-aac-dev \
  libass-dev libfreetype6-dev \
  libsrt-dev librtmp-dev \
  libopus-dev libvorbis-dev \
  libtheora-dev libwebp-dev \
  libssl-dev libsdl2-dev

4.3 编译配置选项:定制你的 FFmpeg

这是最核心的一步。配置选项决定了你的 FFmpeg 能做什么、不能做什么。我见过很多人直接 ./configure 然后 make,结果编译出来的版本连 -re 参数都不支持。

下面是我用于直播推流场景的典型配置:

./configure \
  --prefix=/usr/local/ffmpeg \
  --enable-gpl \
  --enable-version3 \
  --enable-nonfree \
  --enable-shared \
  --enable-libx264 \
  --enable-libx265 \
  --enable-libvpx \
  --enable-libmp3lame \
  --enable-libfdk-aac \
  --enable-libass \
  --enable-libfreetype \
  --enable-libsrt \
  --enable-librtmp \
  --enable-libopus \
  --enable-libvorbis \
  --enable-openssl \
  --enable-ffplay \
  --extra-cflags="-I/usr/local/include" \
  --extra-ldflags="-L/usr/local/lib"

几个关键选项的解释:

  • --enable-gpl / --enable-version3 / --enable-nonfree:许可证相关。libx264 是 GPL,libfdk-aac 是非自由许可证,必须显式启用。
  • --enable-shared:编译成动态库。方便其他程序调用,但部署时要注意 LD_LIBRARY_PATH。
  • --enable-libsrt / --enable-librtmp:直播推流必备。没有这两个,你没法用 SRT 或 RTMP 协议推流。
  • --enable-ffplay:一个简单的播放器,调试时很有用。

避坑指南:我曾经在配置时忘了加 --enable-libx264,结果编译出来的 FFmpeg 只能软解不能软编码。推流时发现 CPU 占用率奇高,一看日志才发现用的是内置的 mpeg4 编码器。嗯,从那以后我每次配置完都会先检查输出日志里的 enabled encoders 列表。

配置完成后,会输出一份摘要。重点关注这几行:

Enabled encoders:
  libx264    libx265    libfdk_aac    libmp3lame    libopus
Enabled protocols:
  rtmp    rtmps    srt    tcp    udp
Enabled filters:
  scale    fps    overlay    drawtext

如果缺少你需要的编码器或协议,回去检查依赖库是否安装成功。

4.4 编译与安装:耐心等待

配置没问题后,就可以编译了。FFmpeg 的编译时间取决于你的 CPU 核心数。我建议用多线程编译:

make -j$(nproc)   # 使用所有 CPU 核心
sudo make install

make -j$(nproc) 会调用所有核心并行编译。如果内存不足(比如 2GB 的云服务器),可以改成 make -j2 或 make -j1。

注意:编译过程中如果报错,不要慌。大多数错误都是因为缺少某个开发包。看错误日志里的 ERROR: libxxx not found,然后安装对应的 -dev 包,重新 ./configure 再 make 即可。

安装完成后,FFmpeg 会被放到 /usr/local/ffmpeg 目录下。你需要把它的 bin 目录加入 PATH:

echo 'export PATH=/usr/local/ffmpeg/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

4.5 安装验证:确认一切正常

编译安装完,别急着用。先做几个快速验证:

  1. 版本检查:ffmpeg -version,确认版本号和编译时间。
  2. 编码器检查:ffmpeg -encoders | grep libx264,确认 libx264 已启用。
  3. 协议检查:ffmpeg -protocols | grep rtmp,确认 RTMP 协议可用。
  4. 实际转码测试:用一个小文件测试编码是否正常。

一个完整的验证命令:

# 生成测试视频
ffmpeg -f lavfi -i testsrc2=duration=10:size=1280x720:rate=30 \
       -c:v libx264 -preset ultrafast -b:v 2000k \
       -f mp4 /dev/null

如果这条命令没有报错,说明你的 FFmpeg 已经可以正常工作了。

我的经验:验证时别只跑 -version。我遇到过编译成功但运行时动态库加载失败的情况。所以一定要跑一个实际的编码任务,确保所有动态库都能正确加载。

4.6 整体流程回顾

下面这张图总结了 FFmpeg 源码编译的完整流程,从下载到验证:

FFmpeg 源码编译流程 1. 源码下载 2. 依赖库安装 3. 编译配置 4. 编译 & 安装 5. 安装验证 关键检查点 • 确认 release 标签 • 检查 -dev 包是否安装 • 核对 enabled encoders • 确认 protocols 列表 • 验证动态库加载 • 实际编码测试 常见错误: • libxxx not found • 许可证冲突 • 内存不足导致编译失败 • 动态库路径未配置 • 版本不兼容 输出产物 • ffmpeg 可执行文件 • ffprobe 分析工具 • ffplay 播放器 • 动态库 (.so) • 头文件 (.h) • 配置文件 部署路径: /usr/local/ffmpeg/ ├── bin/ ├── lib/ ├── include/ └── share/

整个流程走下来,大概需要 10-30 分钟,取决于你的网络和机器性能。但这一步花的时间是值得的——你得到的 FFmpeg 是为你自己的场景量身定制的,没有冗余功能,也没有缺失依赖。

最后一个小建议:编译完成后,把 ./configure 的命令保存到一个脚本里,比如 build_ffmpeg.sh。下次升级版本时,直接改版本号重新跑一遍就行。我自己就是这么干的,省时省力。