马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在开发音视频相关应用时,我们常会打仗到 MediaPlayer、SoundPool、AudioTrack、OpenSL ES、AAudio、Oboe 等名词,它们都与 Android 的音频播放息息相关。然而,真正理解它们之间的关系以及背后运行机制,才能写出高性能、低延长的音频程序。本文将从整体架构入手,系统梳理 Android 的音频系统。
🧱一、Android 音频架构分层概览
Android 音频系统可大抵分别为以下几个层级:- ┌───────────────────────────────┐
- │ 应用层 API │ ← Java/Kotlin 层:MediaPlayer, SoundPool, AudioTrack
- ├───────────────────────────────┤
- │ Framework 层(AudioSystem) │ ← 桥接 Java 和 Native 的 Binder 接口
- ├───────────────────────────────┤
- │ Native 层(AudioFlinger) │ ← Android 核心音频服务,混音、输出管理
- ├───────────────────────────────┤
- │ HAL 层(Audio HAL) │ ← 硬件抽象层,厂商实现
- ├───────────────────────────────┤
- │ 驱动层(Audio Driver) │ ← Linux 驱动,最终控制硬件播放
- └───────────────────────────────┘
复制代码 无论利用哪种 API 进行播放,终极音频数据都会通过 AudioFlinger,并由 Audio HAL 与底层硬件驱动交互,完成音频输出。
🎶二、常见音频 API 对比与播放路径
API 类别示例流程简介MediaPlayer播放音乐/视频Java 层 → MediaPlayerService → AudioTrack 或 OpenSL ES → AudioFlingerSoundPool播放短音效Java 层 → Native 层封装 → AudioTrack → AudioFlingerAudioTrack播放 PCM 流Java/C++ 层 → AudioTrack → AudioFlingerOpenSL ES原生播放引擎C++ 层 → OpenSL ES → AudioFlingerAAudio/Oboe低延长音频播放C++ 层 → AAudioService(或 OpenSL) → AudioFlinger 🎛️三、AudioFlinger 是什么?
AudioFlinger 是 Android 音频系统的核心折务,运行在 system_server 中,负担如下职责:
- 多路音源混音(Mixer)
- 音频流路由管理(输出到扬声器、耳机或蓝牙)
- 音量调整、采样率转换
- 与 Audio HAL 交互,把音频送至驱动层
它是所有音频流的终极归宿,控制着音频的输出流程。
🎥四、Java 层 API 简述
MediaPlayer
- 用于播放当地或网络的压缩格式音频/视频(如 MP3、AAC、MP4)
- 自动完成解码与播放,适合背景音乐、视频播放
SoundPool
- 专为播放短音效(如按钮音、提示音)设计
- 音频在加载时就解码为 PCM,播放延长极低
AudioTrack
- 提供对 PCM 流的播放控制,适合及时音频或自界说播放
- Java 层易用,但性能不如 Native 层 API
🔗五、Native 层 API 比较
名称引入版本特点适合场景OpenSL ESAndroid 2.3原生 C++ API,功能全面,编程复杂旧装备、低层控制AAudioAndroid 8.1新一代低延长 API,接口现代、简便高版本装备OboeGitHub 开源封装 AAudio 和 OpenSL ES,统一接口全版本低延长播放Oboe 会自动判断装备支持情况,优先利用 AAudio,否则回退到 OpenSL ES,因此是最推荐的 Native 播放方案。
🔍六、从上到下的音频流动路径图解
- [MediaPlayer / SoundPool / AudioTrack / OpenSL ES / AAudio / Oboe]
- ↓
- [AudioTrack (native C++) 或其他 native 流 API]
- ↓
- [AudioFlinger 音频服务混音]
- ↓
- [Audio HAL (厂商实现)]
- ↓
- [Audio Driver (Linux 驱动)]
- ↓
- [物理输出设备(耳机/扬声器)]
复制代码 所有音频 API,终极都绕不开 AudioFlinger。
七、总结
- Android 的音频架构是多层级的,每一层都有其作用与职责。
- AudioFlinger 是系统音频的心脏,统一调理所有音频流。
- MediaPlayer 和 SoundPool 适合一样平常播放场景,简单易用。
- AudioTrack 提供 PCM 控制,适合高级需求。
- Native 层推荐利用 Oboe,封装底层细节,兼容性与性能兼具。
把握这些 API 和音频流程,有助于你开发出更加稳固、高性能、低延长的音频应用。
|