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",看看编码器列表里有没有它们。
编译流程全景图
下面这张图,把整个编译流程串起来了。你照着这个顺序走,基本不会出错。
常见问题与避坑指南
编译过程中,我遇到过不少问题。挑几个典型的说说:
- 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/ |
头文件,二次开发时用 |