在iOS平台上,所有的音频框架底层都是基于AudioUnit实现的。较高层次的音频框架包括: Media Player、 AV Foundation、OpenAL和Audio Toolbox,这些框架都封装了AudioUnit,然后提供了更高层次的API(功能更少,职责更单一的接口)。

当开发者在开发音视频相关产品的时候,如果对音视频需要更高程度的控制、性能以及灵活性,或者想要使用一些特殊功能(回声消除)的时候,可以直接使用AudioUnit API。苹果官方文档中描述,AudioUnit提供了音频快速的模块化处理,如果是在以下场景中,更适合使用AudioUnit而不是使用高层次的音频框架。
想使用低延迟的音频I/O(input或者output),比如说在VoIP的应用场景下。
多路声音的合成并且回放,比如游戏或者音乐合成乐器的应用。
使用AudioUnit里面提供的特有功能,比如:回声消除、Mix两轨音频,以及均衡器、压缩器、混响器等效果器。
需要图状结构来处理音频,可以将音频处理模块组装到灵活的图状结构中,苹果公司为音频开发者提供了这种API。
构建AudioUnit的时候需要制定类型(Type)、子类型(subtype)以及厂商(Manufacture).类型(Type)就是四大类型的AudioUnit的Type;而子类型(subtype)就是该大类型下面的子类型(比如Effect该大类型下面有EQ、Compressor、limiter等子类型);厂商(Manufacture)一般情况下比较固定,直接写成kAudioUnitManufacturer_Apple就可以了。利用以上这三个变量开发者可以完整描述出一个AudioUnit了,比如使用下面的代码创建一个RemoteIO类型的AudioUnit:
AudioComponentDescription ioUnitDescription;
ioUnitDescription.componentType = kAudioUnitType_Output;
ioUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;
ioUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
ioUnitDescription.componentFlags = 0;
ioUnitDescription.componentFlagsMask = 0;复制代码
上诉代码构造了RemoteIO类型的AudioUnit描述的结构体,那么如何使用这个描述来构造真正的AudioUnit呢?有两种方式:第一种方式是直接使用AudioUnit裸的创建方式;第二种方式是使用AUGraph和AUNode(其实一个AUNode就是对AudioUnit的封装)来构建。下面就来分别介绍这两种方式。
(1) 裸创建方式
首先根据AudioUnit的描述,找出实际的AudioUnit类型:
AudioComponent ioUnitRef = AudioComponentFindNext(NULL,&ioUnitDescription);复制代码
然后声明一个AudioUnit引用:
AudioUnit ioUnitInstance;复制代码
最后根据类型创建这个AudioUnit实例:
AudioConponentInstanceNew(isUnitRef,&ioUnitInstance);复制代码
(2) AUGraph创建方式
首先声明并且实例化一个AUGraph:
AUGraph processingGraph;
NewAUGraph(&processingGraph);复制代码
然后按照AudioUnit的描述在AUGraph中添加了一个AUNode:
AUNode ioN