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

Android AAudio详解 AAudio 是在 Android O 版本中引入的全新 Android C API。此 API 专为需要低延迟的高性能音频应用而设计。应用通过读取数据并将数据写入流来与 AAudio 进行通信。AAudio的mmap模式就是直接将内核alsa 驱动使用的一块内存映射到用户态,这样应用可以将数据直达驱动,节省了中途的拷贝操作,而且读写是基于NOIRQ的,也就是不需要没有用中断机制,用单独的一个计时器驱动读写数据。音频流具有共享模式。 阅读详情
AI摘要

AAudio是Android 8.0引入的原生API,用于低延迟音频输入/输出。它能解决传统音频API在低延迟场景的性能瓶颈,具备低延迟处理、跨平台兼容等特点。介绍了其控制流、数据流,对比了传统API,并列举了专业音乐制作、实时语音通信等应用场景。

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方式对比:

Android AAudio 的实现分析 AAudio 是一个自 Android O 引入的新的 Android C API。它主要是为需要低延迟的高性能音频应用设计的。应用程序通过直接从流中读取或向流中写入数据来与 AAudio 通信,但它只包含基本的音频输入输出能力。Android 的官方文档对 AAudio 的 API 及设计思想做了良好的介绍,这里来看一下 AAudio 的实现。后面的代码分析基于 android-12.1.0_r27 进行。AAudio 在应用程序和 Android 设备上的音频输入输出之间移动音频数据。 阅读详情

相关推荐

Android AAudio

AAudio 是一个自 Android O 引入的新的 Android C API。它主要是为需要低延迟的高性能音频应用设计的。应用程序通过直接从流中读取或向流中写入数据来与 AAudio 通信,但它只包含基本的音频输入输出能力。AAudio 在应用程序和 Android 设备上的音频输入输出之间移动音频数据。应用程序传入音频流和从音频流读取数据来实现这种音频数据的传递。AAudio 的实现围绕音频数据传递,围绕音频流进行。

liuning1985622的博客 1523

Android NDK开发详解高性能音频之AAudio

原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C++ 代码,并提供众多平台库,您可使用这些平台库管理原生 activity 和访问实体设备组件,例如传感器和触控输入。NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架 API 开发应用

hnjzfwy的博客 1111

深入Android音频驱动层:手把手分析AAudio mmap模式如何实现超低延迟

本文深入解析了Android音频驱动层中AAudio mmap模式实现超低延迟的底层原理与实践。通过内存映射技术、NOIRQ计时器机制和独占模式,AAudio显著降低了音频延迟,适用于音乐制作等对实时性要求高的场景。文章还提供了开发者实践指南和调试技巧,帮助优化音频性能。

weixin_42628688的博客 351

Oto 音频库内部组件深度剖析:oboe与mux模块的设计与实现终极指南

Oto是一个跨平台的低级音频播放库,支持Windows、macOS、Linux、Android、iOS等多个平台。作为Go语言生态系统中最强大的音频处理库之一,Oto通过其精巧的模块化设计实现了高效的多平台音频播放功能。本文将深入剖析Oto音频库的两个核心内部组件:oboe模块和mux模块,揭示它们在跨平台音频处理中的关键作用与实现原理。 ## 🎵 Oto音频库架构概览 Oto采用分层架构设

gitblog_00691的博客 892

Android音频开发实战指南:从MediaPlayer到AAudio的组件选型与避坑

在移动应用开发中,音频处理是构建多媒体功能的核心技术之一,涉及从基础播放到实时流处理的多个层面。其原理基于数字音频的采样、编码与渲染流程,通过系统提供的不同层级API实现。掌握音频开发的技术价值在于能够为应用提供流畅、低延迟的声音体验,直接影响用户体验与应用性能。在Android平台上,开发者需要根据具体场景选择合适的组件:MediaPlayer适合媒体文件播放,SoundPool专为短音效优化,而AudioTrack与AudioRecord则为底层PCM流处理提供了灵活控制。对于低延迟与高性能需求,AAu

weixin_30340819的博客 389

Android Audio框架深度解析:从AudioTrack到AAudio的低延迟优化实践

音频处理是现代移动应用开发中的核心技术之一,它涉及从数字信号到物理声波的完整转换链路。其核心原理在于通过软件框架协调硬件资源,实现多路音频流的混合、路由与同步处理。这项技术的核心价值在于平衡性能、功耗与兼容性,为音乐播放、实时通讯、游戏音效等场景提供稳定可靠的音频体验。在Android生态中,AudioFlinger作为混音引擎负责数据流转,而AudioPolicyService则扮演策略决策者的角色,共同构成了复杂的音频管理系统。本文聚焦于Android Audio框架的实战应用,深入探讨AudioTra

weixin_29189377的博客 236

安卓音频低延时与AAudio

音频延迟是指“音频数据产生→硬件发声”或“硬件拾音→数据上抛”的总耗时,传统AudioTrack/AudioRecord链路延迟普遍在,远超实时场景≤45ms的要求。要实现低延迟,必须解决四大问题,AAudio正是围绕这几点设计的原生解决方案。AAudio 是在 Android O 版本中引入的全新 Android C API。此 API 专为需要低延迟的高性能音频应用而设计。‌AAudio。

qq_42423646的博客 601

Android音频系统架构与核心组件解析

音频处理是移动设备开发中的关键技术,其架构设计直接影响语音通话、媒体播放等基础体验。Android音频系统采用分层架构,包括应用框架层、本地服务层、HAL硬件抽象层和Linux内核驱动层,通过标准接口实现硬件兼容性。核心组件如AudioTrack和AudioFlinger分别负责音频数据输出和混音处理,支持多种音频效果和低延迟优化。在应用场景上,Android音频系统广泛应用于音乐播放、实时通信等领域,并通过Project Treble等架构改进提升系统升级效率。本文将深入解析Android音频系统的核心原

weixin_29168675的博客 199

Salt Player 音频渲染引擎对比:OpenSL ES vs AAudio

你是否曾在播放高解析度音频时遇到过卡顿?是否注意到不同设备上音质的微妙差异?在移动音频领域,**渲染引擎**正是决定这些体验的核心组件。Salt Player(椒盐音乐)作为拥有数十万用户的本地音乐播放器,其底层音频架构的选择直接影响着从无损音频解码到耳机输出的每一个细节。 本文将深入对比Android平台两大主流音频渲染技术——**OpenSL ES**与**AAudio**,剖析Salt P...

gitblog_01141的博客 1265

安卓音频子系统架构与核心组件解析

音频处理是现代移动操作系统的关键技术之一,涉及从应用层到硬件层的完整架构设计。在安卓系统中,音频子系统通过分层架构实现高效管理,其中AudioService负责策略控制,audioserver处理底层混音与硬件交互。理解音频焦点管理、设备路由策略等核心机制,对开发高质量音频应用至关重要。特别是在实时音频处理场景中,低延迟实现和性能优化技术直接影响用户体验。通过分析AudioFlinger混音引擎和AudioPolicyService的硬件抽象层,开发者可以更好地处理多应用并发、蓝牙音频等典型场景。掌握这些音

weixin_29188997的博客 189

安卓音频子系统架构与AudioService深度解析

音频处理是现代移动操作系统的核心技术之一,其架构设计直接影响设备的多媒体体验。在安卓系统中,音频子系统采用分层架构设计,通过AudioService和audioserver等核心组件实现策略管理与硬件抽象。AudioService作为框架层中枢,负责音量控制、设备路由等关键功能;而audioserver则通过AudioFlinger实现底层音频混合与处理。这种架构既保证了API的灵活性,又能满足实时音频处理的性能需求。在音频开发实践中,开发者需要特别关注音频焦点管理、低延迟优化等关键技术点。随着AAudio

weixin_32025789的博客 231

Winlator音频延迟优化:低延迟音频缓冲区管理

在Android设备上运行Windows应用程序时,音频延迟一直是用户体验的关键瓶颈。传统音频处理方案往往存在20-100ms的延迟,这对于游戏、音乐制作和实时通信应用来说是不可接受的。Winlator通过创新的ALSA(Advanced Linux Sound Architecture)音频插件架构,实现了低至10ms以下的音频延迟,为移动设备上的Windows应用提供了专业级的音频体验。 #...

gitblog_00216的博客 1152

深入浅出Android音频系统:从AudioTrack到音频输出通道的完整流程解析

本文深入解析Android 10音频系统中AudioTrack的工作机制及其与音频输出通道的完整交互流程。从AudioTrack的基础架构、音频属性配置到输出通道选择机制,详细介绍了Android音频系统的核心组件和优化策略,帮助开发者构建高效稳定的音频应用。

weixin_30825581的博客 502

android8.0 audio架构,Android 9.0 AAudio源码分析(一)

Android 9.0 AAudio源码分析(一)提示:再读文章之前可以先学习一下Binder和MMAP的知识前言因为网上目前还没有关于安卓AAudio方面的原理分析,所以笔者通过研究安卓9.0源码,总结了一些偏向于底层的一些东西,希望可以帮助到大家一、AAudio是什么AAudio 是在 Android O 版本中引入的全新 Android C API。此 API 专为需要低延迟的高性能音频应用...

weixin_36381252的博客 913

AudioFlinger架构基础:Android音频系统的心脏

深入解析Android 15 AudioFlinger服务的整体架构,包括四层音频栈、PlaybackThread/RecordThread核心组件,以及从App到HAL的完整音频数据流转路径

Cheson的专栏 585

Android音频开发避坑指南:从AudioTrack到AudioFlinger,搞懂数据流与线程模型

本文深入解析Android音频开发中的核心挑战,从AudioTrack到AudioFlinger的数据流与线程模型设计。通过剖析共享内存管理、线程优先级反转等关键问题,提供低延迟音频优化方案和异常诊断方法,帮助开发者规避常见陷阱,实现高性能音频处理。

weixin_30340819的博客 272

深入AudioFlinger:图解Android手机里多路音频(音乐、通知、通话)是如何混音不打架的

本文深入解析Android音频系统中的AudioFlinger混音机制,揭示多路音频(音乐、通知、通话)如何和谐共存的技术原理。通过图解AudioFlinger的层级架构、音频流生命周期管理和混音引擎工作原理,帮助开发者理解Android音频架构的核心设计,并提供了音频焦点机制和性能优化的实用指南。

weixin_28304023的博客 360

Android AAudio——AAudio基础(一)

AAudio 在应用程序和 Android 设备上的音频输入输出之间移动音频数据。应用程序传入音频流和从音频流读取数据来实现这种音频数据的传递。AAudio 的实现围绕音频数据传递,围绕音频流进行。AAudio 的数据传递主要有两种工作模式,一种是 MMap 模式,此时客户端 AAudio 库从 media.aaudio 服务获得一块共享内存,并通过这块共享内存将数据传给设备;

小旭的专栏 2733
上一篇: 打开自动调节背光功能后,手动调节背光到最小,屏幕完全变黑
下一篇: Android 12 隐藏手势提示线(底部小白条)
长门_Pefect
博客等级 码龄11年 38粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值