AAudio 是在 Android O 版本中引入的全新 Android C API,与AAudio类似的是oboe库。此 API 专为需要低延迟的高性能音频应用而设计。应用通过读取数据并将数据写入流来与 AAudio 进行通信。AAudio 在应用与 Android 设备的音频输入端及输出端之间传输音频数据。应用通过读取和写入以 AAudioStream 结构表示的音频流来传入和传出数据。这些读写操作可以是阻塞式调用或非阻塞式调用。
Android平台有AudioTrack、AAudio和OpenSL三种方式播放音频,如下图所示:
1、AAudio介绍
1.1 音频设备
音频设备是硬件接口或虚拟端点,用作连续的数字音频数据流的来源或接收器。每个流都连接到单个音频设备。
我们可调用AudioManager方法 getDevices() 来发现可用的音频设备。Android 设备上的每个音频设备都具有唯一ID,我们可使用该ID将音频流与特定音频设备绑定。但在大多数情况下,我们可以让 AAudio 选择默认设备。连接到流的音频设备负责确定该流是用于输入还是输出,因为流只能在一个方向传输数据。定义流时,我们可以指定其方向。打开流时,Android 会检查确保音频设备与流方向一致。
1.2 共享模式
AAudio的stream流具有两种共享模式:
AAUDIO_SHARING_MODE_EXCLUSIVE 表示该流对其音频设备进行独占访问;该设备不可供任何其他音频流使用。如果音频设备已在使用当中,流可能无法对其进行独占访问。独占流的延迟时间往往较短,但连接断开的可能性也较大。如果不再需要独占流,应尽快关闭,以便其他应用访问该设备。独占流可以最大限度缩短延迟时间。 AAUDIO_SHARING_MODE_SHARED 允许AAudio混合音频。AAudio会将分配给同一设备的所有共享流混合。 我们可以在创建流时指定共享模式。默认情况下,共享模式为SHARED。
1.3 音频格式
通过流传递的数据具有如下的数字音频属性:
音频格式 采样率 声道数 AAudio支持两种音频格式:AAUDIO_FORMAT_PCM_I16和AAUDIO_FORMAT_PCM_FLOAT
1.4 创建音频流
AAudio 库遵循构建者设计模式,并提供 AAudioStreamBuilder。
1.4.1 创建 AAudioStreamBuilder:
AAudioStreamBuilder *builder;
aaudio_result_t result = AAudio_createStreamBuilder(&builder);
1.4.2 构建参数,其中参数选项如下:
AAudioStreamBuilder_setDeviceId(builder, deviceId);
AAudioStreamBuilder_setDirection(builder, direction);
AAudioStreamBuilder_setSharingMode(builder, mode);
AAudioStreamBuilder_setSampleRate(builder, sampleRate);
AAudioStreamBuilder_setChannelCount(builder, channelCount);
AAudioStreamBuilder_setFormat(builder, format);
AAudioStreamBuilder_setBufferCapacityInFrames(builder, frames);
1.4.3 用AAudioStreamBuilder创建流:
AAudioStream *stream;
result = AAudioStreamBuilder_openStream(builder, &stream);
1.4.4 删除AAudioStreamBuilder:
AAudioStreamBuilder_delete(builder);
1.5 使用AAudio音频流
1.5.1 状态转换
AAudio有5种状态:
-
打开</