为了尽可能缩短音频延迟,我们建议您使用基于 OpenSL ES 1.0.1 的 Android 原生音频。
实现核对清单
如需使用 Android 原生音频,请执行以下操作:
-
下载并安装 Android NDK。在本文档的其余部分,我们将假设
NDKroot
是您安装 NDK 的目录。 - 阅读支持文档。
- 检查 API 级别是否不低于 9。
- 检查是否支持 android.hardware.audio.low_latency 功能。
-
使用由 android.media.AudioManager.getProperty(java.lang.String) 返回的建议原生缓冲区空间和采样率。
注意:对输入也应使用相同的缓冲区空间和采样率。
- 通常 1 个 OpenSL ES 缓冲区就足够了。
- 确保您的回调处理程序比较短,没有突发的 CPU 占用或不受控制的阻塞。避免优先级倒置。
- 考虑使用非阻塞算法,以便在输入和输出回调处理程序之间以及在回调处理程序和应用的其余部分之间进行通信。
支持文档
OpenSL ES 1.0.1
使用 PDF 查看器查看 OpenSL 1.0.1 规范。这份参考资料很长,并非所有内容都适用于您;不过,您需要查阅这份参考资料来了解有关 API 的详细信息。
注意:本文档介绍了完整的 OpenSL ES 1.0.1,但 Android 原生音频实际上是基于 OpenSL ES 1.0.1 的一个子集,而该子集含有一些 Android 专用扩展。
更高版本的 OpenSL ES(如 1.1)的说明文档与 Android 不相关。
OpenSL ES for Android
NDK 的安装文件中提供了“OpenSL ES for Android”文档,该文档目前没有在线提供。在浏览器中打开此链接:
NDKroot/docs/Additional_library_docs/opensles/index.html
您需要浏览整篇文档,但要特别注意“编程说明”一节的“性能”小节。
“OpenSL ES 1.0.1 中受支持的功能”一节介绍了 Android 所支持的那一部分功能。
“Android 扩展”一节介绍了基本 OpenSL ES 1.0.1 中未包含的 Android 专用扩展。
与 OpenSL ES 1.0.1 的关系
以下维恩图显示了 Android 原生音频与 OpenSL ES 1.0.1 之间的关系。

图 1. 维恩图
其他资源
source.android.com
source.android.com 网站主要面向制造 Android 设备的 OEM,以及为这些 OEM 提供组件的 SoC 供应商。
不过,该网站上提供了大量有关延迟时间的实用信息,因此您可能需要查看这些信息。请查看音频延迟的相关文章。
android-ndk
如果您对如何使用 Android 原生音频有疑问,请在 android-ndk 论坛中提问。
视频
- Android 上的高性能音频(2013 年 Google I/O 大会)
- 整个视频都是关于音频延迟的。
- 在 Android 上打造出色的多媒体体验(2014 年 Google I/O 大会)
- 前 14 分钟大致介绍了一下音频,尤其是输入延迟时间。
- 音频延迟:缓冲区空间 (100 Days of Google Dev)
- 介绍音频延迟、缓冲区空间和任务调度之间的关系。