编译与安装:Linux/macOS/Windows 三平台编译配置、依赖库管理、静态与动态链接选择

说实话,FFmpeg 的编译安装,是很多人入门时第一个坎。

我记得刚入行那会儿,为了在 Windows 上编译一个带显卡加速的 FFmpeg,折腾了整整两天。后来发现,其实就是几个依赖库的路径没写对。嗯,今天我把这些坑都给你填上。

一、三平台编译环境概览

先看一张总图,把三个平台的编译流程串起来。你想想看,其实核心逻辑都一样:配置 → 依赖 → 编译 → 链接。区别只在于工具链和包管理器。

核心原则:FFmpeg 本身是跨平台的,但它的依赖库(如 x264、fdk-aac、nv-codec-headers)各有各的脾气。编译前先把依赖理清楚,能省 80% 的麻烦。

FFmpeg 三平台编译流程总览 Linux 平台 macOS 平台 Windows 平台 gcc / clang + make Xcode Command Line Tools MSYS2 / MinGW / VS apt / yum / dnf Homebrew / MacPorts vcpkg / pacman x264 / x265 / fdk-aac libvpx / lame / opus nv-codec-headers ffmpeg / ffprobe / ffplay 静态链接 / 动态链接 二选一 提示:三个平台的 configure 参数 90% 相同,差异主要在 --extra-cflags 和 --extra-ldflags 的路径写法

二、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% 的问题。