在FFmpeg 简介及iOS端交叉编译一文中介绍了FFmpeg 提供有自己的编解码库,封装了codec层,但是有一些codec是具备自己的License,FFmpeg不会默认集成,例如libx264、FDK_AAC、LAME等,但是FFmpeg就像一个平台,可以将其他的第三方codec以插件的形式添加进来,然后为开发者提供统一的接口。
有同学私信我说能否有详细的编译流程,在此详细介绍一下。
一般情况下,mp4容器封装的视频流编码格式为h264,音频流编码格式为AAC,h264的最佳编解码库为X264,AAC的最佳编解码库为FDK_AAC。因此,整个交叉编译过程实际分为3个部分:交叉编译libx264;交叉编译libfdk_aac;交叉编译FFmpeg。每个编译流程大概分为下载源码、下载并修改编译脚本、交叉编译、合并静态库四个步骤。
其中编译脚本都来源于https://github.com/kewlbear,感谢。
交叉编译libx264
1、下载libx264源码
提供两种形式下载:从官网直接下载或者Git下载,本文都采用官网直接下载。
- 官网下载libx264源码
- Git下载:git clone http://git.videolan.org/git/x264.git
2、下载编译脚本
- 将下载的脚本跟源码放在同一个文件夹下
- 脚本里面源码SOURCE指向x264,因为将源代码的文件夹修改为x264或者修改脚本SOURCE,我采用的修改文件夹名。
- 修改脚本ARCHS,因为支持的ARCHS越多,编译的库就越大,按照项目实际需要配置即可。arm64e有arm64兜底,我们的项目基本都是已armv7s开始,所以我这边配置为ARCHS="arm64 armv7s x86_64",配置改了后需要按照实际情况修改脚本。
- 修改脚本的读写权限 chmod u x ./build-x264.sh
3、执行脚本./build-x264.sh
x264.png
会生成x264-iOS、thin-x264、scratch-x264三个文件夹,其中x264-iOS是合并后的静态库,
可省去第四步合并静态库,如果自己写的脚本最后需要合并静态库。
4、合并静态库
利用lipo命令,将thin-x264对应的各个版本合并成一个,在此不详细讲解,自行百度。
交叉编译libfdk_acc
1、下载fdk-aac源码
2、下载编译脚本
- 将下载的脚本跟源码放在同一个文件夹下
- 修改脚本里面源码SOURCE指向fdk_aac,修改源代码的文件夹修改为fdk_aac
- 修改脚本ARCHS为ARCHS="arm64 armv7s x86_64"
- 切换到fdk_aac目录下,并执行./autogen.sh
- 切换到上一级目录,修改脚本的读写权限 chmod u x ./build-fdk-aac.sh
3、执行脚本./build-fdk-aac.sh
4、执行./build-fdk-aac.sh lipo 命令集成一个lib
交叉编译FFmpeg(包含libx264与libfdk_acc)
注意: 在这里可以仅下载FFmpeg-iOS编译脚本,不用下载源码,执行脚本会自动下载源码,如果不想每次自动下载,可以手动下载源码,稍微修改下FFmpeg编译脚本即可.这里不做过多说明.
1、下载FFmpeg编译脚本,当前(2019.08.13)使用FFmpeg4.2,你可以按照自己的需要在脚本修改FFmpeg版本。
将以上编译的fdk-aac和x264移动到编译脚本下,只需要移动最后一步生成的包含头文件及lib文件的目录。
资源目录.png
- 编辑FFmpeg iOS 编译脚本,取消fdk-aac及x264的注释,并修改路径指向对应的目录
脚本修改.png
- 同libx264、libfdk_acc一样,修改脚本ARCHS为ARCHS="arm64 armv7s x86_64"
- fdk-aac需要添加--enable-nonfree选项,修改CONFIGURE_FLAGS为CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs --disable-doc --enable-pic --enable-nonfree"
3、执行脚本./build-ffmpeg.sh,等待下载和编译。
4、执行./build-ffmpeg.sh lipo 命令集成一个lib,最后生成的FFmpeg-iOS目录即为fat版本,包含我需要的arm64、armv7s以及64位模拟器x86_64。
结束语
- FFmpeg的强大无需多言,FFmpeg的使用在后期会分为Tool调用和API使用两个方向详解。
- iOS集成FFmpeg的流程参考,记得添加依赖: libbz2.tbd libz.tbd libiconv.tbd CoreMedia.framework VideoToolbox.framework AudioToolbox.framework AVFoundation.framework
因为版本在不断更新,每个团队需要支持的ARCHS不同,仅供参考。
Tips:上传到git发现太大了,没上传,需要的私信我。
问题
我再编译FFmpeg后集成fftools出现真机能正常编译,模拟器出现问题,如下图:
D5EF38B4EF452C73909CC48CBA4EAC73.png
两个方法:
- 修改config.h里面的CONFIG_AVDEVICE为#define CONFIG_AVDEVICE 0即可,因为avdevice需要连接sdl2库。
- 在交叉编译前指定不需要avdevice库,即--disable-avdevice。
当然,如果你需要使用ffplay,那必须使用avdevice库,那必须先编译sdl2。
如果喜欢,请帮忙点赞。支持转载,转载请附原文链接。