Audio Unit 学习笔记 | 基础

Audio Unit 学习笔记 | 基础

概述

iOS系统对音频处理做了三层封装,包括应用层、服务层和硬件层。如下图所示:

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

img

虽然 AV Foundation 和 Audio Toolbox 提供的 API 已经能大致满足我们平常开发音视频应用所需,但是与前两者相比较,Audio Unit 主要有两大优势:

  1. 时效性高,Audio Unit 是接近硬件层导致对音频流的采集回调更加迅速,还可以直接合成乐器音,实时同步语音。
  2. 动态的重新配置:围绕 AUGraph opaque 类型构建的 audio processing graph API 允许以线程安全的方式动态组装,重新配置和重新排列复杂的音频处理链,同时处理音频。这是 iOS 中唯一提供此功能的音频 API。

基本概念

Audio Unit 主要涉及到三个常用的概念知识:

  1. AUGraph:包含和管理 Audio Unit 的组织者;
  2. AUNode/AudioComponent:AUGraph 音频处理环节中的一个节点。
  3. AudioUnit:音频处理组件,是对音频处理节点的实例描述者和操控者。

三者的关系:

我们不妨想像演唱会的舞台上,有录制歌声与乐器的麦克风,而从麦克风到输出到音响之间,还串接了大大小小的效果器。在这个过程中,无论是麦克风、音响或是效果器,都是不同的 AUNode。AUNode 是这些器材的实体,而我们要操控这些器材、改变这些器材的效果属性,就会需要透过每个器材各自的操控界面,这些界面便是 AudioUnit,最后构成整个舞台,便是 AUGraph。AUNode 与AudioComponent 的差别在于,其实像上面讲到的各种器材,除了可以放在 AUGraph 使用之外,也可以单独使用,比方说我们有台音响,我们除了把音响放在舞台上使用外,也可以单独拿这台音响输出音乐。当我们要在 AUGraph 中使用某个器材,我们就要使用 AUNode 这种形态,单独使用时,就使用AudioComponent。但无论是操作 AUNode 或 AudioComponent,都还是得透过 AudioUnit 这一层操作界面。

下图所示两路音频数据首先经过均衡器单元,然后再经过混音单元组合在一起,最后经由输入输出单元传输到到扬声器。

img

生命周期

  1. 运行时,获取对动态可链接库的引用,该库定义了 Audio Unit。
  2. 新建一个 Audio Unit 实例。
  3. 根据需求配置这个 Audio Unit 实例。
  4. 初始化 Audio Unit 实例已准备处理音频。
  5. 开启 Audio Unit。
  6. 控制 Audio Unit。
  7. 用完后释放 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。
类型componentTypekAudioUnitType_Effect
均衡器kAudioUnitType_EffectkAudioUnitSubType_AUiPodEQ
混音kAudioUnitType_MixerkAudioUnitSubType_AU3DMixerEmbedded(多路)、kAudioUnitSubType_MultiChannelMixer(混音)
输入输出kAudioUnitType_OutputkAudioUnitSubType_RemoteIO(远端)、kAudioUnitSubType_VoiceProcessingIO(语音处理)、kAudioUnitSubType_GenericOutput(通用输出)
格式转换kAudioUnitType_FormatConverterkAudioUnitSubType_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 间接使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值