本节提供开始使用 OpenSL ES API 所需的信息。
将 OpenSL ES 添加到您的应用程序
您可以从 C 和 C++ 代码调用 OpenSL ES。要将核心 OpenSL ES 功能集添加到您的应用程序,请包含 OpenSLES.h
头文件
#include <SLES/OpenSLES.h>
要添加 OpenSL ES Android 扩展,也要包含 OpenSLES_Android.h
头文件
#include <SLES/OpenSLES_Android.h>
当您包含 OpenSLES_Android.h
头文件时,以下头文件将自动包含
#include <SLES/OpenSLES_AndroidConfiguration.h> #include <SLES/OpenSLES_AndroidMetadata.h>
注意: 这些头文件不是必需的,但作为学习 API 的辅助手段。
构建和调试
您可以通过在用作 NDK 构建系统其中一个 makefile 的 Android.mk
文件中指定 OpenSL ES 来将其合并到您的构建中。在 Android.mk
中添加以下行
LOCAL_LDLIBS += -lOpenSLES
为了进行稳健的调试,我们建议您检查大多数 OpenSL ES API 返回的 SLresult
值。您可以使用 断言 或更高级的错误处理逻辑进行调试;对于 OpenSL ES,两者都没有固有优势,尽管其中一个可能更适合特定的用例。
我们在我们的 示例 中使用断言,因为它们有助于捕获不切实际的条件,这些条件将表明编码错误。我们对更可能在生产中发生的条件使用了显式错误处理。
除了非零结果代码之外,许多 API 错误还会导致日志条目。此类日志条目可以提供额外的详细信息,这些详细信息对于 Engine::CreateAudioPlayer
等相对复杂的 API 特别有用。
您可以从命令行或 Android Studio 查看日志。要从命令行查看日志,请键入以下内容
$ adb logcat
要从 Android Studio 查看日志,请选择查看 > 工具窗口 > Logcat。有关更多信息,请参阅 使用 Logcat 编写和查看日志.
示例代码
我们建议使用支持且经过测试的示例代码,这些代码可用作您自己的代码的模型,这些代码位于 audio-echo 和 native-audio 文件夹中 android-ndk GitHub 存储库。
注意: OpenSL ES 1.0.1 规范在附录中包含示例代码(有关更多详细信息,请参阅 Khronos OpenSL ES 注册表)。但是,附录 B:示例代码 和 附录 C:用例示例代码 中的示例使用了 Android 不支持的功能。一些示例还包含排版错误,或使用可能更改的 API。在参考这些示例时要谨慎;尽管代码可能有助于理解完整的 OpenSL ES 标准,但它不应该在 Android 上直接使用。
音频内容
以下是一些用于应用程序打包音频内容的多种方法
- 资源: 通过将音频文件放置到
res/raw/
文件夹中,相关 API 可以轻松访问Resources
。但是,没有直接的本机访问资源,因此您必须编写 Java 编程语言代码才能在使用之前将它们复制出去。 - 资产:将您的音频文件放入
assets/
文件夹中,Android 原生资产管理器 API 可以直接访问它们。有关这些 API 的更多信息,请参阅头文件android/asset_manager.h
和android/asset_manager_jni.h
。位于 android-ndk GitHub 存储库中的示例代码将这些原生资产管理器 API 与 Android 文件描述符数据定位器结合使用。 - 网络:您可以使用 URI 数据定位器直接从网络播放音频内容。但是,请务必阅读 安全和权限。
- 本地文件系统:URI 数据定位器支持
file:
方案用于本地文件,前提是应用程序可以访问这些文件。请注意,Android 安全框架通过 Linux 用户 ID 和组 ID 机制限制文件访问。 - 录制:您的应用程序可以从麦克风输入录制音频数据,存储此内容,然后稍后播放。示例代码将此方法用于 播放 剪辑。
- 编译和链接内联:您可以将音频内容直接链接到共享库中,然后使用带有缓冲区队列数据定位器的音频播放器播放它。这最适合短 PCM 格式剪辑。示例代码将此技术用于 您好 和 Android 剪辑。PCM 数据使用
bin2c
工具(未提供)转换为十六进制字符串。 - 实时合成:您的应用程序可以实时合成 PCM 数据,然后使用带有缓冲区队列数据定位器的音频播放器播放它。这是一种相对高级的技术,音频合成的细节超出了本文的范围。
注意: 查找或创建适用于您的应用程序的有用音频内容超出了本文的范围。您可以使用诸如 交互式音频、游戏音频、声音设计 和 音频编程 之类的网络搜索词来查找更多信息。
注意: 您有责任确保您有权播放或录制内容。录制内容可能存在隐私问题。
代码示例
这些示例应用程序可以在我们的 GitHub 页面上找到
- audio-echo 创建一个输入到输出的往返循环。
- native-audio 是一个简单的音频录制器/播放器。
Android NDK 中的 OpenSL ES 实现与 OpenSL ES 1.0.1 的参考规范在许多方面有所不同。这些差异是您直接从 OpenSL ES 参考规范复制的示例代码可能无法在您的 Android 应用程序中运行的重要原因。
有关参考规范与 Android 实现之间差异的更多信息,请参阅 适用于 Android 的 OpenSL ES。