【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 )

简介: 【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开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
9月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
259 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
Android开发
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
|
Android开发
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
|
Android开发
Android 利用MediaPlayer实现音乐播放
本文提供了一个简单的Android MediaPlayer音乐播放示例,包括创建PlayerActivity、配置AndroidManifest.xml和activity_player.xml布局,以及实现播放和暂停功能的代码。
379 0
Android 利用MediaPlayer实现音乐播放
|
编解码 网络协议 开发工具
Android平台如何实现多路低延迟RTSP|RTMP播放?
本文档详细介绍了大牛直播SDK在Android平台上实现RTSP与RTMP流媒体播放及录像功能的技术细节。早在2015年,SDK的第一版就已经支持了多实例播放,并且通过简单的实例封装就能轻松实现。文档中提供了代码示例,展示了如何开启播放、停止播放以及开始和停止录像等功能。此外,SDK还提供了丰富的配置选项,例如设置录像目录、文件大小限制、转码选项等。总结部分列出了该SDK的关键特性,包括但不限于高稳定性和低延迟的播放能力、多实例支持、事件回调、硬解码支持、网络状态监控以及复杂的网络环境处理等。这些功能使得SDK能够应对各种应用场景,特别是在对延迟和稳定性有极高要求的情况下表现优异。
487 5
|
编解码 网络协议 vr&ar
Android平台下VR头显如何低延迟播放4K以上超高分辨率RTSP|RTMP流
这段内容讲述了VR头显中实现高分辨率视频播放的技术背景与实现方法,并强调了其重要性。高分辨率对于提升VR体验至关重要,它能提供更清晰的画面、增强沉浸感、补偿透镜放大效应,并维持宽广视场角下的图像质量。文中提到的大牛直播SDK具备极低的延迟(200-400ms),支持多种协议与格式,并具有丰富的功能特性,如多实例播放、事件回调、视频及音频格式支持等。此外,提供了基于Unity的播放器示例代码,展示了如何配置播放参数并开始播放。最后,作者指出此类技术在远程控制、虚拟仿真等应用场景中的重要意义。
288 3
|
IDE 开发工具 Android开发
Android c++ core guideline checker 应用问题之clang-tidy 检查后发现的问题如何解决
Android c++ core guideline checker 应用问题之clang-tidy 检查后发现的问题如何解决
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
263 0
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
520 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章