3、FFmpeg 核心编译:从源码编译 FFmpeg,开启 libx264、libx265、libmp3lame、libfdk-aac 等常用编码器

说实话,很多做流媒体的朋友,一开始都用别人编译好的 FFmpeg 二进制包。用起来确实方便,但到了生产环境,问题就来了——缺编码器、缺滤镜、甚至缺协议支持。我当年第一次搭建推流管线时,就吃过这个亏。

所以这一章,咱们亲手从源码编译 FFmpeg。把 libx264、libx265、libmp3lame、libfdk-aac 这些硬货全塞进去。你想想看,自己编译的 FFmpeg,想加什么加什么,心里踏实。

为什么非要自己编译?

官方预编译包为了兼容性,默认只开最基础的编码器。像 libfdk-aac 这种高质量 AAC 编码器,因为许可证问题,官方包根本不带。libx264 虽然常见,但版本可能很老,编码效率差一截。

我自己踩过的坑:有次线上推流,视频编码用了官方包的 libx264,结果码率控制不稳,画面一复杂就卡顿。后来换成自己编译的最新版 libx264,同样的参数,稳如老狗。

核心原则:生产环境的 FFmpeg,必须自己编译。这是流媒体工程师的基本素养。

编译前的准备工作

先看看你的系统环境。我以 Ubuntu 20.04/22.04 为例,CentOS 用户自己换 yum 命令。

安装基础编译工具:

sudo apt update
sudo apt install -y \
  autoconf automake build-essential cmake \
  git libtool pkg-config texinfo \
  yasm nasm zlib1g-dev

这里有个细节:yasm 和 nasm 是汇编器,x264 和 x265 的汇编优化全靠它们。没装的话,编码速度能差好几倍。

先编译依赖库,再编译 FFmpeg

编译顺序很重要。我的习惯是:先编译所有第三方库,最后再编译 FFmpeg 本体。这样 FFmpeg 的 configure 脚本能自动检测到已安装的库。

下面我把几个核心库的编译步骤列出来。每个库我都用 --prefix=/usr/local 安装到系统路径,方便 FFmpeg 找到。

1. libx264

H.264 编码器,流媒体领域的老大哥。兼容性最好,几乎所有设备都支持。

git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --prefix=/usr/local --enable-shared --enable-static
make -j$(nproc)
sudo make install

注意 --enable-shared 这个参数。我建议编译成动态库,这样 FFmpeg 运行时能动态加载,升级库时不用重新编译 FFmpeg。

小技巧:编译 x264 时加上 --bit-depth=10,可以支持 10bit 编码。HDR 视频推流时很有用。

2. libx265

H.265/HEVC 编码器,压缩率比 H.264 高 30%-50%。适合 4K/8K 推流场景。

git clone https://bitbucket.org/multicoreware/x265_git.git
cd x265_git/build/linux
./make-Makefiles.bash
make -j$(nproc)
sudo make install

这里有个坑:x265 的编译脚本在 build/linux 目录下,别跑错路径。我第一次编译时直接在根目录执行 make,结果报了一堆错。

3. libmp3lame

MP3 编码器。虽然现在 AAC 更流行,但有些老旧设备只认 MP3。推流到某些 CDN 时也会用到。

wget https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz
tar xzf lame-3.100.tar.gz
cd lame-3.100
./configure --prefix=/usr/local --enable-shared --enable-nasm
make -j$(nproc)
sudo make install

--enable-nasm 开启汇编优化,编码速度能快不少。

4. libfdk-aac

目前质量最高的 AAC 编码器。苹果的 AAC 编码器也是基于 FDK 的。推流时我首选它。

git clone https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
./autogen.sh
./configure --prefix=/usr/local --enable-shared
make -j$(nproc)
sudo make install

许可证提醒:libfdk-aac 使用 GPL 不兼容的许可证。如果你发布包含它的 FFmpeg 二进制文件,必须遵守其许可证条款。个人使用没问题,商业分发要留意。

编译 FFmpeg 本体

依赖库都装好了,现在轮到主角登场。

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
./configure \
  --prefix=/usr/local \
  --enable-gpl \
  --enable-nonfree \
  --enable-libx264 \
  --enable-libx265 \
  --enable-libmp3lame \
  --enable-libfdk-aac \
  --enable-shared \
  --disable-static
make -j$(nproc)
sudo make install

几个关键参数说明:

参数 作用 我的建议
--enable-gpl 启用 GPL 许可证的组件 必须开,否则 x264/x265 用不了
--enable-nonfree 启用非自由许可证组件 libfdk-aac 需要这个
--enable-shared 编译成动态库 方便升级,减少二进制体积
--disable-static 不编译静态库 省空间,除非你有特殊需求

configure 执行完后,仔细看输出日志。它会列出检测到的所有组件。我习惯检查一下有没有 libx264、libx265、libmp3lame、libfdk-aac 这几个关键字。如果某个库显示 no,说明没找到,得回去检查编译步骤。

验证方法:编译完成后,运行 ffmpeg -encoders | grep -E "x264|x265|mp3|aac",看看编码器列表里有没有它们。

编译流程全景图

下面这张图,把整个编译流程串起来了。你照着这个顺序走,基本不会出错。

FFmpeg 编译流程全景图 1. 安装编译工具 gcc, make, yasm, nasm 2. 编译依赖库 x264, x265, lame, fdk-aac 3. FFmpeg configure 检测依赖库 4. make 编译 依赖库编译细节 libx264 libx265 libmp3lame libfdk-aac H.264 编码,兼容性最好 H.265 编码,压缩率更高 MP3 编码,老旧设备兼容 AAC 编码,音质最佳 configure 检查:是否全部显示 yes? 全部 yes → 继续 make 有 no → 检查依赖库

常见问题与避坑指南

编译过程中,我遇到过不少问题。挑几个典型的说说:

  • configure 报错 "libx264 not found":多半是 pkg-config 路径没设置。运行 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH 再试。
  • make 时内存不足:用 make -j2 减少并行任务数。虚拟机 2GB 内存的话,-j4 容易 OOM。
  • 编译出来的 ffmpeg 运行报错 "cannot open shared object file":动态库路径没注册。运行 sudo ldconfig 刷新缓存。

我的习惯:编译完成后,我会写一个简单的测试命令,验证编码器是否正常工作:ffmpeg -f lavfi -i testsrc2=duration=5:size=1280x720 -c:v libx264 -preset ultrafast test.mp4。能正常生成文件,说明编译成功。

编译后的目录结构

编译安装完成后,关键文件都在 /usr/local 下:

路径 内容
/usr/local/bin/ffmpeg FFmpeg 可执行文件
/usr/local/lib/libx264.so x264 动态库
/usr/local/lib/libx265.so x265 动态库
/usr/local/lib/libmp3lame.so MP3 编码动态库
/usr/local/lib/libfdk-aac.so FDK-AAC 动态库
/usr/local/include/ 头文件,二次开发时用