【Oboe——Android低延迟音频应用开发库使用介绍】

【Oboe——Android低延迟音频应用开发库使用介绍】Oboe Android 低延迟音频应用开发库使用介绍 一 背景 Oboe 是一个 C 库 是 Google 于 2018 年开发用来为 Android 打造高性能的互动音频体验 可在 99 的安卓设备上实现最低可能延迟 目前常见的音频开发方式有基于 MediaPlayer AudioTrack

大家好,我是讯享网,很高兴认识大家。

Oboe——Android低延迟音频应用开发库使用介绍

一、 背景

Oboe是一个C++库,是Google于2018年开发用来为Android打造高性能的互动音频体验,可在99%的安卓设备上实现最低可能延迟。目前常见的音频开发方式有基于MediaPlayer、AudioTrack、AudioRecord等javaAPI实现音频的采集与播放,其延迟基本在秒级,也就0.2-0.5秒,如在一些对延迟要求较高的场景下,使用Java层级的API是无法实现高性能音频。

二、 集成

Oboe是由OpenSL ES和AAudio组成的,前者是一套无授权费、跨平台、针对嵌入式系统精心优化的硬件音频加速API;后者是Android 8.0版本后中引入的音频库,是Google专门为高性能音频设计开发的。在Oboe上,API level27以上使用的是AAudio,27以下使用的是OpenSL ES。更多的信息可以参考链接: link

首先,从GitHub上下载代码,下载完成后根据Guide进行集成即可,Oboe提供了两种集成方式:

  1. 如果只想在项目中使用稳定版本的Oboe,可以直接从Maven中依赖编译好的库版本,需要使用Android studio4.0或者更高版本,将Oboe依赖项添加到项目的build.gradle文件中,用最新稳定版本替换“X.X.X.”;
dependencies { implementation 'com.google.oboe:oboe:X.X.X' } android { buildFeatures { prefab true } } 

讯享网

并在CMakeList.txt中进行配置

讯享网find_package (oboe REQUIRED CONFIG) # 查找 Oboe 函数库 target_link_libraries(app oboe::oboe) # 连接函数库 , app 就是 Native 层编译的动态库 , 给 Java 层使用的 
  1. 如果想调试或更改Oboe源码,需要从导入源代码后构建使用,首先需要下载代码,并将demo放在工程目录下,并记录该目录的路径,本文使用该方法集成Oboe。
    然后编辑CMakeList.txt构建脚本
#设置Oboe源代码路径 set (OBOE_DIR ../../../../../../oboe-main) #将Oboe源码目录设置为工程的子路径 add_subdirectory (${OBOE_DIR} ./oboe) #指定Oboe源码的头文件路径 include_directories (${OBOE_DIR}/include) #完整的CMakeList.txt文件如下,请对照自己的工程进行修改 cmake_minimum_required(VERSION 3.4.1) #Build our own native library add_library (native-lib SHARED native-lib.cpp ) #Build the Oboe library set (OBOE_DIR ../../../../../../oboe-main) add_subdirectory (${OBOE_DIR} ./oboe) #Make the Oboe public headers available to our app include_directories (${OBOE_DIR}/include) #Specify the libraries which our native library is dependent on, including Oboe target_link_libraries (native-lib log oboe) 

之后点击Build->Refresh Linked C++ Projects即可


讯享网

三、 使用介绍

Oboe的头文件是Oboe/Oboe.h,首先,要在工程中包含该头文件,音频流包括采集流和播放流是通过oboe::AudioStreamBuilder builder进行创建的,然后可以通过builder的set方法设置流的属性,更详细的介绍可以从github上的full guide中获取。

下面根据本文实现的采集和播放功能进行介绍,首先本文设计了一个虚类:
类
基类继承了Oboe::AudioStreamCallback类,AudioStreamCallback中的onAudioReady函数是用于与Oboe交互音频数据的重要函数,需要在子类中实现。
在这里插入图片描述
SetDeviceId函数作用是:设置设备ID,例如采集端设备ID或者播放端设别ID;
Init函数作用是:初始化,根据通道数、采样率和位宽创建AudioStreamBuilder;
StartStream作用是:开启音频流;
CloseStream作用是:关闭音频流;
下面是本文采集模块的具体实现:
在这里插入图片描述
首先需要创建采集对应的AudioStreamBuilder,然后调用set方法设置属性,
setDataCallback->设置采集回调函数给Oboe;
setDirection->设置流的方向,Input表示采集,Output表示播放;
setFramesPerCallback->设置回调的间隔,如果希望获取更低的延迟,Oboe推荐不设置该属性;
setChannelCount->用于设置通道;
setSampleRate->用于设置采样率;
setFormat->用于设置位宽,Oboe支持Float;
setSharingMode->用于设置共享模式,Exclusive为独占,Shared为共享,共享表示多个应用可以共享同一设备,Oboe推荐使用Shared模式,该模式下可获取更低的延迟;
setFormatConversionAllowed->表示是否支持内部自行转换位宽;
setPerformanceMode->表示性能模式,None-无需关注,PowerSaving-省电模式,LowLatency-低延迟;
在这里插入图片描述
接下来开启音频流即可,调用流程较为简单
在这里插入图片描述
关闭同理
在这里插入图片描述
这里重点介绍一下回调函数onAudioReady,本文中将采集到的音频储存到了sdcard下,这里并没有用到回调中的audiostream和audiodata变量(如果采集和播放回调设置为同一个onAudioReady,可以从audiostream中获取采集到的数据,并把需要播放的数据拷贝给audiodata,有需要可以参考官方demo),numFrams是指回调的音频帧数,这里的音频帧是指一个采样点。
在这里插入图片描述
播放模块的具体实现与采集大同小异,区别主要在于:
set属性时方向需要设置为Output,而且属性较采集来说少一些。

在这里插入图片描述
StartStream和CloseStream的逻辑与采集相同,此处不再赘述。
播放模块的回调函数里要将需要播放的音频填充到audioData指向的缓冲区,长度为numFrames。
在这里插入图片描述
至此,Oboe的采集和播放的简单功能就介绍完毕了。

四、 总结

在这里插入图片描述
上图是音频流的一个走向,本文只是简单的使用介绍,更复杂的功能和操作请参考API 指南 https://google.github.io/oboe/reference/ 和 代码样例 https://github.com/google/oboe/tree/master/samples。

小讯
上一篇 2025-03-03 07:31
下一篇 2025-02-15 16:56

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/53657.html