携手创作,一起生长!这是我参加「日新方案 8 月更文挑战」的第29天,点击查看活动概况

Audio Unit是一个音频处理插件。它是为应用程序增加杂乱的音频操作和处理的底层的API。本文主要知道Audio Unit的原理和简略运用

主要内容:

  1. 音频单元
  2. Audio Unit运用
  3. audio processing graph
  4. 回调函数

1. 知道

Audio Unit是一个音频处理插件。它是为应用程序增加杂乱的音频操作和处理的底层的API。一切的音频技能都是构建在这个结构之上的。支持混合、均衡、格局转换,用于录制、回放、离线烘托和实时对话的实时输入输出,流入VoIP(互联网协议语言)。

功用介绍:

  1. 具有低延时的实时I/O,1)如VoIP(互联网语音协议)应用程序
  2. 组成声音,进行回放,例如音乐游戏或组成乐器
  3. 一些特别的功用,比方回声消除,均衡、混音
  4. 处理链架构,可将音频处理模块拼装到灵活的网络中,

优势:

  1. 超卓的呼应才能:音频单元烘托的回调函数中运用的是实时优先线程,所以呼应才能十分超卓
  2. 动态重新装备:音频处理图的API允许咱们以线程安全的方式动态拼装,重新装备和重新排列杂乱的音频处理链,同时处理音频

音频单元的生命周期:

  1. 运行时,获取对动态可链接库的引用
  2. 实例化音频单元
  3. 装备音频单元
  4. 初始化音频单元以运用
  5. 操作音频单元
  6. 取消分配音频单元

2. 音频单元

Audio Unit都是有音频单元组成的,这儿先知道音频单元。

2.1 分类

共有七个音频单元,分为四大类。

Audio Unit框架(一)框架认识和使用

  • Effect Unit
    • 作用单元,也便是iPod均衡器,对音频数据进行音效处理
  • Mixing Unit
    • 混音器单元,能够将不同的音频混合到一起输出
    • 3D Minxer Unit
      • 能够完成3D混音作用功用,是构建OpenAL的根底,一般完成3D混音都是运用OpenAL
    • MutilChannel Minxer Unit
      • 完成多通道混音作用
      • 为恣意数量的多通道或立体声流供给立体声输出
  • I/O Unit
    • Remote I/O 长途I/O单元
      • 衔接输入输出硬件设备的
    • voice-processing I/O Unit语音处理I/O单元
      • 对语音进行处理,比方能够进行回声消除,供给自动增益校正,语音处理质量调整和静音。
    • Generic Output Unit 通用输出单元
      • 这个输出不衔接设备,在处理链中直接发到应用程序中,一般用来进行离线的音频操作
  • Format conversion Unit
    • 格局转换组件,运用在Remote I/O Unit中,将硬件的音频格局转换成应用程序的音频格局

2.2 组件的基本特征

Audio Unit框架(一)框架认识和使用

阐明:

  • I/O音频单元包含输入音频组件和输出音频组件
  • 包含输入输出scope,包含输入输出element

3. 简略运用

在iOS中供给了两种API,都能够进行操作,一种是直接操作Audio Unit,一种是操作Audio Processing Graph(在下文讲解)

Audio Unit是在Audio Processing Graph的上下文环境中工作的

进程示例:

Audio Unit框架(一)框架认识和使用

3.1 创立音频组件描述

Audio Unit框架(一)框架认识和使用

阐明:

  • 它是用来创立不同类型的音频组件的
  • 音频组件描述中的参数能够在官网中查找

3.2 创立音频单元

Audio Unit框架(一)框架认识和使用

阐明:

  1. 初始化音频组件
  2. 界说音频组件描述
  3. 获取音频组件的引用
  4. 实例化音频组件

3.3 设置音频单元的特色

给音频组件设置scope、element设置特色,比方音频流的格局,比方回调函数设置等。

特色是一个键值对,键是体系已经界说好的数值,值是相应的特定类型

常用办法:

  • AudioUnitGetPropertyInfo,查看特色是否可用
  • AudioUnitGetProperty,得到该特色
  • AudioUnitSetProperty,设置特色
  • AudioUnitAddPropertyListener,增加监听
  • AudioUnitRemovePropertyListnerWithUserData,移除监听

Audio Unit框架(一)框架认识和使用

阐明:

  • 这儿表示给scope的element设置了一个流格局特色,特色的值是&audioFormat
  • AudioUnitSetPropety一次只能设置一个特色
  • 设置特色能够设置给scope,也能够设置给element

指定音频单元的部件:

音频单元是由scope和element组成的,所以想要操作音频单元,需求指定标识符

Audio Unit框架(一)框架认识和使用

阐明:

  1. scope
    1. kAudioUnitScope_Global :1)作用于整个音频单元,不作用音频流;2)只有一个element0元素
    2. kAudioUnitScope_Input和kAudioUnitScope_Output:作用在输入输出scope的元素称为bus,总线
  2. element
    1. element是作用在scope的,是嵌套在scope的编程上下文
  3. 联系
    1. 特色能够作用于element,也能够作用于scope
    2. 一个scope能够有多个element,同一个element能够存在于多个scope

注意:

千万千万要注意的一点是:这儿是经过element是否是输入还是输出来决议这个I/O单元是用来输入还是输出的,而不是经过scope来决议的。

3.4 设置音频单元的参数

参数是用户可调理的设置,能够在音频单元正在发生音频时改动的参数。

参数也是一个键值对,key是体系已经界说好的数值,value也是数值

常用办法:

  • AudioUnitGetParameter得到参数
  • AudioUnitSetParameter设置参数

4. audio processing graph

音频处理图能够用来构建和办理音频单元处理链,它能够运用多个音频单元,和完成多个烘托回调函数,允许咱们创立几乎任何咱们能想象的音频处理解决方案。

特色:

  • 线程安全
    • 咱们重新装备处理图时,音频处理图的API会将装备的音频单元增加到稍后要履行的更改列表中,当指定完一切的更改集后,就能够请求Graph装备他们了,这样就线程安全了。
  • 音频处理图总是会有一个完好的I/O单元
  • 能够动态的重新分配处理链
    • 能够安全的插入AUNode
    • 能够在播映音频时交换不同的烘托回调函数

AUNode的知道:

  • 音频处理图是办理AUNode的,AUNode是链的节点,作为音频单元的署理
  • 它能够看做是音频单元,但是假如要设置音频单元,还有必要直接装备音频单元,AUNode自身是不能够装备的

简略进程:

  1. 将node增加到Graph中
  2. 直接装备由node装备的音频单元
  3. 互联node

代码完成:

Audio Unit框架(一)框架认识和使用

互联Node的常用办法:

  • 增加或许删去音频单元node(AUGraphAddNode, AUGraphRemoveNode)
  • 增加或许删去node之间的衔接(AUGraphConnectNodeInput, AUGraphDisconnectNodeInput)
  • 将烘托回调函数衔接到音频单元的input bus(AUGraphSetNodeInputCallback)

5. 回调函数

5.1 音频流数据的获取

音频流程图:

Audio Unit框架(一)框架认识和使用

阐明:

  • 灰色箭头是调用函数的方向
  • 橙色箭头是函数回来的音频数据的方向
  • 初始的音频数据是音频帧(frame)
  • 函数回调履行完回来的音频数据是切片(slice)

进程详解:

  1. AUGraphStart函数去获取音频时,首先会直接在输出element的缓冲区中找音频数据
  2. 假如有,则直接输出,假如没有则调用衔接到输入的回调函数,也便是它会调用这个绑定输入的函数
  3. 此时进入到均衡器组件,获取数据,发现也没有,就再调用输入的回调函数
  4. 此时就从应用内部获取到音频帧
  5. 拿到音频帧后就一步一步的履行回调函数并回来音频数据,也便是切片(slice)

5.2 回调函数代码完成

注释已满足详细

Audio Unit框架(一)框架认识和使用

注意:

  • 千万要注意,回调函数有必要恪守严厉的性能要求
  • 回调函数是异步履行的,假如这个函数履行耗时太长,下一个函数已经到达,这个函数尚未完成履行,那么就会导致声音发生空隙

参阅文档:

官方文档