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

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

文章目录

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 音频设备获取


音频设备获取 :


① 获取方法 : 在开发时 , 调用 AudioManager 的 getDevices() 方法 , 可以获取当前连接到 Android 系统上的 并且 符合指定的 flag 参数标准 的可用音频设备 ( 如将耳机插入 Android 手机 , 就会获取到耳机音频设备 ) ;

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 ;

aaudio_format_t dataFormat = AAudioStream_getDataFormat(stream);


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




IX . AAudio 音频样本格式转换


AAudio 样本格式转换 :


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

② 转换方向 : 输入 输出 方向 其样本格式 都可以自动转换 ;


目录
相关文章
|
1月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
143 0
|
1月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
108 1
|
1月前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
1月前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
1月前
|
Android开发 Kotlin
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【本地】音频,播放完随机播放下一首,遇到播放错误,也自动播放下一首
使用Kotlin和Jetpack Compose开发的安卓应用中,实现了两个EvoPlayer同时播放res/raw目录下的音频。一个音轨播放人声(顺序播放),另一个播放背景音乐(随机播放)。每个音轨都有独立的播放和停止控制,且在播放结束或遇到错误时会自动切换到下一首。MediaPlayer置于ViewModel中,UI界面包含播放和停止按钮,控制两个音轨。每次切换音频前,还会随机调整播放速度在0.9到1.2之间。代码示例展示了如何创建ViewModel和UI以实现这一功能。
|
13天前
|
开发工具 Android开发 iOS开发
探索Android与iOS开发的差异与挑战
【7月更文挑战第11天】在移动应用开发的广阔天地中,Android和iOS两大平台如同双子星座般耀眼,各自拥有独特的开发生态和用户群体。本文将深入分析这两个平台的显著差异,从技术架构到开发工具,再到市场定位,揭示它们之间的异同。通过比较,我们不仅能够更好地理解各自的优势和局限,还能洞察未来移动应用开发的趋势。
|
10天前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
47 15
|
1天前
|
前端开发 Android开发 iOS开发
探索安卓与iOS开发的差异性与互补性
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统各据一方,引领着市场潮流。它们在技术架构、开发环境及用户群体等方面展现出独特的差异性,同时也存在着潜在的互补性。本文将深入剖析这两种平台的开发细节,从不同角度揭示其各自优势及相互之间的协同潜力,为开发者提供全面而深刻的视角。
8 2
|
7天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异性与互操作性
【7月更文挑战第17天】在移动应用开发的广阔天地中,安卓和iOS这两大操作系统如同双子星座般璀璨夺目。它们各自拥有独特的开发环境、编程语言和用户群体,为开发者提供了不同的挑战和机遇。本文将从多个维度深入剖析安卓与iOS开发的差异性,并探讨它们之间的互操作性如何实现,以期为开发者们提供一份实用的指南。
21 7
|
5天前
|
Java Android开发 Swift
探索iOS与安卓开发的差异与挑战
本文深入探讨了iOS和安卓两大移动操作系统在应用开发领域的不同点及其所面临的挑战。通过对开发环境、编程语言、用户界面设计、性能优化及市场策略的比较分析,揭示了各自平台的独特性以及开发者需要克服的技术与市场障碍。 【7月更文挑战第19天】