最近因为一个项目要求,需要开发实时视频编解码功能,准备采用 FFmpeg 以 x264 方式进行实时的视频编解码。Windows 以及 Linux 环境下的 FFmpeg 动态库、头文件等资源都非常容易获得,编译环境也容易构建,但 Mac OS X 下的开发编译环境就不那么容易了。因为 FFmpeg 默认没有提供 Mac OS X 下的已经编译好的动态链接库(甚至连静态库都没有提供),而网上找到的多是编译好的单独的 FFmpeg 可执行程序,满足不了开发过程中对 FFmpeg 动态库(或静态库)的编译连接要求,因此考虑自己动手从源代码编译安装 FFmpeg,以获得 Mac OS X 下的 FFmpeg 动态链接库(以及静态库)版本,并构建好开发编译环境。
首先要确保 Mac OS X 下已经具备编译开发环境,一般都是安装 XCode 以及对应的 Command line tools。
然后,从 FFmpeg 官方网站下载 FFmpeg 最新版本的源代码,可直接下载打包好的源代码压缩文件,也可以通过 git 获取完整源代码镜像,推荐用 git,命令如下:
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
这时不要急着马上开始进行编译配置!因为首先要明白一点,FFmpeg 是一个编解码框架,能够支持各种不同的编解码器,并采用统一的 api 去调用。但其默认只提供了针对各种媒体格式的解码器(基本上涵盖得比较全了),而编码器默认提供很少的几个开源的格式(或者已经无需专利保护的格式)。所以,如果你需要 FFmpeg 具备支持多种媒体格式的编码能力,你需要额外下载并安装那些编码器(主要是通过安装这些编码器获得它们的头文件、动态库及静态库用于 FFmpeg 编译),才能保证在 FFmpeg 编译时载入这些编码器的二进制代码,使 FFmpeg 具备这些编码功能。经过对比分析,就我这个项目需求而言,基本上编码器需要先额外下载并安装这几个:x264、fdk-aac、libvpx、libvorbis、LAME(mp3)就足够了。
接着,分别下载 x264、fdk-aac、libvpx、libvorbis、LAME 的源代码,然后分别编译安装。注意在执行各自的 configure 创建编译配置文件时,最好都强制带上 --enable-static 和 --enable-shared 参数以确保生成静态库和动态库。另外因为是在 Mac OS X 环境下编译,因此在各自编译完后,都要执行 sudo make install,安装到默认的 /usr/local 目录下相应位置(Mac OS X 下不推荐 /usr),因此不要在 configure 时指定 --prefix,就用默认的 /usr/local 目录前缀即可。
在安装完上述编码器后,就可以开始编译安装 FFmpeg 了。进入 FFmpeg 的源代码目录,执行以下命令:
./configure --prefix=/usr/local --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libmp3lame --enable-libvorbis --enable-libvpx --enable-libx264 --enable-static --enable-shared
make
sudo make install
即可完成编译安装,FFmpeg 的头文件将会复制到 /usr/local/include 下面相应位置,静态库及动态库会被复制到 /usr/local/lib 目录下,FFmpeg 的可执行程序(ffmpeg、ffprobe、ffserver)会被复制到 /usr/local/bin 目录下,这样 FFmpeg 的开发环境就构建好了。补充说明一点,因为默认情况下 Mac OS X 没有 SDL,所以 FFmpeg 编译时检测不到 SDL 支持,就不会编译 ffplay 这个可执行程序了。