【Android 高性能音频】AAudio 音频库 简介 ( AAudio 音频库简介 | 音频流 | 音频设备 | 共享模式 | 数据模式 )

2023-03-27 17:30:41 浏览数 (1)

文章目录
  • I . AAudio 音频库 简介
  • II . AAudio 音频流 三要素 ( 设备 | 共享模式 | 数据格式 )
  • III . AAudio 音频设备
  • IV . AAudio 音频设备获取
  • V . AAudio 音频设备 ID 标识
  • VI . AAudio 音频流方向
  • VII . AAudio 音频流 共享模式
  • VIII . AAudio 音频格式 ( 样本格式 | 每帧样本数 | 采样率 )
  • IX . AAudio 音频样本格式转换

I . AAudio 音频库 简介

AAudio 音频库 简介 :

  • ① 开发级别 : AAudio 是在 Android 8.0 版本后引入的音频库 , 该音频库 需要使用 C 语言在 Native 层进行 调用 , 属于 NDK 开发范畴 ;
  • ② 音频库特点 : 该音频库是 Google 专门为高性能音频设计开发的 , 具有低延迟 , 高性能的特点 ;
  • ③ 提供的功能 : AAudio 是轻量级的音频库 , 只提供写入音频流进行发音的功能 , 不负责音频设备管理 , 文件 I / O , 音频编解码 等操作 ;
II . AAudio 音频流 三要素 ( 设备 | 共享模式 | 数据格式 )

1. AAudio 音频流设备 : 数据从耳机输入 , 数据 输出 到发音设备 ;

  • ① 音频输入 ( 声音来源 ) : 从话筒 , 耳机等音频输入设备中 , 采集 音频 数据 , 如果使用 AAudio 音频流读取 , 性能高 , 低延迟 ;
  • ② 音频输出 ( 声音接收 ) : 将音频流写入到 AAudio , AAudio 会以极高性能方式将音频流输出到发音设备中 ;

从输入端获取数据 ( 话筒 -> 音频流 -> 内存 ) , 将音频数据写出到输出端 ( 内存 -> 音频流 -> 发音设备 ) ;

2. 音频流读写数据格式 : 在应用中 , 使用 AAudioStream 结构表示音频流 , 读取 和 写出 音频流数据都使用该数据结构 ;

3. 共享模式 : ① 阻塞方式读写 音频流数据 , ② 非阻塞方式读写 音频流数据 ;

III . AAudio 音频设备

AAudio 音频流与音频设备对应关系 : 每个 AAudio 音频流都需要 与一个音频设备进行关联 , 才能发挥正常作用 ;

音频设备 :

  • ① 真实硬件音频设备 : 这里的音频设备可以是连接到 Android 手机的耳机 , 音箱 , 也可以是内置的 麦克风 话筒等 ;
  • ② 虚拟音频设备 : 音频设备还可以是用软件虚拟出来的音频设备 ;

这里的音频设备 是 AAudio 音频流的 数据来源 ( 话筒 , 麦克风 ) , 或者数据接受者 ( 音箱 , 耳机 ) ;

IV . AAudio 音频设备获取

音频设备获取 :

  • ① 获取方法 : 在开发时 , 调用 AudioManagergetDevices() 方法 , 可以获取当前连接到 Android 系统上的 并且 符合指定的 flag 参数标准 的可用音频设备 ( 如将耳机插入 Android 手机 , 就会获取到耳机音频设备 ) ;
代码语言:javascript复制
public AudioDeviceInfo[] getDevices (int flags)
  • ② 返回值 : 该方法返回音频设备的类型信息 ( AudioDeviceInfo ) 数组 , AudioDeviceInfo 类封装了音频设备的一系列信息 ;
V . AAudio 音频设备 ID 标识

音频设备 ID :

  • ① 唯一标识 : Android 的音频设备都有一个独一无二的 ID 标识 ;
  • ② AAudio 与 音频设备绑定 : 使用该 ID 标识 , 可以将该音频设备与 AAudio 音频流进行绑定 ;
  • ③ 默认设备 : 大部分情况下 , AAudio 都有一个默认的输入 ( 麦克风 ) 和 输出 ( 外放喇叭 ) 设备 ;
VI . AAudio 音频流方向

AAudio 音频流方向 : AAudio 音频流 只能设置一个方向 , 输入 或者 输出 ;

  • ① 音频设备方向 :
    • a . 音频输入设备 : 如 麦克风 , 话筒等 , 其音频流是从 音频设备 -> 内存 ;
    • b . 音频输出设备 : 如 耳机 , 音箱 , 其音频流方向是从 内存 -> 音频设备 ;
  • ② 设置方向 : 在创建 AAudio 音频流时 , 需要指定该音频流的方向 ;
  • ③ 检查方向 : 在打开 AAudio 音频流时 , Android 会检查该音频流方向 与 音频设备的音频流方向是否一致 ;
VII . AAudio 音频流 共享模式

1. AAudio 音频流 共享模式 : 分两种 , 独占模式 ( AAUDIO_SHARING_MODE_EXCLUSIVE ) 和 混合模式 ( AAUDIO_SHARING_MODE_SHARED ) ;

  • ① 独占模式 : 该模式下 , 音频流 独占 音频设备 , 此时其它音频流无法访问该 音频设备 ;
  • ② 混合模式 : 该模式下 , 允许 AAudio 音频流 与 其它音频流 混合 , 音频设备播放多个流混合后的采样 ;

2. 独占模式说明 :

  • ① 拒接访问 : 如果音频设备当前处于正在使用中的状态 , AAudio 音频流此时无法对其进行独占模式下的访问 ;
  • ② 延迟低 : 在独占模式下 , 音频流的延迟比较低 , 性能较高 ;
  • ③ 及时释放资源 : 如果不需要独占音频设备 , 及时将其释放 ;
VIII . AAudio 音频格式 ( 样本格式 | 每帧样本数 | 采样率 )

AAudio 音频格式 :

  • ① 样本格式 : 每个样本的表示方式 ;
    • a . AAUDIO_FORMAT_PCM_I16 : 数据类型是 int16_t , 表示每个样本由 2 个字节组成 ;
    • b . AAUDIO_FORMAT_PCM_FLOAT : 数据类型 float , 表示样本由浮点型数据表示 , 其取值范围 -1.0 ~ 1.0 ;
  • ② 每帧采样数 : 每帧的采样个数 ;
  • ③ 采样率 : 1秒钟 音频的 的采样个数 , 单位是 赫兹 ( Hz ) , 如 44100Hz , 代表一秒钟有 44100 个采样 ;
  • ④ 获取音频流样本格式 : 调用 AAudioStream_getDataFormat 方法 , 可以获取 AAudio 音频流格式 ; 其结果可能是 AAUDIO_FORMAT_PCM_I16 或 AAUDIO_FORMAT_PCM_FLOAT ;
代码语言:javascript复制
aaudio_format_t dataFormat = AAudioStream_getDataFormat(stream);

如 : 一个 PCM 音频流 , 16 bit 代表其每个样本有 16 位 ( 2 字节 ) , 44100 采样率 代表每秒钟有 44100 个样本 ;

IX . AAudio 音频样本格式转换

AAudio 样本格式转换 :

  • ① 类型转换 : AAudio 可以根据音频设备的类型自动转换样本的类型 , 如 HAL 层使用的音频样本是 16 位的 , 如果输入 浮点型样本类型 , 会自动转换成 16bit 类型的样本 ;
  • ② 转换方向 : 输入 输出 方向 其样本格式 都可以自动转换 ;

0 人点赞