【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 )
文章目录
- 一、检查 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 官方提供的日志封装有文件 ;
一、检查 Oboe 音频流属性
检查已创建的 Oboe 音频流属性 , 如果没有指定 声道数 , 采样率 , 采样格式 , 需要检查其默认的 Oboe 音频流配置 , 如果指定了这三个属性中的任意一个值 , 就会得到指定的值 ;
推荐手动设置上述三个值 , 不要让系统自动设置 ;
采样格式 属性指定的是 oboe::AudioStreamCallback 中的 onAudioReady 回调方法的 void *audioData 缓冲区的音频类型 ;
virtual DataCallbackResult onAudioReady(AudioStream *oboeStream,void *audioData,int32_t numFrames) = 0;
获取音频采样格式 , 并打印出来 :
// 获取采样格式
oboe::AudioFormat format = stream->getFormat();// 打印采样格式
LOGI("AudioStream format is %s", oboe::convertToText(format));
二、开始播放
调用 oboe::ManagedStream 音频流的 requestStart() 方法 , 可以开启 Oboe 音频播放 ;
// 3. 开始播放result = managedStream->requestStart();LOGI("requestStart result : %s", oboe::convertToText(result));
三、停止播放
调用 oboe::ManagedStream 音频流的 requestStop() 方法 , 可以停止 Oboe 音频播放 ;
// 停止播放result = managedStream->requestStop();LOGI("requestStart result : %s", oboe::convertToText(result));
四、关闭音频流
当不使用 Oboe 音频流时 , 必须关闭该音频流 , 因为 Oboe 音频流会占用音频设备资源 ;
尤其是设置的 Oboe 音频流 共享模式 SharingMode 是独占模式 Exclusive 时 , 只要该音频流不关闭 , 其它的音频流将无法访问该低延迟音频流 ;
不再播放音频时 , 要及时关闭 Oboe 音频流 , 建议在 Activity 界面中的 onPause 方法中关闭音频流 ;
显示关闭 Oboe 音频流 : 直接 调用音频流的 close() 方法 , 显示关闭音频流 ; 该方法是一个阻塞调用 , 调用后 , 会停止音频流播放 ;
managedStream ->close();
Oboe 音频流超出作用域自动关闭 : 栈内存音频流超出作用域时 , 会自动关闭该 Oboe 音频流 ;
{ManagedStream mStream;AudioStreamBuilder().build(mStream);mStream->requestStart();
} // 超出作用域音频流自动关闭
五、重新配置 Oboe 音频流属性
如果要修改现有 Oboe 音频流的配置 , 只需要 先设置对应属性 后 , 再调用 oboe::AudioStreamBuilder 构建器的 openManagedStream 方法 即可 , 调用该方法后, 会关闭销毁现有的 Oboe 音频流 , 然后会 重新创建新的 Oboe 音频流 ;
// 在 Oboe 音频流运行时 , 通过构建器修改音频流属性
builder.setDeviceId(MY_DEVICE_ID);// 重新打开设置了新属性的音频流
// 旧的 Oboe 音频流会被自动关闭并销毁
builder.openManagedStream(managedStream);
最佳实践 :
- 手动关闭销毁 : 使用 Oboe 音频流 ManagedStream 时 , 需要 手动负责关闭 和 销毁操作 ;
- 自动关闭销毁 : 如果在自动分配上下文的环境中 , 如该 音频流作为类的成员变量 , 当应用中不再使用音频流时 , 确保该 Oboe 音频流对象超出了封闭的作用范围 ;
【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 )相关推荐
- 【Android 高性能音频】Oboe 开发流程 ( Oboe 音频帧简介 | AudioStreamCallback 中的数据帧说明 )
文章目录 一.音频帧概念 二.AudioStreamCallback 中的音频数据帧说明 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : Getting Started ② ...
- 【Android 高性能音频】Oboe 开发流程 ( Oboe 完整代码示例 )
文章目录 一.GitHub 地址 二.Oboe C++ 代码 三.日志封装 四.Activity 代码 五.AndroidManifest.xml 配置文件 六.CMakeLists.txt 构建脚本 ...
- 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )
文章目录 一.获得最佳延迟 二.Oboe 音频流 三.Oboe 音频设备 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : Getting Started ② Oboe 全指 ...
- 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )
文章目录 一.包含头 Oboe 头文件 二.音频流构建器 AudioStreamBuilder 三.音频流回调 AudioStreamCallback Oboe GitHub 主页 : GitHub/ ...
- 【Android 高性能音频】Oboe 开发流程 ( 创建并设置 AudioStreamCallback 对象 | 打开 Oboe 音频流 | 日志封装 logging_macros.h )
文章目录 一.创建并设置 AudioStreamCallback 对象 二.打开 Oboe 音频流 三.日志封装 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : Getti ...
- 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 动态注册广播接收者监听耳机插拔事件 | 重新打开 Oboe 音频流 )
文章目录 一.动态注册广播接收者监听耳机插拔事件 二.jni 层的 Oboe 播放器代码 ( 重新打开 Oboe 音频流 ) 三.相关资料 基于 [Android 高性能音频]Oboe 开发流程 ( ...
- 【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )
文章目录 一.Oboe 输出测试参数面板 二.Oboe 输出测试参数 API 及 设备选择 三.Oboe 输出测试参数 音频参数 四.Oboe 输出测试参数 播放偏好 五.Oboe 输出测试参数 ( ...
- 【Android 高性能音频】OboeTest 音频性能测试应用 ( 应用简介 | 测试内容 | 输出测试 | Oboe 缓冲区 与 工作负载修改 | 测试案例 )
文章目录 一.Oboe 测试应用 二.Oboe 测试内容 三.Oboe 输出测试 四.Oboe 缓冲区 与 工作负载修改 五.Oboe 输出测试 ( Pixel 2 | Android 10 ) 一. ...
- 【Android 高性能音频】AAudio 音频库 简介 ( AAudio 音频库简介 | 音频流 | 音频设备 | 共享模式 | 数据模式 )
文章目录 I . AAudio 音频库 简介 II . AAudio 音频流 三要素 ( 设备 | 共享模式 | 数据格式 ) III . AAudio 音频设备 IV . AAudio 音频设备获取 ...
最新文章
- Hrefer教程【超越官方】
- CentOS 7系统关闭yum自动下载更新
- 全球及中国有机肥料行业投资价值与营销品牌战略报告2022版
- python用二分法求平方根_Python使用二分法求平方根的简单示例
- GDB and core
- js读取服务器上的txt文件,javascript – 每15秒读取一次文本文件的内容
- 给即将35岁的产品经理提个醒
- 写给你的数据结构教程(第一天)
- 简单api_GraphQL API集成的简要介绍
- Go语言学习之GOPATH
- Tcpdump抓包命令使用
- python元组和列表都支持的方法是_Python进阶1-元组和列表
- World Wind Java开发之十四——添加WMS地图服务资源(转)
- 小腹右侧突然疼了一下_腰椎间盘膨出,为什么不是脊椎柱中间疼,而是左侧疼?...
- webpack之loader篇
- 应用程序框架实战四:你需要应用程序框架吗
- html怎么改表格背景,javascript修改表格背景色实例代码分享
- 【Linux】Ubuntu20.04 无法访问 http://cn.archive.ubuntu.com 问题记录解决
- 安装infinity后主页始终显示百度页面?
- iso文件用什么打开?还有iso是什么东西?
热门文章
- 穿透Session 0 隔离(一)
- Java代码-CPU占用过高排查思路
- APICloud学习第二天——操作云数据库
- 一、静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。...
- 20165301 预备作业三:Linux安装及命令入门
- BZOJ4076 : [Wf2014]Maze Reduction
- vs.net设计器里加载派生窗口类时要执行父窗口的Form_Load方法
- 关于Map迭代循环,key和value的顺序问题
- 【剑指offer】面试题 5. 替换空格
- Oracle 创建数据表以及对数据表、字段、主外键、约束的操作