一 增加C++支持
其中预定义变量$ (SRCROOT)和$(PROJECT_DIR)都是项目的根目录。
二 交叉编译的原理
使用本机器的编译器,将源代码编译链接成为 一个可以在本机器上运行的程序。这就是正常的编译过程,也称为 Native Compilation,中文译作本机编译。
所谓交叉编译,就是在一个平台(如PC)上生成另外一个平台(Android、iOS或者其他嵌入式设备)的可执行代码。
交叉工具编译链,通过该交叉工具编译链,开发者就能在 PC上编译出可以运行在ARM平台下的程序了。
无论是自行安装PC上的编译器,还是下载其他平台(Android或者 iOS)的交叉工具编译链,它们都会提供以下几个工具:CC、AS、 AR、LD、NM、GDB。那么,这几个工具到底是做什么用的呢?
-
CC编译器,对C源文件进行编译处理,生成汇编文件。 -
AS将汇编文件生成目标文件(汇编文件使用的是指令助记符,AS将它翻译成机器码)。 -
AR打包器,用于库操作,可以通过该工具从一个库中删除或者增加目标代码模块。 -
LD链接器,为前面生成的目标代码分配地址空间,将多个目标文件链接成一个库或者是可执行文件。 -
GDB调试工具,可以对运行过程中的程序进行代码调试工作。 -
STRIP以最终生成的可执行文件或者库文件作为输入,然后消除掉其中的源码。 -
NM查看静态库文件中的符号表。 -
Objdump查看静态库或者动态库的方法签名。
2.1 iOS平台交叉编译的实践
前面提到的目标平台虽然都基于ARM平。
-
armv6Phone、iPhone 2、iPhone 3G -
armv7iPhone 4、iPhone 4S -
armv7siPhone 5、iPhone 5S -
arm64iPhone 5S、iPhone 6(P)、iPhone 6S(P)、iPhone 7(P)
- 机器对指令集的支持是向下兼容的。
-
Architectures指的是该App支持的指令集 -
Valid architectures选项指即将编译的指令集 -
Build Active Architecture Only选项表示是否只编译当前适用的指令集。一般情况下 在Debug的时候设置为YES,以便可以更加快速、高效地调试程序,而 在Release的情况下设置为NO,以便App在各个机器上都能够以最高效 率运行。因为Valid architectures选择的对应指令集是armv7、armv7s和arm64,在Release下会为各个指令集编译对应的代码,因此最后的ipa体 积基本上翻了3倍。
2.2 LAME的交叉编译
LAME是目前非常优秀的一种MP3 编码引擎,在业界,转码成MP3格式的音频文件时,最常用的编码器就是LAME库。
bitcode模式是表明当开发者提交应用(App)到App Store上的时 候,Xcode会将程序编译为一个中间表现形式(bitcode)。
合并静态库应该使用lipo命令。
2.3 FDK_AAC的交叉编译
FDK_AAC是用来编码和解码 AAC格式音频文件的开源库,Android系统编码和解码AAC所用的就是这个库。
2.4 X264的交叉编译
X264是一个开源的H.264/MPEG-4 AVC视频编码函数库,是最好的 有损视频编码器之一。一般的输入是视频帧的YUV表示,输出是编码之后的H264的数据包,并且支持CBR、VBR模式,可以在编码的过程中 直接改变码率的设置。
-
CBR的英文全称是Constant Bit Rate固定码率,就是说每一秒种的画面如果看做是一个静止的图片文件的话(实际上是每一帧的画面大小加起来)它大小是固定的。 -
VBR的英文全称是Variable Bit Rate可变码率,就是每一秒画面的大小是不固定。
三 使用LAME编码MP3文件
3.1 编码工具类的编写
提供一个encode方法,负责读取PCM数据,并且调用LAME进行编码,然后将编码之后的数据写入文件。
class Mp3Encoder {
private:
FILE* pcmFile; // 输入pcm数据文件地址
FILE* mp3File; // 输出mp3文件地址
lame_t lameClient; // LAME
public:
Mp3Encoder();
~Mp3Encoder();
// 初始化
int Init(const char* pcmFilePath, const char *mp3FilePath, int sampleRate, int channels, int bitRate);
void Encode(); // 负责读取PCM数据,并且调用 LAME进行编码,然后将编码之后的数据写入文件
void Destory(); // 关闭所有的 资源
};
本文参考音视频开发进阶指南