AAudio和Oboe的关系

AAudio 是由 Google 提供的一个底层音频 API,旨在为 Android 应用提供高性能和低延迟的音频输入输出功能。它直接与 Android 操作系统的音频层交互,提供了比之前的 API(如 OpenSL ES)更优秀的性能。

Oboe 则是一个构建在 AAudio 和 OpenSL ES 之上的 C++ 封装库。Oboe 的设计目的是简化 Android 上的实时音频应用开发,同时确保这些应用能够尽可能地利用 AAudio 带来的性能优势。如果设备不支持 AAudio 或者在某些情况下 AAudio 不适用时,Oboe 可以自动回退到使用 OpenSL ES,从而保证了良好的兼容性。

Oboe 的主要特点

  • 简化API:Oboe 提供了一个更加简洁和易于使用的 API 来处理音频流,隐藏了直接使用 AAudio 或 OpenSL ES 的复杂性。
  • 跨平台兼容性:尽管 Oboe 主要针对 Android 开发,它的设计也考虑到了跨平台的可移植性。
  • 性能优化:通过尽量使用 AAudio,Oboe 能够实现更低的延迟和更高的效率。

使用 Oboe

如果你正在开发一个新的 Android 音频应用,并且需要低延迟和高保真度,推荐首先尝试 Oboe 而不是直接使用 AAudio。这是因为 Oboe 提供了更高层次的抽象,使得代码更易于编写和维护,同时也能够智能地选择最佳的底层 API(即 AAudio 或 OpenSL ES)来满足你的需求。

示例代码片段(Oboe)

以下是一个简单的例子,展示了如何使用 Oboe 创建并启动一个音频流:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "oboe/Oboe.h"

class SimplePlayback : public oboe::AudioStreamCallback {
public:
std::unique_ptr<oboe::AudioStream> createStream() {
oboe::AudioStreamBuilder builder;
return builder.setCallback(this)
->setFormat(oboe::AudioFormat::Float)
->setChannelCount(oboe::ChannelCount::Mono)
->setSampleRate(48000)
->openStream();
}

oboe::DataCallbackResult onAudioReady(
oboe::AudioStream *audioStream,
void *audioData,
int32_t numFrames) override {
float *outputBuffer = static_cast<float *>(audioData);
// 填充 outputBuffer...
return oboe::DataCallbackResult::Continue;
}
};

int main() {
SimplePlayback playback;
auto stream = playback.createStream();
if (stream && stream->requestStart() == oboe::Result::OK) {
// 流开始播放...
}
}

这个示例中,SimplePlayback 类实现了 oboe::AudioStreamCallback 接口,用于定义当音频数据准备好时应执行的操作。createStream 方法设置了一些基本参数并打开了音频流。onAudioReady 回调函数则负责填充音频缓冲区的数据。

总之,虽然 AAudio 提供了强大的底层能力,但 Oboe 作为一个更高层次的封装库,可以让你更容易地利用这些能力,同时保持良好的兼容性和性能。