日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )

發布時間:2025/6/17 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | 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 官方提供的日志封裝有文件 ;

在 【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 ) 及以上的版本 , 可以通過調用 AudioManagergetDevices() 方法 , 獲取當前的可用音頻設備 , 該方法會返回設備的類型和信息 ;


音頻設備 ID : 每個音頻設備都有一個 唯一的 ID 標識 , 使用該標識 , 可以實現將 音頻流 與 指定的 音頻設備進行綁定 ; 多數情況下 , 用戶不需要自己設置音頻設備 , Oboe 會自動選擇主設備 , 推薦讓 Oboe 自動選擇 , 不要進行手動干預 ;


音頻流方向 : 音頻設備 可以 決定該音頻流是 輸入流 還是 輸出流

  • 輸入流 : 麥克風 , 采集音頻數據 ; 設備 -> 內存 ;
  • 輸出流 : 揚聲器 , 播放音頻數據 ; 內存 -> 設備 ;

打開 Oboe 音頻流時 , 系統會檢查音頻流方向 , 如果你設置的是麥克風 , 但是音頻流方向設置成了輸出方向 , 那么打開音頻流操作就會出錯 ;

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。