前篇音视频入门记录了我对音视频的一些基础理解。现在将我在交叉编译ffmpeg之前的一些准备工作记录一下。
本文记录fdk-aac的交叉编译,首先需要说明几个问题:
基本概念
交叉编译:有过移动开发经验或者嵌入式开发经验的对这个行为应该是非常熟悉的,所谓交叉编译就是在平台A(比如电脑)上利用提供的编译链工具编译出能够运行在平台B(比如手机)的代码的整个过程。iOS提供的编译工具链就是xcode。
fdk-aac:fdk-aac是实现了aac音频编码标准的代码库,还有很多其他实现了aac标准的代码库,综合来说fdk-aac是比较好的一种实现,ffmpeg通过调用实现了aac标准的代码库来完成对音频的编解码,因此ffmpeg本身并不包含有对音频编解码的能力。它只实现对外的统一接口,内部还是需要添加相应的编解码库来完成相应操作。
交叉编译流程
首先从网址下载最新版本的fdk-aac:https://sourceforge.net/projects/opencore-amr/files/fdk-aac/
然后将相应文件解压。之后通过终端(terminal)使用cd命令进入解压后对应的文件夹。假设目前解压文件夹路径为/Users/arceushs/fdkaac
cd /Users/arceushs/fdkaac
在fdkaac文件夹内有一个configure的可执行程序,按照unix的编译流程标准,为configure配上一定的命令选项可以直接生成makefile(表明源代码文件之间的依赖关系),然后使用make命令依照makefile进行编译,最后使用make install进行安装到具体的位置。后面两步都是比较固定的,因此主要的问题其实在于configure的命令选项,使用怎么样的命令选项才能得到我们想要的功能对应的makefile。这里写一下使用的命令选项(网上有很多直接给脚本文件的,实际上最终都是运行出这些命令选项,而脚本文件其实都增大了理解的难度):
./configure \ // \为换行连接符
--enable-static \ //编译为静态库
--disable-shared \ //关闭动态库
--host=aarch64-apple-darwin \ //编译到平台arm64 一定要写成aarch64,还有arm/i386等
CC="xcrun -sdk iphoneos clang" \ //c编译器 xcrun -sdk iphoneos clang实际上是一个具体的路径地址,代表了clang的位置。可以直接在mac终端运行或者打印出对应的位置,如果没有可以使用xcode-select --install安装,实际上这个命令就是安装使用命令行控制xcode的工具。
CXX="xcrun -sdk iphoneos clang" \ //c++编译器
CPP="xcrun -sdk iphoneos clang -E" \ //c预编译器
AS="xcrun -sdk iphoneos clang" \ //汇编器
CFLAGS="-arch arm64 -fembed-bitcode" \ //c编译器标志选项
LDFLAGS="-arch arm64 -fembed-bitcode" \ //链接标志选项
CPPFLAGS="-arch arm64 -fembed-bitcode" \ //c预编译器标志选项
--prefix="/Users/qingting/Desktop/fdk-aac-0.1.6/output/arm64" // 最终安装到的文件目录 注意fdk这个路径貌似必须是绝对路径,暂时还没有找到为什么
完成以后就可以在目录中/Users/qingting/Desktop/fdk-aac-0.1.6/output/arm64看到编译得到的.a文件以及.h文件