【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开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
240 5
|
1天前
|
Android开发
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
Android Mediatek 增加Recovery模式下读cmdline的强制工厂重置选项
5 0
|
2天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
18 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
7天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android's AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
7 0
|
7天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
8 0
|
21天前
|
XML Java Android开发
Android每点击一次按钮就添加一条数据
Android每点击一次按钮就添加一条数据
22 1
|
1月前
|
存储 Android开发 C++
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
31 3
|
2月前
|
JavaScript Java 数据安全/隐私保护
安卓逆向 -- POST数据解密
安卓逆向 -- POST数据解密
25 2
|
3月前
|
编解码 测试技术 开发工具
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
如何实现Android视音频数据对接到GB28181平台(SmartGBD)
|
3月前
|
数据采集 编解码 图形学
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
101 0