一 增加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平。
-
armv6
Phone、iPhone 2、iPhone 3G -
armv7
iPhone 4、iPhone 4S -
armv7s
iPhone 5、iPhone 5S -
arm64
iPhone 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(); // 关闭所有的 资源
};
本文参考音视频开发进阶指南