谷歌发布低延迟音频C++函数库Oboe

Google发布开源低延迟音频C++函数库Oboe,可用于构建即时音频应用程序,并且为广泛的Android设备,提供尽可能最低延迟的音频操作功能。

Oboe负责处理应用程序间的音频数据移动,或是Android设备上的音频输出与输入,应用程序通过读取或是写入串流,来进行数据传输,Oboe读取或是写入的调用,可以选择是堵塞式(Blocking)或是非堵塞式(Non-blocking)的。

Oboe的串流由三部分组成,分别是音频设备(Audio Device)、模式以及音频格式。每个串流都会连接到一个单一的音频设备,音频设备可以解释成硬件接口或是虚拟端点,以作为数字音频数据连续串流的来源或是接受器。 Google提醒,这与设备上的麦克风或是蓝牙耳机的声音设备,或是其他手机或手表等Android设备不同。

每个音频设备在Android设备上都有一个唯一的ID,开发者可以利用这个ID,将音频串流绑定到特定的音频设备上,但多数的情况下,可以让Oboe选择默认主设备,而不需要自行设置。附加到音频设备上需要设置输出还是输入,串流只能以一个方向移动,因此开发者在定义串流的时候,需设置让音频设备与串流方向一致。

Oboe的音频串流提供独占和分享模式。独占串流会独占访问音频设备上的端点,任何其他的音频串流都无法使用该端点,也就是说,当端点正被使用时,其他端点是无法获得其访问权限的。由于独占串流绕过混音器,因此能达到最低的延迟,开发者应该让应用程序在不使用时,关闭独占串流,以便其他应用程序可以访问被占用的端点,但也并非所有音频设备都提供独占端点。使用独占串流仍然可以听到其他应用程序或是系统的声音,因为这些应用使用不同的端点。 Oboe允许混合音频,Oboe会混合所有指定到音频设备上相同端点的分享串流。

Oboe音频串流的格式包含三种属性,样本格式、每帧样本以及采样率,开发者必须在定义串流时指定这些属性,Oboe可能会自动执行样本转换,而在任何串流方向上都可能发生转换,当开发者的应用程序处理音频输入,明智的作法则要事先验证格式,以便之后转换需要。

Oboe除了能在Orea MR1(API 27+)上利用了AAudio性能和功能的改进外,也维持在API 16+的向后兼容性。 Google表示,Oboe以C++编写而成,开发者能撰写较少的程序代码,只需要三行程序代码就能创建音频串流,但使用OpenSL ES则需要超过50行程序代码。另外,Oboe是以函数库的方式发布,因此有独立更快的更新周期,而非Android平台的发布周期。