【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 )
文章目錄
- 一、檢查 Oboe 音頻流屬性
- 二、開始播放
- 三、停止播放
- 四、關(guān)閉音頻流
- 五、重新配置 Oboe 音頻流屬性
Oboe GitHub 主頁 : GitHub/Oboe
-
① 簡單使用 : Getting Started
-
② Oboe 全指南 : Full Guide To Oboe
-
③ Oboe API 參考 : API reference
-
④ Android 音頻框架發(fā)展 : Android audio history
在 【Android 高性能音頻】Oboe 開發(fā)流程 ( 導(dǎo)入 Oboe 庫 | 使用預(yù)構(gòu)建的二進(jìn)制庫和頭文件 | 編譯 Oboe 源碼 ) 博客中介紹了 如何導(dǎo)入 Oboe 函數(shù)庫到項(xiàng)目中 , 本博客中在導(dǎo)入 Oboe 函數(shù)庫的基礎(chǔ)上 , 進(jìn)行 Oboe 播放器功能開發(fā) ;
在 【Android 高性能音頻】Oboe 開發(fā)流程 ( 包含頭 Oboe 頭文件 | 創(chuàng)建音頻流 | 設(shè)置音頻流 | 音頻流回調(diào)類 AudioStreamCallback ) 介紹了如何創(chuàng)建 AudioStreamBuilder , 以及 創(chuàng)建 AudioStreamCallback 回調(diào) ;
在 【Android 高性能音頻】Oboe 開發(fā)流程 ( 創(chuàng)建并設(shè)置 AudioStreamCallback 對象 | 打開 Oboe 音頻流 | 日志封裝 logging_macros.h ) 博客中介紹了 設(shè)置 AudioStreamCallback 對象 , 打開 Oboe 音頻流 操作 , 以及 Google 官方提供的日志封裝有文件 ;
一、檢查 Oboe 音頻流屬性
檢查已創(chuàng)建的 Oboe 音頻流屬性 , 如果沒有指定 聲道數(shù) , 采樣率 , 采樣格式 , 需要檢查其默認(rèn)的 Oboe 音頻流配置 , 如果指定了這三個屬性中的任意一個值 , 就會得到指定的值 ;
推薦手動設(shè)置上述三個值 , 不要讓系統(tǒng)自動設(shè)置 ;
采樣格式 屬性指定的是 oboe::AudioStreamCallback 中的 onAudioReady 回調(diào)方法的 void *audioData 緩沖區(qū)的音頻類型 ;
virtual DataCallbackResult onAudioReady(AudioStream *oboeStream,void *audioData,int32_t numFrames) = 0;獲取音頻采樣格式 , 并打印出來 :
// 獲取采樣格式 oboe::AudioFormat format = stream->getFormat();// 打印采樣格式 LOGI("AudioStream format is %s", oboe::convertToText(format));二、開始播放
調(diào)用 oboe::ManagedStream 音頻流的 requestStart() 方法 , 可以開啟 Oboe 音頻播放 ;
// 3. 開始播放result = managedStream->requestStart();LOGI("requestStart result : %s", oboe::convertToText(result));三、停止播放
調(diào)用 oboe::ManagedStream 音頻流的 requestStop() 方法 , 可以停止 Oboe 音頻播放 ;
// 停止播放result = managedStream->requestStop();LOGI("requestStart result : %s", oboe::convertToText(result));四、關(guān)閉音頻流
當(dāng)不使用 Oboe 音頻流時 , 必須關(guān)閉該音頻流 , 因?yàn)?Oboe 音頻流會占用音頻設(shè)備資源 ;
尤其是設(shè)置的 Oboe 音頻流 共享模式 SharingMode 是獨(dú)占模式 Exclusive 時 , 只要該音頻流不關(guān)閉 , 其它的音頻流將無法訪問該低延遲音頻流 ;
不再播放音頻時 , 要及時關(guān)閉 Oboe 音頻流 , 建議在 Activity 界面中的 onPause 方法中關(guān)閉音頻流 ;
顯示關(guān)閉 Oboe 音頻流 : 直接 調(diào)用音頻流的 close() 方法 , 顯示關(guān)閉音頻流 ; 該方法是一個阻塞調(diào)用 , 調(diào)用后 , 會停止音頻流播放 ;
managedStream ->close();Oboe 音頻流超出作用域自動關(guān)閉 : 棧內(nèi)存音頻流超出作用域時 , 會自動關(guān)閉該 Oboe 音頻流 ;
{ManagedStream mStream;AudioStreamBuilder().build(mStream);mStream->requestStart(); } // 超出作用域音頻流自動關(guān)閉五、重新配置 Oboe 音頻流屬性
如果要修改現(xiàn)有 Oboe 音頻流的配置 , 只需要 先設(shè)置對應(yīng)屬性 后 , 再調(diào)用 oboe::AudioStreamBuilder 構(gòu)建器的 openManagedStream 方法 即可 , 調(diào)用該方法后, 會關(guān)閉銷毀現(xiàn)有的 Oboe 音頻流 , 然后會 重新創(chuàng)建新的 Oboe 音頻流 ;
// 在 Oboe 音頻流運(yùn)行時 , 通過構(gòu)建器修改音頻流屬性 builder.setDeviceId(MY_DEVICE_ID);// 重新打開設(shè)置了新屬性的音頻流 // 舊的 Oboe 音頻流會被自動關(guān)閉并銷毀 builder.openManagedStream(managedStream);最佳實(shí)踐 :
- 手動關(guān)閉銷毀 : 使用 Oboe 音頻流 ManagedStream 時 , 需要 手動負(fù)責(zé)關(guān)閉 和 銷毀操作 ;
- 自動關(guān)閉銷毀 : 如果在自動分配上下文的環(huán)境中 , 如該 音頻流作為類的成員變量 , 當(dāng)應(yīng)用中不再使用音頻流時 , 確保該 Oboe 音頻流對象超出了封閉的作用范圍 ;
總結(jié)
以上是生活随笔為你收集整理的【Android 高性能音频】Oboe 开发流程 ( 检查 Oboe 音频流属性 | 开始播放 | 停止播放 | 关闭 Oboe 音频流 | 重新配置 Oboe 音频流属性 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 高性能音频】Oboe
- 下一篇: 【Android 高性能音频】Oboe