【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )
文章目录
Oboe GitHub 主页 : GitHub/Oboe
- ① 简单使用 : Getting Started
- ② Oboe 全指南 : Full Guide To Oboe
- ③ Oboe API 参考 : API reference
- ④ Android 音频框架发展 : Android audio history
在 【Android 高性能音频】Oboe 开发流程 ( 导入 Oboe 库 | 使用预构建的二进制库和头文件 | 编译 Oboe 源码 ) 博客中介绍了 如何导入 Oboe 函数库到项目中 , 本博客中在导入 Oboe 函数库的基础上 , 进行 Oboe 播放器功能开发 ;
在 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback ) 介绍了如何创建 AudioStreamBuilder , 以及 创建 AudioStreamCallback 回调 ;
在 【Android 高性能音频】Oboe 开发流程 ( 创建并设置 AudioStreamCallback 对象 | 打开 Oboe 音频流 | 日志封装 logging_macros.h ) 博客中介绍了 设置 AudioStreamCallback 对象 , 打开 Oboe 音频流 操作 , 以及 Google 官方提供的日志封装有文件 ;
在 【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 ) 博客中介绍了 如何开始 Oboe 音频流播放 , 以及 播放完毕后的收尾工作 ;
在 【Android 高性能音频】Oboe 开发流程 ( Oboe 完整代码示例 ) 博客中 , 介绍了 一个最简单的 Oboe 播放器开发流程 , 所有代码及应用配置 ;
一、获得最佳延迟
Oboe 库的目标是 提供低延迟音频流 ;
如果当前手机是 Android 8.0 Oreo( API Level 26 ) 及以上系统 , 就会自动选择 AAudio 打开音频流 , 系统会自动选择最佳配置 , framesPerBurst 也由 AAudio 提供 ;
如果当前手板版本 低于 Android 8.0 Oreo( API Level 26 ) , 此时会调用 OpenSL ES , OpenSL ES 播放器的参数需要完全由手动进行设置 ;
为 OpenSL ES 播放器设置 采样率 与 采样缓冲区参数 :
( 1 ) 在 Java 层获取采样率与采样缓冲区大小 :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
AudioManager myAudioMgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
// 获取采样率
String sampleRateStr = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
int defaultSampleRate = Integer.parseInt(sampleRateStr);
// 获取采样缓冲区
String framesPerBurstStr = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
int defaultFramesPerBurst = Integer.parseInt(framesPerBurstStr);
// 调用 Native 方法传入本地层
native_setDefaultStreamValues(defaultSampleRate, defaultFramesPerBurst);
}
( 2 ) 在 C++ 代码中设置 OpenSL ES 的参数 :
JNIEXPORT void JNICALL
Java_com_google_sample_oboe_hellooboe_MainActivity_native_1setDefaultStreamValues(JNIEnv *env,
jclass type,
jint sampleRate,
jint framesPerBurst) {
oboe::DefaultStreamValues::SampleRate = (int32_t) sampleRate;
oboe::DefaultStreamValues::FramesPerBurst = (int32_t) framesPerBurst;
}
上述的采样率 和 缓冲区大小是用于 设置 Android 设备内置音频设备 的 , 如 内置扬声器 , 听筒 ;
外置设备 , 如耳机 , 蓝牙音箱 需要设置更大的缓冲区 ;
二、Oboe 音频流
Oboe 的主要作用是在 Android 应用 和 Android 设备中的 音频 输入 / 输出 设备 之间 操作移动音频数据 ;
Android 应用 输入 / 输出 数据 方案 :
- 通过使用 回调函数 实现
- 直接从 音频流 中 读取 / 写出 数据
音频数据读写调用 , 可以是 阻塞的 ( 同步 ) , 也可以是 非阻塞的 ( 异步 ) ;
- 阻塞 : 调用后 , 阻塞等待回应 , 回应收到后 , 才往下执行 ;
- 非阻塞 : 调用后 , 不等待回应 , 直接向后执行后续代码 ;
音频流根据如下属性定义 :
- 音频流方向 : 音频设备作为 数据源 或 流数据接收器 ( 数据目的地 ) ;
- 共享模式 : 独占模式 / 共享模式 ; 独占模式 下音频流独占该设备 , 其它音频流不允许访问该设备 , 性能高 ; 共享模式 , 多个音频流可以同时访问该设备 , 性能低 ;
- 采样格式 : 音频流数据的采样格式 ;
三、Oboe 音频设备
音频设备与音频流对应关系 : 每个 Oboe 音频流都需要关联一个单独的音频设备 ; 注意对应关系 , 一个音频设备可以关联多个音频流 , 但是 一个音频流只能关联一个音频设备 ;
音频设备作用 : 音频设备是一个硬件接口或者虚拟端口 , 一般作为 连续的数字音频数据流的 源端 或 目的端 ; 音频设备作为 数据源 或 流数据接收器 ( 数据目的地 ) ;
音频设备举例 : Android 设备的 内置麦克风 , 扬声器 , 电话听筒 , 或外接的耳机 , 蓝牙音箱 等 ;
获取音频设备 : Android 6.0 Marshmallow( API Level 23 ) 及以上的版本 , 可以通过调用 AudioManager 的 getDevices() 方法 , 获取当前的可用音频设备 , 该方法会返回设备的类型和信息 ;
音频设备 ID : 每个音频设备都有一个 唯一的 ID 标识 , 使用该标识 , 可以实现将 音频流 与 指定的 音频设备进行绑定 ; 多数情况下 , 用户不需要自己设置音频设备 , Oboe 会自动选择主设备 , 推荐让 Oboe 自动选择 , 不要进行手动干预 ;
音频流方向 : 音频设备 可以 决定该音频流是 输入流 还是 输出流
- 输入流 : 麦克风 , 采集音频数据 ; 设备 -> 内存 ;
- 输出流 : 扬声器 , 播放音频数据 ; 内存 -> 设备 ;
打开 Oboe 音频流时 , 系统会检查音频流方向 , 如果你设置的是麦克风 , 但是音频流方向设置成了输出方向 , 那么打开音频流操作就会出错 ;
相关文章
- android autosize原理,Android屏幕适配头条:autosize的原理
- android 自定义progressdialog,自定义ProgressDialog
- android短信验证码方案,Android开发之属于你的短信验证码(一)
- Android Jetpack 导航组件 | Android 中文教学视频
- android scaleanimation动画,Android 的ScaleAnimation 缩放动画基本运用
- android toast显示时间,Android Toast自定义显示时间「建议收藏」
- Android n_android 反编译
- Android | 自定义格子拖拽填充效果
- Android进程间通信与逆向分析
- Android OpenGL ES 基础原理
- 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态库打包 | 头文件与函数库拷贝 | CMake 脚本配置 )
- 【Android 内存优化】Android 原生 API 图片压缩原理 ( 图片质量压缩方法 | 查找 Java 源码中的 native 方法对应的 C++ 源码 )
- 【Android 安全】DEX 加密 ( Proguard 混淆 | 将混淆后的报错信息转为原始报错信息 | retrace.bat 命令执行目录 | 暴露更少信息 )
- 【错误记录】Android 应用安装后出现两个启动图标 ( 排查应用及依赖库中配置了 android.intent.category.LAUNCHER 的 Activity )
- 【错误记录】Unity 安卓打包报错( Platform Android with graphics API OpenGLES3 is not supported with HDRP )
- Android Glide数据更新及内存缓存、硬盘缓存清理详解手机开发
- Android控制文字水平间距android:letterSpacing详解手机开发
- android异步操作详解手机开发
- 金山词霸下载 金山词霸v8.2.1 Android去广告版下载
- 开源正在毁掉 Android 吗?
- Android系统基于Linux内核,实现移动设备突破极限。(android linux内核)
- 实现跨越时效的大数据分析ES与Redis的实际应用(真实应用es和redis)
- 在android开发中尽量不要使用中文路径的问题详解
- Android去掉自定义dialog的白色边框的简单方法
- WAC启动Android模拟器transfererror:Read-onlyfilesystem错误解决方法
- Android实现新增及编辑联系人的方法
- Android中判断是否有前置摄像头、后置摄像头的方法