携手创造,一起生长!这是我参与「日新计划 8 月更文应战」的第31天,点击查看活动概况

文本首要分析在Audio Unit结构中构建音频组件的六种规划形式,需求在不同的场景下选用不同的形式来构建。

1、介绍

上面已经学了各种音频单元,并且设置回调,以及对音频流的操作,接下来就需求挑选规划形式,和进行编码来完成音频功用.

总共有六种形式,每种形式会有相同的特性

  1. 必须有一个I/O单元
  2. 在整个音频处理图中运用音频单元流格局
  3. 在特定位置设置流格局或流格局的某些部分

2、I/O直连形式

示意图:

Audio Unit框架(三)音频组件的六大设计模式

阐明:

  • 直接将音频发送到输出硬件,不进行任何的为音频处理(虽然这没有多大的实用价值,但是基于此形式构建托管的app的音频单元是验证和巩固咱们对音频单元概念的了解的好办法。)
  • 图中能够看到,在输入和输出的向外侧都强制放置了硬件流格局,当咱们指定向内侧运用的流格局,就需求在音频单元需求进行格局转化,咱们知道为了防止不必要的采样率转化,APP内部直接运用硬件采样率
  • 默许情况下是禁止 输入的 element ,因而咱们需求手动开启它。不然,音频无法流动。
  • 在图中所示的形式利用了两个长途I/O 元件之间的音频单元衔接。
  • 具体来说,咱们不需求在音频元件的输入scope 上的output element 设置流格局。衔接传达咱们为input element 指定的格局。
  • 输出元件的朝外侧选用音频输出硬件的流格局,输出元件需求根据对输出音频格局履行格局转化。
  • 无需配置任何的音频数据缓冲区

3、没有烘托回调函数的I/O

示意图:

Audio Unit框架(三)音频组件的六大设计模式

阐明:

  • 在将音频输出前添加一个或多个其他音频单元,能够构建功用更杂乱的APP
  • 例如,咱们能够运用多声道混音器单元将传入的麦克风音频定位在立体声场中或供给输出音量控制。
  • 混音器的音频流格局随着两个单元之间的衔接主动建立传输,不需求咱们人为设置了。除非需求更改格局传达
  • 不需求配置任何的音频数据缓冲区

4、带有烘托回调函数的I/O

示意图:

Audio Unit框架(三)音频组件的六大设计模式

阐明:

  • 在输出流数据前添加烘托回调函数,对音频流进行操作
  • 在一个十分简略的情况下,咱们能够运用烘托回调函数来调整输出音量
  • 咱们还能够进行比方颤音、铃声调制、回声或者其他的作用,能够经过Accelerate结构中的傅里叶变换和积分公式,能够做无穷无尽的事情
  • 将烘托回调函数添加到element0的Input scope,当该元素需求获取下一组音频样本值时,就会调用这个回调函数
  • 反过来,咱们的回调经过调用长途I/O单元的输入element的烘托回调函数来获取新样本
  • 当像这样运用烘托回调函数建立了从一个音频单元到另一个音频单元的音频途径时,回调函数替代了音频单元衔接
  • 与其他I/O 形式相同,咱们必须在长途I/O 单元上开启输入,默许情况下输入是禁止的
  • 并且,关于其他I/O形式,咱们无需求配置任何音频数据缓冲区

5、仅有烘托回调函数的输出

关于游戏音乐和组成器挑选此形式,需求组成声响

示意图:

Audio Unit框架(三)音频组件的六大设计模式

阐明:

  • 简略的是,这种形式规划到一个烘托回调函数,它直接衔接到长途I/O 单元输出element 的 output的 scope

运用相同的形式能够构建具有更杂乱的音频结构的app。 比方当咱们期望生成多个声响,将它们混合在一起,然后经过设备的输出硬件播映他们

Audio Unit框架(三)音频组件的六大设计模式

阐明:

  • 进行不同声响的混合
  • 这儿该形式选用音频处理grahp和两个额外的音频单元,多声道混音器和Ipod EQ
  • 需求留意Ipod EQ 要求咱们在输入和输出上设置完整的流格局。
  • 另一方面,多通道混音器只需求再其输出上设置正确的采样率。
  • 然后,整个流格局由音频单元衔接从混音器的输出传达到长途I/O单元输出单元的input scope。

6、其他的规划形式

仅有烘托回调函数的输入:

  • 录制和分析音频
  • 回调函数由应用程序调用,然后它调用RemoteI/O 单元的input元素的render办法。

留意:

  • 在大多数情况下,像这样的应用程序的更好挑选是运用音频队列目标
  • 运用音频队列目标提高了更大的灵活性,因为他的烘托回调函数不在实时线程上。

通用输出单元:

  • 履行离线音频处理
  • 与长途I/O 单元不同,该音频单元不衔接到设备的音频硬件
  • 当运用它向app发送音频时,它取决于app调用其render 办法