音视频

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

2022-09-02  本文已影响0人  iOS之文一

音视频开发:OpenGL + OpenGL ES + Metal 系列文章汇总

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 分类

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

分类

2.2 组件的基本特征

特征

说明:

3. 简单使用

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

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

过程示例:

过程示例

3.1 创建音频组件描述

创建音频组件描述

说明:

3.2 创建音频单元

创建音频单元

说明:

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

3.3 设置音频单元的属性

给音频组件设置scope、element设置属性,比如音频流的格式,比如回调函数设置等。

属性是一个键值对,键是系统已经定义好的数值,值是相应的特定类型

常用方法:

[图片上传失败...(image-dfb5d9-1661917557622)]

设置音频单元的属性

说明:

指定音频单元的部件:

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

说明:

  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也是数值

常用方法:

4. audio processing graph

音频处理图可以用来构建和管理音频单元处理链,它可以使用多个音频单元,和实现多个渲染回调函数,允许我们创建几乎任何我们能想象的音频处理解决方案。

特点:

AUNode的认识:

简单过程:

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

代码实现:

互联Node的常用方法:

5. 回调函数

5.1 音频流数据的获取

音频流程图:

说明:

过程详解:

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

5.2 回调函数代码实现

注释已足够详细

注意:

参考文档:

官方文档

上一篇下一篇

猜你喜欢

热点阅读