本文写于 2017 年,示例重点是 FFmpeg 在 macOS App 场景下的编译思路。实际项目建议固定 FFmpeg、x264、fdk-aac 等依赖版本,避免直接使用最新主干导致构建结果不可复现。

我们今天来说说如何编译出适用于 macOS App 的库,包括动态库和静态库。

一、基本编译

1、首先下载 FFmpeg 源码。生产项目建议切换到明确的 tag 或 release 分支。

1
git clone https://git.ffmpeg.org/ffmpeg.git

2、配置 ./configure 选项。这里要注意设置 macOS 最低版本要求,否则可能会按当前构建机系统版本生成库文件;如果 App 需要运行在更低版本 macOS 上,就可能出现兼容性问题。

1
--extra-cflags=-mmacosx-version-min=10.8 --extra-ldflags=-mmacosx-version-min=10.8

3、执行 ./configure,示例如下:

1
./configure --target-os=darwin --enable-static --enable-swscale --enable-nonfree --enable-gpl --enable-version3 --disable-programs --libdir=/ffmpegbuild/lib --incdir=/ffmpegbuild/include --enable-shared --extra-cflags=-mmacosx-version-min=10.8 --extra-ldflags=-mmacosx-version-min=10.8

4、执行编译和安装

1
make && sudo make install

5、在根目录下的ffmpegbuild目录中,就是编译好的头文件和库文件,包括静态库和动态库。

二、高级编译

前面之所以说是基本编译,是因为主要编译 FFmpeg 自带库。它包含了大多数 Decoder,但 Encoder 相对有限。例如如果需要把音频编码为 AAC,可能需要额外启用合适的 AAC 编码器。

1、下载和编译aac库

1
2
3
4
5
6
git clone https://github.com/mstorsjo/fdk-aac.git
cd fdk-aac
# 执行这一步需要 automake,如果没有可以先执行 brew install automake
./autogen.sh
./configure --enable-shared --enable-static --prefix=/Users/forcetech/Downloads/opt/
make && sudo make install

也可以直接通过 Homebrew 安装编译后的 AAC 库:

1
brew install fdk-aac

2、下载和编译x264库

1
2
3
4
git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --disable-asm --enable-shared --enable-static --prefix=/Users/forcetech/Downloads/opt/
make && sudo make install

也可以直接通过 Homebrew 安装编译后的 x264 库:

1
brew install x264

3、./configure 配置
这里要注意,需要把 AAC、x264 的库文件和头文件路径加到配置里,否则可能会提示 aac not found

1
./configure --target-os=darwin --enable-static --enable-swscale --enable-libfdk-aac --enable-libx264 --enable-nonfree --enable-gpl --enable-version3 --disable-programs --libdir=/ffmpegbuild/lib --incdir=/ffmpegbuild/include --enable-shared --extra-cflags="-mmacosx-version-min=10.8 -I/Users/forcetech/Downloads/opt/include" --extra-ldflags="-mmacosx-version-min=10.8 -L/Users/forcetech/Downloads/opt/lib" --prefix=/Users/forcetech/Downloads/opt/

4、执行编译和安装

1
make && sudo make install

5、在根目录下的ffmpegbuild目录中,就是编译好的头文件和库文件,包括静态库和动态库。