AAudio:Android 低延迟音频处理的核心组件

https://source.android.com/docs/core/audio/aaudio?hl=zh-cn
Android AAudio详解 - 简书  0624

openStream 和start流程:

write_sine为例子
openStream流程: 
AAudioSimplePlayer::open
	AAudio_createStreamBuilder
	AAudioStreamBuilder_openStream
		AudioStreamBuilder->build
			builder_createStream  // 如果mmap stream没有open,就尝试使用legacy stream
				mmap? new AudioStreamInternalCapture/new AudioStreamRecord
				mmap? new AudioStreamInternalPlay/ new AudioStreamTrack() 后面讲play
			audioStream->open
				AudioStreamInternalPlay::open
					mServiceInterface.openStream  AAudioServiceInterface
                        AAudioBinderClient::openStream 还在客户进程。binder请求到AAudioService
                            AAudioService::openStream
                                EXCLUSIVE? (new AAudioServiceStreamMMAP)->open               // 独占模式    (当独占模式创建失败后,也会尝试共享模式)
                                     AAudioServiceStreamBase::open(request,AAUDIO_SHARING_MODE_EXCLUSIVE)
                                        UpMessageQueue = new SharedRingBuffer  //创建UpMessageQueue buffer,同步流状态,比如写的位置,是否发生underrun或overrun等
                                        mEndpointManager.openEndpoint
                                            AAudioEndpointManager::openExclusiveEndpoint
                                                AAudioServiceEndpointMMAP::open  //获取mmap 代理接口  AAudioServiceEndpoint MmapStreamCallback
                                                    MmapStreamInterface::openMmapStream
                                                         af->openMmapStream             // AudioFlinger
                                                            AudioPolicyManager::getOutputForAttr    创建MmapThread
                                                    mMmapStream->createMmapBuffer
									endpoint->registerStream  到AAudioServiceEndpointMMAP的mRegisteredStreams
                                
                                SHARED?(new AAudioServiceStreamShared)->open     //共享模式
                                    AAudioServiceStreamBase::open(request, AAUDIO_SHARING_MODE_SHARED)
                                        UpMessageQueue = new SharedRingBuffer
                                        mEndpointManager.openEndpoint
                                            AAudioEndpointManager::openSharedEndpoint
                                                INPUT? new AAudioServiceEndpointCapture->open 
                                                OUTPUT? new AAudioServiceEndpointPlay->open      new AAudioServiceEndpointPlay会维护自己的Stream  mStreamInternal
                                                    AAudioServiceEndpointShared::open   
                                                        mStreamInternal->open(builder)
                                                            AudioStreamInternalPlay::open
                                                    mMixer.allocate   // Mix Buffer  AAudioMixer::mix
                                    mAudioDataQueue = new SharedRingBuffer   //AudioDataQueue mmap
									endpoint->registerStream 到AAudioServiceEndpointPlay的mRegisteredStreams

AAudioSimplePlayer::start
	AAudioStream_requestStart
		convertAAudioStreamToAudioStream
		AudioStream->systemStart
			mPlayerBase->start()
				PlayerBase::start
					PlayerBase::startWithStatus
						playerStart
							AudioStream::playerStart
								 AudioStream::safeStart
									requestStart              
										AudioStreamInternal::requestStart
											mServiceInterface.startStream
												AAudioService::startStream       ---------AAudioService
													AAudioServiceStreamBase::start
														AAudioServiceStreamMMAP::start
															startDevice()
																AAudioServiceEndpoint::startStream
																	AAudioServiceEndpointMMAP::startStream
																		 AAudioServiceEndpointMMAP::startClient
																			 mMmapStream->start
															AAudioServiceStreamMMAP::run线程启动
															
														AAudioServiceStreamShared::start
															startDevice()
																AAudioServiceEndpointShared::startStream(AAudioServiceEndpointPlay::startStream)
																		getStreamInternal()->requestStart
																		startSharingThread_l  // callbackLoop线程启动 Service端
																			AAudioServiceEndpointPlay::callbackLoop
																			
																		getStreamInternal()->startClient
																	
															AAudioServiceEndpointShared::run线程启动
                                            callbackLoop线程启动 ----Client端  (createThread >> AudioStreamInternalPlay::callbackLoop)

功能简介

AAudio 是 Android 系统中用于实现低延迟音频输入 / 输出的原生 API,首次引入于 Android 8.0(Oreo)系统。作为 Android 音频架构的重要升级,它旨在解决传统音频 API(如 OpenSL ES、AudioTrack)在低延迟场景下的性能瓶颈,为专业音频应用(如音乐制作、实时音频处理、游戏音效)提供更高效的音频处理能力。

其核心功能与设计特点包括:

  • 低延迟音频处理:通过优化音频缓冲区管理和硬件交互流程,将音频处理延迟降低至毫秒级(典型值 <10ms),满足实时音频场景需求。
  • 跨平台兼容性:基于标准化的音频处理模型,可在不同 Android 设备(尤其是支持低延迟音频硬件的设备)上提供一致的性能表现。
  • 简化的编程接口:相比传统 API,AAudio 通过更简洁的接口设计(如流式操作、事件回调机制)降低开发者的使用门槛。
  • 灵活的音频配置:支持自定义采样率、声道数、音频格式(如 PCM 16bit/32bit、浮点数)等参数,适配不同音频场景。
  • 资源管理优化:提供自动资源释放机制和错误处理机制,减少内存泄漏和应用崩溃风险。
  • 硬件加速支持:直接对接底层音频驱动,充分利用设备硬件特性(如专用音频芯片、多通道处理能力)。

AAudio 的 Control Flow(控制流)

控制流指 AAudio API 的操作流程和状态管理,其核心流程可分为以下阶段:

1. 初始化与配置阶段

plaintext

应用启动 -> 创建 AAudio 设备描述符(AAudioDeviceDescriptor)-> 配置音频参数(采样率、格式、通道数等)

  • 设备发现:通过 AAudioStreamBuilder 扫描可用音频设备(如扬声器、麦克风)
  • 参数配置:设置关键参数:
    • 音频方向(输入 / 输出 / 双向)
    • 采样率(如 44.1kHz、48kHz)
    • 缓冲区大小(决定延迟和性能平衡)
    • 数据格式(AAudioFormat_PCM_I16、AAudioFormat_PCM_FLOAT 等)
2. 流创建与启动阶段

plaintext

构建音频流 -> 打开流连接 -> 启动音频数据传输

  • 流创建:通过 AAudioStreamBuilder_build 生成音频流对象(AAudioStream)
  • 状态转换:流状态从 AAUDIO_STREAM_STATE_UNINITIALIZED 转换为 AAUDIO_STREAM_STATE_READY
  • 启动流:调用 AAudioStream_start 使流进入 AAUDIO_STREAM_STATE_STARTED 状态,开始数据传输
3. 运行时控制阶段
  • 数据写入 / 读取
    • 输出流:通过 AAudioStream_write 向缓冲区写入音频数据
    • 输入流:通过 AAudioStream_read 从缓冲区读取音频数据
  • 动态参数调整
    • 实时修改音量、采样率(部分设备支持)
    • 调整缓冲区大小(需设备驱动支持)
  • 事件回调
    • 缓冲区不足(underflow)或溢出(overflow)事件
    • 设备连接状态变化事件
    • 错误事件(如硬件故障、权限丢失)
4. 关闭与释放阶段

plaintext

停止流 -> 关闭流连接 -> 释放资源

  • 调用 AAudioStream_stop 停止数据传输
  • 调用 AAudioStream_close 关闭流,释放系统资源
  • 释放流构建器和其他相关对象,避免内存泄漏

AAudio 的 Data Flow(数据流)

数据流描述音频数据在 AAudio 架构中的传输路径和处理机制,分为输出流(播放)和输入流(录音)两种模式。

1. 输出流(播放)数据流向

plaintext

应用程序内存 -> AAudio 软件缓冲区 -> 音频驱动缓冲区 -> 硬件音频芯片 -> 扬声器

  • 应用层数据处理
    • 应用生成音频数据(如通过音频算法计算 PCM 样本)
    • 通过 AAudioStream_write 将数据写入 AAudio 软件缓冲区
  • 缓冲区管理
    • AAudio 采用环形缓冲区(Circular Buffer)模型,分为多个子缓冲区
    • 当软件缓冲区填满时,数据自动传输至音频驱动缓冲区
    • 驱动缓冲区与硬件音频芯片的 FIFO(先进先出队列)对接
  • 硬件处理阶段
    • 音频驱动将数据转换为硬件可识别的格式(如 I2S、SPDIF)
    • 音频芯片对数据进行数模转换(DAC)和放大处理
    • 最终通过扬声器播放声音
2. 输入流(录音)数据流向

plaintext

麦克风 -> 硬件音频芯片 -> 音频驱动缓冲区 -> AAudio 软件缓冲区 -> 应用程序内存

  • 硬件采集阶段
    • 麦克风将声音信号转换为模拟电信号
    • 音频芯片对信号进行模数转换(ADC)和采样,生成 PCM 数据
    • 数据存入驱动缓冲区的 FIFO 队列
  • 数据传输阶段
    • AAudio 驱动从硬件 FIFO 读取数据,存入驱动缓冲区
    • 应用通过 AAudioStream_read 从软件缓冲区获取数据
  • 应用层处理
    • 应用接收音频数据并进行处理(如降噪、回声消除、音频分析)
    • 处理后的数据可存储、传输或实时回播
3. 缓冲区机制与延迟优化
  • 双缓冲区 / 多缓冲区模型
    • AAudio 通常使用 2-3 个缓冲区交替工作,减少数据传输阻塞
    • 当一个缓冲区被硬件处理时,应用可同时写入下一个缓冲区
  • 延迟控制因素
    • 缓冲区大小:更小的缓冲区(如 64 帧)可降低延迟,但增加 CPU 负载
    • 采样率:高采样率(如 96kHz)需要更高的数据传输速率
    • 硬件处理时间:音频芯片的处理延迟由设备硬件决定
  • 动态缓冲区调整
    • 部分设备支持根据系统负载动态调整缓冲区大小
    • AAudio 可通过 AAudioStream_getBufferSize 和 AAudioStream_setBufferSize 接口实现动态配置

AAudio 与传统音频 API 的对比

特性AAudioAudioTrack/OpenSL ES
最低延迟<10ms(理想情况)20-100ms(依赖设备)
编程接口复杂度简洁(流式 API)复杂(状态机模型)
跨平台兼容性统一接口(Android 8+)部分设备需自定义适配
硬件加速支持直接对接驱动通过 AudioFlinger 中转
实时性事件回调支持(缓冲区事件)有限支持(仅部分事件)

典型应用场景

  • 专业音乐制作软件(如 MIDI 控制器、多轨录音应用)
  • 实时语音通信(如游戏语音、视频会议降噪处理)
  • 低延迟游戏音效(如虚拟现实音频、赛车游戏引擎音效)
  • 音频分析与处理(如频谱分析、实时音频特效)
  • 医疗设备与工业音频监测(需要高精度音频采集)

通过控制流与数据流的深度优化,AAudio 已成为 Android 平台低延迟音频处理的标准解决方案,为开发者提供了接近原生硬件性能的音频处理能力。

与正常audiotrack方式对比:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值