一、环境配置
- ffmpeg4.1下载
直接从官网下载源码压缩包:http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2,没有从git下载是因为官方发布压缩包的应该是稳定版。 - 安装yasm
直接brew install yasm
即可。 - 编译脚本
从https://github.com/kewlbear/FFmpeg-iOS-build-script.git下载编译脚本。kewlbear上还有编译成framework的脚本,而且还有x264、fdk-aac的编译脚本。
二、编译设置
1. 编译
我选择的是编译成静态库,所以使用build-ffmpeg.sh
。
把编译脚本放到ffmpeg源码的上一级目录,编辑脚本把FF_VERSION
改成你的ffmpeg版本,选择执行以下命令编译想要的平台版本,没带参数编译所有平台版本。
./build-ffmpeg.sh
./build-ffmpeg.sh arm64
./build-ffmpeg.sh armv7 x86_64
编译完成,在当前脚本目录下有个scratch
目录存放了编译时的临时文件,thin
目录下是每个不同平台的版本。
如果想合并多个平台版本,执行:
./build-ffmpeg.sh lipo
合并后的文件存放在FFmpeg-iOS/lib
目录下,同时include头文件目录也会复制在下面。
2. ffmpeg config配置
脚本中有个变量CONFIGURE_FLAGS
就是ffmpeg的configure配置,在这儿修改可以定制自己想要的功能。
比如我只想要简单的h264解码功能:
CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs \
--disable-doc --enable-pic --disable-encoders --disable-decoders \
--enable-decoder=h264 --disable-avdevice --disable-avfilter --disable-network \
--disable-demuxers --disable-muxers --disable-protocols --disable-parsers --disable-parser=h264"
这样编译出来的lib库只需要libavcodec.a
和libavutil.a
即可使用h264解码。
编译x264
从[官网https://www.videolan.org/developers/x264.html]直接下载最新版源码。
从https://github.com/kewlbear/x264-ios下载编译脚本build-x264.sh
。
把源码解压到x264目录,把编译脚本build-x264.sh
放到x264同级目录,根据需要编译的archs修改脚本。
因为上面编译ffmpeg时已经安装过yasm,所以执行./build-x264.sh
即可。
编译fdk-aac
从[官网http://www.linuxfromscratch.org/blfs/view/svn/multimedia/fdk-aac.html]直接下载最新版源码(当前2.0.0)。
从https://github.com/kewlbear/fdk-aac-build-script-for-iOS下载编译脚本build-fdk-aac.sh
。
把源码解压,把编译脚本http://build-fdk-aac.sh
放到解压出来的fdk-aac-2.0.0
同级目录,根据需要编译的archs
及fdk-aac源码目录修改脚本。
因为上面编译ffmpeg时已经安装过yasm,所以执行./build-fdk-aac.sh
即可。
ffmpeg+x264+fdk-aac
修改build-ffmpeg.sh
:
#X264=`pwd`/fat-x264`
X264=`pwd`/x264-iOS
#FDK_AAC=`pwd`/fdk-aac/fdk-aac-ios`
FDK_AAC=`pwd`/fdk-aac-ios
CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs \
--disable-doc --enable-pic --enable-nonfree"
fdk-aac需要添加--enable-nonfree
选项。
执行./build-ffmpeg.sh
。
其他编译问题
有时在编译过后又修改了
build-ffmpeg.sh
脚本会导致编译结果很奇怪,这时把scratch
目录删除重新编译。xcode中使用时编译错误:
Undefined symbols for architecture arm64:
"_BZ2_bzDecompressInit", referenced from:
_matroska_decode_buffer in URTC(matroskadec.o)
"_BZ2_bzDecompress", referenced from:
_matroska_decode_buffer in URTC(matroskadec.o)
"_BZ2_bzDecompressEnd", referenced from:
_matroska_decode_buffer in URTC(matroskadec.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决办法:
xcode->Build Phases->Link Binary With Libraies中添加:libbz2.tbd
使用
把编译好的FFmpeg-iOS
、x264-iOS
、fdk-aac-ios
拖到xcode中,如果是swift工程,使用时要先创建桥接文件,在xcode直接随便新建一个c文件,会提示是否自动创建桥接文件,选择创建,然后就可以把这个临时c文件删除。
在桥接文件xxx-Bridging-Header.h
中添加`#include "libavformat/avformat.h"就可以使用ffmpeg。