【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )
文章目錄
- 一、包含頭 Oboe 頭文件
- 二、音頻流構建器 AudioStreamBuilder
- 三、音頻流回調 AudioStreamCallback
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 播放器功能開發 ;
一、包含頭 Oboe 頭文件
#include <oboe/Oboe.h>
二、音頻流構建器 AudioStreamBuilder
創建 AudioStreamBuilder 對象 :
// 音頻流構建器 oboe::AudioStreamBuilder builder = oboe::AudioStreamBuilder();通過 AudioStreamBuilder 配置 Oboe 音頻流 : 配置 音頻流方向 , 性能優先級 , 共享模式 , 音頻采樣格式 , 聲道數 ;
// 設置音頻流方向 builder.setDirection(oboe::Direction::Output); // 設置性能優先級 builder.setPerformanceMode(oboe::PerformanceMode::LowLatency); // 設置共享模式 , 獨占 builder.setSharingMode(oboe::SharingMode::Exclusive); // 設置音頻采樣格式 builder.setFormat(oboe::AudioFormat::Float); // 設置聲道數 , 單聲道/立體聲 builder.setChannelCount(oboe::ChannelCount::Mono);三、音頻流回調 AudioStreamCallback
定義 音頻流回調類 AudioStreamCallback , 當 音頻流需要新的 PCM 音頻數據時 , 會自動回調 AudioStreamCallback 類 中的 onAudioReady 方法 ;
下面是文檔中給出的代碼示例 : 這是 Google 文檔中給出的示例 , 僅做參考 ;
class MyCallback : public oboe::AudioStreamCallback { public:oboe::DataCallbackResultonAudioReady(oboe::AudioStream *audioStream, void *audioData, int32_t numFrames) {// 請求音頻格式 AudioFormat::Float , 假設已經得到了相應數據.// 對于生產者 ( 生產音頻 ) 代碼 , // 檢查音頻流中的音頻數據格式 , 與自己生產的音頻數據格式是否一致// 如果不一致需要轉轉數據類型// 這里將數據類型轉為生產的數據類型 auto *outputData = static_cast<float *>(audioData);// 生成隨機數 (白噪音) 以 0 為中心值 .const float amplitude = 0.2f;for (int i = 0; i < numFrames; ++i){outputData[i] = ((float)drand48() - 0.5f) * 2 * amplitude;}return oboe::DataCallbackResult::Continue;} };AudioStreamCallback 類簡介 : 該類定義在 oboe 命名空間下 ,
① 數據格式 : 對于輸出流 , 該方法應該渲染和寫出指定幀數的數據到音頻數據緩沖區中 , 這些數據的格式與當前流的格式相同 , 如果不一致需要轉轉數據類型 ;
② 輸出流 : 對于輸出流 , 該方法應該 渲染和寫出指定幀數的數據到音頻數據緩沖區中 , 這些數據的格式與當前流的格式相同 ;
③ 輸入流 : 對于輸入流 , 該方法應該 從音頻數據緩沖區中讀取和處理相應幀數的數據 ;
④ 數據傳遞 : 音頻數據通過緩沖區傳遞 , 不需要額外在音頻流中調用 read() 或 write() 方法 ;
⑤ 該方法中不能進行如下操作 :
- 分配內存操作 , 如 malloc() 或者 new 操作
- 文件操作 , 如打開 , 讀取 , 寫出 , 關閉 等文件操作
- 網絡相關操作
- 使用互斥操作 或 同步操作 , 即不能在該方法中阻塞等待
- 休眠 sleep
- Oboe 音頻流的 oboeStream->stop(), pause(), flush() or close() 操作
- Oboe 音頻流的 oboeStream->read() 操作
- Oboe 音頻流的 boeStream->write() 操作
總的來說 , 該方法可能要在 1 秒鐘內調用幾百上千次 , 不能做任何耗時操作 ;
⑥ 在該回調函數中可以進行的操作:
- oboeStream->get*()
- oboe::convertToText()
- oboeStream->setBufferSizeInFrames()
總結
以上是生活随笔為你收集整理的【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】Android Studio
- 下一篇: 【Android 高性能音频】Oboe