Audio Unit 学习笔记 | 基础
Audio Unit 学习笔记 | 基础
概述
iOS系统对音频处理做了三层封装,包括应用层、服务层和硬件层。如下图所示:

Audio Unit 位于服务层,几乎可以认为是对硬件驱动层的封装。Audio Unit 提供了更快、模块化的音频处理,同时提供了强大的个性化功能,如立体声声像、混音、音量控制和音频电平测量。如果想充分使用它的功能,必须深入了解包括音频数据流格式、回调函数和音频单元架构等基础知识。

虽然 AV Foundation 和 Audio Toolbox 提供的 API 已经能大致满足我们平常开发音视频应用所需,但是与前两者相比较,Audio Unit 主要有两大优势:
- 时效性高,Audio Unit 是接近硬件层导致对音频流的采集回调更加迅速,还可以直接合成乐器音,实时同步语音。
- 动态的重新配置:围绕 AUGraph opaque 类型构建的 audio processing graph API 允许以线程安全的方式动态组装,重新配置和重新排列复杂的音频处理链,同时处理音频。这是 iOS 中唯一提供此功能的音频 API。
基本概念
Audio Unit 主要涉及到三个常用的概念知识:
- AUGraph:包含和管理 Audio Unit 的组织者;
- AUNode/AudioComponent:AUGraph 音频处理环节中的一个节点。
- AudioUnit:音频处理组件,是对音频处理节点的实例描述者和操控者。
三者的关系:
我们不妨想像演唱会的舞台上,有录制歌声与乐器的麦克风,而从麦克风到输出到音响之间,还串接了大大小小的效果器。在这个过程中,无论是麦克风、音响或是效果器,都是不同的 AUNode。AUNode 是这些器材的实体,而我们要操控这些器材、改变这些器材的效果属性,就会需要透过每个器材各自的操控界面,这些界面便是 AudioUnit,最后构成整个舞台,便是 AUGraph。AUNode 与AudioComponent 的差别在于,其实像上面讲到的各种器材,除了可以放在 AUGraph 使用之外,也可以单独使用,比方说我们有台音响,我们除了把音响放在舞台上使用外,也可以单独拿这台音响输出音乐。当我们要在 AUGraph 中使用某个器材,我们就要使用 AUNode 这种形态,单独使用时,就使用AudioComponent。但无论是操作 AUNode 或 AudioComponent,都还是得透过 AudioUnit 这一层操作界面。
下图所示两路音频数据首先经过均衡器单元,然后再经过混音单元组合在一起,最后经由输入输出单元传输到到扬声器。

生命周期
- 运行时,获取对动态可链接库的引用,该库定义了 Audio Unit。
- 新建一个 Audio Unit 实例。
- 根据需求配置这个 Audio Unit 实例。
- 初始化 Audio Unit 实例已准备处理音频。
- 开启 Audio Unit。
- 控制 Audio Unit。
- 用完后释放 Audio Unit。
AudioUnit 类型
iOS提供了 4 大类别、7 种不同的 AuidoUnit。结构体 AudioComponentDescription 用来描述一个具体的AudioUnit:
typedef struct AudioComponentDescription {
OSType componentType;
OSType componentSubType;
OSType componentManufacturer;
UInt32 componentFlags;
UInt32 componentFlagsMask;
} AudioComponentDescription;
其中:
- componentType:AuidoUnit 类型,主要有四种:均衡器、混音、输入输出、格式转换。
- componentSubType:四大类型对应的子类型,可以对照下面的表。
- componentManufacturer:目前 iOS 开发中只有 kAudioUnitManufacturer_Apple。
- componentFlags:一般设置为 0。
- componentFlagsMask:一般设置为 0。
类型 | componentType | kAudioUnitType_Effect |
---|---|---|
均衡器 | kAudioUnitType_Effect | kAudioUnitSubType_AUiPodEQ |
混音 | kAudioUnitType_Mixer | kAudioUnitSubType_AU3DMixerEmbedded(多路)、kAudioUnitSubType_MultiChannelMixer(混音) |
输入输出 | kAudioUnitType_Output | kAudioUnitSubType_RemoteIO(远端)、kAudioUnitSubType_VoiceProcessingIO(语音处理)、kAudioUnitSubType_GenericOutput(通用输出) |
格式转换 | kAudioUnitType_FormatConverter | kAudioUnitSubType_AUConverter |
-
均衡器(Effect Unit):提供一组预设均衡曲线,如重低音、流行音等等。
-
混音(Mixer Units):
-
3D Mixer unit:OpenAL 构建的基础,如果需要 3D Mixer Unit 特性,建议直接使用 OpenAL,因为它提供了很多封装好的功能强大的 API。
-
Multichannel Mixer unit:为一个或多个声道的声音提供混音功能,以立体声输出。可以单独打开或关闭其中一个声道的声音、调节音量、快进快退等。
-
-
输入输出(I/O Units):
-
Remote I/O unit:直接连接输入、输出的音频硬件,以低延迟的方式访问单个接收或发出的音频采样点,提供了格式转换功能。
-
Voice-Processing I/O:通过声学的回声消除拓展了Remote I/O unit,常用于VoIP或语音通信的应用。它还提供了自动增益校正、语音处理质量调整和静音等功能。
-
Generic Output unit:不连接音频硬件而是提供了一种机制,将处理链的输出传递给应用程序,通常用来做离线音频处理。
-
-
格式转换(Format Converter Unit):通常通过 I/O unit 间接使用。