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 安装验证:确认一切正常
编译安装完,别急着用。先做几个快速验证:
- 版本检查:
ffmpeg -version,确认版本号和编译时间。 - 编码器检查:
ffmpeg -encoders | grep libx264,确认 libx264 已启用。 - 协议检查:
ffmpeg -protocols | grep rtmp,确认 RTMP 协议可用。 - 实际转码测试:用一个小文件测试编码是否正常。
一个完整的验证命令:
# 生成测试视频
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 源码编译的完整流程,从下载到验证:
整个流程走下来,大概需要 10-30 分钟,取决于你的网络和机器性能。但这一步花的时间是值得的——你得到的 FFmpeg 是为你自己的场景量身定制的,没有冗余功能,也没有缺失依赖。
最后一个小建议:编译完成后,把 ./configure 的命令保存到一个脚本里,比如 build_ffmpeg.sh。下次升级版本时,直接改版本号重新跑一遍就行。我自己就是这么干的,省时省力。