本节提供了开始使用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的辅助显示。

构建和调试 build and debug

通过在Android中指定OpenSL ES,您可以在NDK构建系统的makefile之一的Android.mk文件中指定它将其合并到构建中。向Android.mk添加下面一行代码:

LOCAL_LDLIBS += -lOpenSLES
复制代码

对于健壮的调试,我们建议您检查大多数OpenSL ES api返回的SLresult值。可以使用断言或更高级的错误处理逻辑进行调试;这两种方法都没有提供与OpenSL ES一起工作的优势,尽管其中一种可能更适合于给定的用例。

我们在示例中使用断言,因为它们有助于捕获表明编码错误的不符合实际的条件。对于工程中更可能发生的其他情况,我们使用了显式错误处理。

除了非零结果代码之外,许多API错误会生成日志条目。这样的日志条目可以提供额外的细节,对于Engine::CreateAudioPlayer等相对复杂的api特别有用。

您可以从命令行或Android Studio查看日志。要从命令行检查日志,输入以下命令:

$ adb logcat
复制代码

要查看来自Android Studio的日志,请选择View >工具Windows > Logcat。有关更多信息,请参阅使用Logcat编写和查看日志

示例代码

我们建议使用支持的和经过测试的示例代码,这些代码可以用作您自己的代码的模型,这些代码位于android-ndk GitHub存储库的audio-echonative-audio文件夹中。

注意:OpenSL ES 1.0.1规范在附录中包含了示例代码(有关详细信息,请参阅Khronos OpenSL ES注册表)。但是,附录B中的示例代码和附录C中的示例代码使用了Android不支持的特性。一些示例还包含印刷错误,或者api可能会更改。提及这些问题时要小心行事;虽然代码可能有助于理解完整的OpenSL ES标准,但它不应在Android中使用。

音频内容

以下是为您的应用程序打包音频内容的几种方法:

  • 资源Resources:通过将音频文件放到res/raw/文件夹中,资源的相关api可以轻松访问它们。但是,没有对Resources的直接原生访问权限,因此在使用之前必须编写Java编程语言代码来复制它们。
  • Assets:通过将音频文件放入Assets /文件夹中,Android原生asset manager api可以直接访问它们。参见头文件android/asset_manager.handroid / asset_manager_jni.h获取关于这些api的更多信息。位于Android-ndk GitHub存储库中的示例代码将这些原生asset manager api与Android文件描述符数据定位器结合使用。
  • 网络:可以使用URI数据定位器直接从网络播放音频内容。但是,请确保读取安全性和权限(查看OpenSL ES编程笔记的安全性和权限)。
  • 本地文件系统:URI数据定位器支持本地文件的file:协议,只要应用程序可以访问这些文件。注意,Android安全框架限制通过Linux用户ID和组ID机制访问文件。
  • 录制:您的应用程序可以从麦克风输入录入音频数据,存储这些内容,然后回放。示例中的代码使用此方法进行回放剪辑。
  • 内联编译和链接:您可以将音频内容直接链接到共享库,然后使用带有缓冲队列数据定位器的音频播放器播放。这对短PCM格式片段最适合。示例代码对HelloAndroid片段使用了这种技术。使用bin2c工具(未提供)将PCM数据转换为十六进制字符串。
  • 实时合成:应用程序可以动态合成PCM数据,然后使用带有缓冲队列数据定位器的音频播放器播放。这是一种相对较先进的技术,音频合成的细节超出了本文的范围。

注意:为您的应用程序查找或创建有用的音频内容超出了本文的范围。您可以使用web搜索术语,如交互式音频、游戏音频、声音设计和音频编程来定位更多信息。

注意:您有责任确保您可以合法地播放或录制内容。录制内容可能需要考虑隐私问题。

代码示例

这些示例应用程序可以在我们的GitHub页面上找到:

  • audio-echo创建一个输入-输出往返循环。
  • native-audio是一个简单的录音机/播放器。
  • SimpleSynth播放正弦波。它展示了如何获得最佳的音频延迟和稳定的计算吞吐量。

OpenSL ES的Android NDK实现在许多方面不同于OpenSL ES 1.0.1的参考规范。这些差异是您直接从OpenSL ES参考规范复制的示例代码可能无法在Android应用程序中工作的一个重要原因。


有关参考规范和Android实现之间差异的更多信息,请看下一篇 适用于android的OpenSL ES指南-面向Android的OpenSL ES