AAudio 或 OpenSL

Hug*_*Hug 5 c++ audio android opensl

我开始用 C++ 实现我的游戏音频部分,我看到有 2 个音频框架可用 AAudio ( https://developer.android.com/ndk/guides/audio/aaudio/aaudio.html ) 和OpenSL ( https://developer.android.com/ndk/guides/audio/opensl/index.html )。

这两者之间有哪些区别?

Ove*_*r17 5

OpenSL ES

从 Android 2.3 (Gingerbread) 开始的设备支持 OpenSL。但是,用于 OpenSL(高性能音频)的快速混音器自 Android 4.2(或 4.3?)起可用,并且并非所有设备本机都支持。

这是什么意思?根据我的观察,当不使用快速混音器时,Java AudioTrack比 OpenSL更快(延迟更低)。

当使用快速混音器时,音频延迟实际上很好而且很低。要实现它,您的设备必须支持快速混频器,并且配置参数应该匹配。

另一个需要考虑的问题是 GearVR 上的“噼啪声”,可能是因为线程优先级发生了变化。

要使用 OpenSL 实现您的音频,您可能需要参考 NDK 示例,或者在这里更好地https://github.com/Over17/AndroidAudioFastPathSample - 它已修复为实际使用快速路径。

音频

将在今年某个时候发布的 Android 8 Oreo 上得到支持。除非您不希望您的游戏只与 Android O 兼容,否则您可能不想走这条路。

我还没有太多的实践经验。

双簧管

Oboe 是由 Google 开发的库,它根据设备支持的内容使用 AAudio 或 OpenSL 作为后端,并具有封装 API 的 C++ 接口。使用它而不是直接使用 AAudio 是有意义的。

动机

为什么您真的需要为您的游戏提供原生音频部分?如果它不是合成器、专业音频应用程序或 VR 游戏,我真的不会理会原生 C++ 音频而选择 JavaAudioTrack。它可靠,与所有设备兼容,并且对于非专业应用程序具有可接受的延迟。

  • I/O 2017 表示 AAudio 将在之前的 Android 版本上动态切换为使用 OpenSL ES:https://youtu.be/C0BPXZIvG-Q?t=1856 (2认同)

phi*_*urk 5

如果您需要 Android 的本机音频接口,那么我们目前建议使用 Oboe。Oboe 在较新的设备上称为 AAudio,在较旧的设备上称为 OpenSL ES。Oboe API 是 C AAudio 接口到 C++ 的直接映射。

Oboe 包含不同 Android 平台上各种 Open SL ES 问题的解决方法。

源代码可在 GitHub 上获取,并且正在积极开发中。

https://github.com/google/oboe