【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 类型的样本 ;

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


目录
相关文章
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
存储 Android开发
安卓app,MediaPlayer播放本地音频 | 按钮控制播放和停止
在Jetpack Compose中,不直接操作原生Android组件如`Button`和`MediaPlayer`,而是使用Compose UI构建器定义界面并结合ViewModel管理音频播放逻辑。以下示例展示如何播放本地音频并用按钮控制播放/停止:创建一个`AudioPlayerViewModel`管理`MediaPlayer`实例和播放状态,然后在Compose UI中使用`Button`根据`isPlaying`状态控制播放。记得在`MainActivity`设置Compose UI,并处理相关依赖和权限。
|
Android开发 Kotlin
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【本地】音频,播放完随机播放下一首,遇到播放错误,也自动播放下一首
使用Kotlin和Jetpack Compose开发的安卓应用中,实现了两个EvoPlayer同时播放res/raw目录下的音频。一个音轨播放人声(顺序播放),另一个播放背景音乐(随机播放)。每个音轨都有独立的播放和停止控制,且在播放结束或遇到错误时会自动切换到下一首。MediaPlayer置于ViewModel中,UI界面包含播放和停止按钮,控制两个音轨。每次切换音频前,还会随机调整播放速度在0.9到1.2之间。代码示例展示了如何创建ViewModel和UI以实现这一功能。
|
存储 编解码 Android开发
58. 【Android教程】音频录制:MediaRecord
58. 【Android教程】音频录制:MediaRecord
427 2
|
Android开发 数据格式 XML
我的Android进阶之旅------>Android MediaPlayer播放网络音频的实例--网络mp3播放器
上一篇写了个简单的MP3播放器 ,这次写一个可以播放网络音频资源的播放器 本实例可以实现音乐播放器除了来电的时候会暂停播放,通话结束后恢复播放外,打开其他的Activity都可以继续播放音乐,享受一边听音乐一边做其他的事情。
1717 0
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
575 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
504 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡