入门

本节提供开始使用 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-echonative-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.handroid/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