编译与安装:Linux/macOS/Windows 三平台编译配置、依赖库管理、静态与动态链接选择
说实话,FFmpeg 的编译安装,是很多人入门时第一个坎。
我记得刚入行那会儿,为了在 Windows 上编译一个带显卡加速的 FFmpeg,折腾了整整两天。后来发现,其实就是几个依赖库的路径没写对。嗯,今天我把这些坑都给你填上。
一、三平台编译环境概览
先看一张总图,把三个平台的编译流程串起来。你想想看,其实核心逻辑都一样:配置 → 依赖 → 编译 → 链接。区别只在于工具链和包管理器。
核心原则:FFmpeg 本身是跨平台的,但它的依赖库(如 x264、fdk-aac、nv-codec-headers)各有各的脾气。编译前先把依赖理清楚,能省 80% 的麻烦。
二、Linux 平台编译
Linux 是最省心的平台。我个人习惯用 Ubuntu/Debian 系,包管理方便,社区支持也好。
2.1 安装基础工具链
sudo apt update
sudo apt install build-essential cmake git pkg-config
sudo apt install yasm nasm libtool autoconf automake
小技巧:yasm 和 nasm 是汇编优化器,没有它们,x264 和 x265 的性能会掉一大截。我见过有人编译完才发现没装 nasm,编码速度直接腰斩。
2.2 安装核心依赖库
这里分两类:系统包管理器能直接装的,和需要手动编译的。
| 依赖库 | apt 包名 | 手动编译? | 说明 |
|---|---|---|---|
| x264 | libx264-dev | 建议手动(版本更新) | H.264 编码器,必装 |
| x265 | libx265-dev | 建议手动 | H.265/HEVC 编码器 |
| fdk-aac | libfdk-aac-dev | 建议手动 | AAC 编码器,许可证问题 |
| libvpx | libvpx-dev | 可选 | VP8/VP9 编码器 |
| opus | libopus-dev | 可选 | Opus 音频编码器 |
手动编译 x264 的典型流程:
git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --enable-shared --enable-static --prefix=/usr/local
make -j$(nproc)
sudo make install
2.3 配置 FFmpeg
./configure \
--prefix=/usr/local \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-libvpx \
--enable-libopus \
--enable-ffplay \
--extra-cflags="-I/usr/local/include" \
--extra-ldflags="-L/usr/local/lib"
make -j$(nproc)
sudo make install
注意:--enable-nonfree 和 --enable-gpl 同时使用,意味着你的二进制文件受 GPL 约束。如果只是个人使用无所谓,但分发时要小心许可证合规问题。
三、macOS 平台编译
macOS 上我强烈推荐用 Homebrew。它能把依赖管理得明明白白。
3.1 安装 Xcode Command Line Tools
xcode-select --install
这一步会安装 clang、make 等基础工具。没有它,后面什么都干不了。
3.2 安装 Homebrew 和依赖
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install automake cmake pkg-config yasm nasm
brew install x264 x265 fdk-aac libvpx opus
Homebrew 的库默认装在 /usr/local/opt/ 下。configure 时路径要写对:
./configure \
--prefix=/usr/local \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-libvpx \
--enable-libopus \
--extra-cflags="-I/usr/local/opt/x264/include -I/usr/local/opt/x265/include" \
--extra-ldflags="-L/usr/local/opt/x264/lib -L/usr/local/opt/x265/lib"
避坑指南:macOS 的 SIP(系统完整性保护)可能会阻止你往 /usr/local 写文件。如果遇到权限问题,用 --prefix=$HOME/ffmpeg_build 装到用户目录下。
四、Windows 平台编译
Windows 是最折腾的。我个人试过三种方案:MSYS2、MinGW、Visual Studio。最终稳定下来的是 MSYS2 + MinGW-w64。
4.1 安装 MSYS2
去官网下载安装包,装完后打开 MSYS2 UCRT64 终端。
pacman -Syu
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
pacman -S mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-pkg-config
pacman -S mingw-w64-ucrt-x86_64-yasm mingw-w64-ucrt-x86_64-nasm
4.2 安装依赖库
pacman -S mingw-w64-ucrt-x86_64-x264
pacman -S mingw-w64-ucrt-x86_64-x265
pacman -S mingw-w64-ucrt-x86_64-fdk-aac
pacman -S mingw-w64-ucrt-x86_64-libvpx
pacman -S mingw-w64-ucrt-x86_64-opus
4.3 配置 FFmpeg
./configure \
--prefix=/usr/local \
--enable-gpl \
--enable-nonfree \
--enable-libx264 \
--enable-libx265 \
--enable-libfdk-aac \
--enable-libvpx \
--enable-libopus \
--target-os=mingw32 \
--arch=x86_64
make -j$(nproc)
make install
Windows 特别提醒:路径中不要有中文和空格。我曾经因为用户名是中文,编译时各种报错,最后新建了一个英文账户才搞定。
五、静态链接 vs 动态链接
这是很多人纠结的问题。我直接说结论:
| 对比项 | 静态链接 | 动态链接 |
|---|---|---|
| 二进制体积 | 大(约 50-80 MB) | 小(约 5-10 MB) |
| 部署复杂度 | 低,单文件拷贝 | 高,需附带 .dll/.so |
| 更新依赖 | 需重新编译 FFmpeg | 替换 .dll/.so 即可 |
| 性能 | 略高(无动态加载开销) | 略低(可忽略) |
| 许可证风险 | 高(GPL 传染) | 低(可单独分发) |
我个人习惯:开发环境用动态链接,方便调试和更新库版本。生产环境用静态链接,部署时一个二进制文件搞定,省心。
静态链接的 configure 参数:
./configure --enable-static --disable-shared
动态链接的 configure 参数:
./configure --disable-static --enable-shared
我的建议:如果你只是自己用,静态链接最省事。如果你要分发给别人用,或者集成到其他项目中,动态链接更灵活。我曾经给客户交付时用了静态链接,结果对方想升级 x264 版本,只能重新编译整个 FFmpeg——那叫一个尴尬。
六、常见编译错误与解决
这里列几个我踩过的坑:
- ERROR: x264 not found —— 检查 pkg-config 路径,或者手动指定
--extra-cflags和--extra-ldflags - nasm/yasm not found —— 装好汇编器,x264 和 x265 需要它们做汇编优化
- undefined reference to `av_*' —— 链接顺序问题,把
-l参数放在源文件后面 - ffplay 编译失败 —— 缺 SDL2 库,装好
libsdl2-dev再重新 configure
终极调试技巧:在 configure 失败后,查看 ffbuild/config.log 文件。里面记录了详细的错误原因,比看终端输出有用十倍。
好了,编译安装这块就这些。记住:依赖先行,路径写对,耐心看 log。三句话能解决 90% 的问题。