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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )

發(fā)布時間:2025/6/17 Android 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、包含頭 Oboe 頭文件
  • 二、音頻流構建器 AudioStreamBuilder
  • 三、音頻流回調 AudioStreamCallback



Oboe GitHub 主頁 : GitHub/Oboe

  • ① 簡單使用 : Getting Started

  • ② Oboe 全指南 : Full Guide To Oboe

  • ③ Oboe API 參考 : API reference

  • ④ Android 音頻框架發(fā)展 : Android audio history


在 【Android 高性能音頻】Oboe 開發(fā)流程 ( 導入 Oboe 庫 | 使用預構建的二進制庫和頭文件 | 編譯 Oboe 源碼 ) 博客中介紹了 如何導入 Oboe 函數(shù)庫到項目中 , 本博客中在導入 Oboe 函數(shù)庫的基礎上 , 進行 Oboe 播放器功能開發(fā) ;





一、包含頭 Oboe 頭文件



#include <oboe/Oboe.h>



二、音頻流構建器 AudioStreamBuilder



創(chuàng)建 AudioStreamBuilder 對象 :

// 音頻流構建器 oboe::AudioStreamBuilder builder = oboe::AudioStreamBuilder();

通過 AudioStreamBuilder 配置 Oboe 音頻流 : 配置 音頻流方向 , 性能優(yōu)先級 , 共享模式 , 音頻采樣格式 , 聲道數(shù) ;

// 設置音頻流方向 builder.setDirection(oboe::Direction::Output); // 設置性能優(yōu)先級 builder.setPerformanceMode(oboe::PerformanceMode::LowLatency); // 設置共享模式 , 獨占 builder.setSharingMode(oboe::SharingMode::Exclusive); // 設置音頻采樣格式 builder.setFormat(oboe::AudioFormat::Float); // 設置聲道數(shù) , 單聲道/立體聲 builder.setChannelCount(oboe::ChannelCount::Mono);



三、音頻流回調 AudioStreamCallback



定義 音頻流回調類 AudioStreamCallback , 當 音頻流需要新的 PCM 音頻數(shù)據(jù)時 , 會自動回調 AudioStreamCallback 類 中的 onAudioReady 方法 ;


下面是文檔中給出的代碼示例 : 這是 Google 文檔中給出的示例 , 僅做參考 ;

class MyCallback : public oboe::AudioStreamCallback { public:oboe::DataCallbackResultonAudioReady(oboe::AudioStream *audioStream, void *audioData, int32_t numFrames) {// 請求音頻格式 AudioFormat::Float , 假設已經(jīng)得到了相應數(shù)據(jù).// 對于生產(chǎn)者 ( 生產(chǎn)音頻 ) 代碼 , // 檢查音頻流中的音頻數(shù)據(jù)格式 , 與自己生產(chǎn)的音頻數(shù)據(jù)格式是否一致// 如果不一致需要轉轉數(shù)據(jù)類型// 這里將數(shù)據(jù)類型轉為生產(chǎn)的數(shù)據(jù)類型 auto *outputData = static_cast<float *>(audioData);// 生成隨機數(shù) (白噪音) 以 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 命名空間下 ,

① 數(shù)據(jù)格式 : 對于輸出流 , 該方法應該渲染和寫出指定幀數(shù)的數(shù)據(jù)到音頻數(shù)據(jù)緩沖區(qū)中 , 這些數(shù)據(jù)的格式與當前流的格式相同 , 如果不一致需要轉轉數(shù)據(jù)類型 ;

② 輸出流 : 對于輸出流 , 該方法應該 渲染和寫出指定幀數(shù)的數(shù)據(jù)到音頻數(shù)據(jù)緩沖區(qū)中 , 這些數(shù)據(jù)的格式與當前流的格式相同 ;

③ 輸入流 : 對于輸入流 , 該方法應該 從音頻數(shù)據(jù)緩沖區(qū)中讀取和處理相應幀數(shù)的數(shù)據(jù) ;

④ 數(shù)據(jù)傳遞 : 音頻數(shù)據(jù)通過緩沖區(qū)傳遞 , 不需要額外在音頻流中調用 read() 或 write() 方法 ;

⑤ 該方法中不能進行如下操作 :

  • 分配內存操作 , 如 malloc() 或者 new 操作
  • 文件操作 , 如打開 , 讀取 , 寫出 , 關閉 等文件操作
  • 網(wǎng)絡相關操作
  • 使用互斥操作 或 同步操作 , 即不能在該方法中阻塞等待
  • 休眠 sleep
  • Oboe 音頻流的 oboeStream->stop(), pause(), flush() or close() 操作
  • Oboe 音頻流的 oboeStream->read() 操作
  • Oboe 音頻流的 boeStream->write() 操作

總的來說 , 該方法可能要在 1 秒鐘內調用幾百上千次 , 不能做任何耗時操作 ;

⑥ 在該回調函數(shù)中可以進行的操作:

  • oboeStream->get*()
  • oboe::convertToText()
  • oboeStream->setBufferSizeInFrames()
#ifndef OBOE_STREAM_CALLBACK_H #define OBOE_STREAM_CALLBACK_H#include "oboe/Definitions.h"namespace oboe {class AudioStream;/*** AudioStreamCallback 定義了如下回調接口:** 1) 通過 'onAudioReady' 方法 , 將數(shù)據(jù)放入/取出音頻流* 2) 當音頻流出現(xiàn)錯誤 , 回調 `onError*` 方法用于示警**/ class AudioStreamCallback { public:virtual ~AudioStreamCallback() = default;/*** 緩沖區(qū)已經(jīng)準備好進行相應處理.** 對于輸出流 , 該方法應該渲染和寫出指定幀數(shù)的數(shù)據(jù)到音頻數(shù)據(jù)緩沖區(qū)中 , * 這些數(shù)據(jù)的格式與當前流的格式相同* * 對于輸入流 , 該方法應該從音頻數(shù)據(jù)緩沖區(qū)中讀取和處理相應幀數(shù)的數(shù)據(jù) .* * 音頻數(shù)據(jù)通過緩沖區(qū)傳遞 . * 不需要額外在音頻流中調用 read() 或 write() 方法 .** 除非調用 AudioStreamBuilder::setFramesPerCallback() 方法 , * 讀寫的幀數(shù)可以改變 .* * 該回調函數(shù)應該被看做實時的 .* 在該函數(shù)中不應該執(zhí)行任何耗時操作 , 否則會導致音頻電流等故障 ; * * 該方法中不能進行如下操作 : * 1. 分配內存操作 , 如 malloc() 或者 new 操作 * 2. 文件操作 , 如打開 , 讀取 , 寫出 , 關閉 等文件操作 * 3. 網(wǎng)絡相關操作* 4. 使用互斥操作 或 同步操作 , 即不能在該方法中阻塞等待* 5. 休眠 sleep * 6. Oboe 音頻流的 oboeStream->stop(), pause(), flush() or close() 操作 * 7. Oboe 音頻流的 oboeStream->read() 操作 * 8. Oboe 音頻流的 boeStream->write() 操作 * 總的來說 , 該方法可能要在 1 秒鐘內調用幾百上千次 , 不能做任何耗時操作 ; ** 在該回調函數(shù)中可以進行的操作:* 1. oboeStream->get*()* 2. oboe::convertToText()* 3. oboeStream->setBufferSizeInFrames()* * 如果你需要移動數(shù)據(jù) , 如 MIDI 指令 , 傳入/傳輸?shù)皆摶卣{類方法中 , 推薦使用非阻塞技術 , 如 atomic FIFO .** @param oboeStream Oboe 音頻流指針 * @param audioData 輸入/輸出 音頻數(shù)據(jù)緩沖區(qū)* @param numFrames 要處理的幀數(shù) * @return DataCallbackResult::Continue or DataCallbackResult::Stop*/virtual DataCallbackResult onAudioReady(AudioStream *oboeStream,void *audioData,int32_t numFrames) = 0; };} // namespace oboe#endif //OBOE_STREAM_CALLBACK_H

總結

以上是生活随笔為你收集整理的【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )的全部內容,希望文章能夠幫你解決所遇到的問題。

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