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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 高性能音频】Oboe 开发流程 ( Oboe 音频帧简介 | AudioStreamCallback 中的数据帧说明 )

發布時間:2025/6/17 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 高性能音频】Oboe 开发流程 ( Oboe 音频帧简介 | AudioStreamCallback 中的数据帧说明 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、音頻幀概念
  • 二、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 播放器功能開發 ;

在 【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 播放器案例 ;







一、音頻幀概念



代表一個 聲音單元 , 該單元中的 采樣個數 聲道數 ;

該 聲音單元 ( 幀 ) 中的 采樣大小樣本位數聲道數 乘積 ;


下面的代碼是 【Android 高性能音頻】Oboe 開發流程 ( Oboe 完整代碼示例 ) 博客中的 Oboe 音頻流創建時 的代碼 , 設置 Oboe 音頻流 的參數如下 ;


設置的 采樣格式 是 oboe::AudioFormat::Float , 每個采樣都是一個 float 單精度浮點數 , 444 字節 ;

設置的 聲道數 是 oboe::ChannelCount::Stereo , 立體聲 , 左右雙聲道 ;

則對應的 111 個音頻幀 中包含 222 個采樣 , 左聲道 111 個采樣 , 右聲道 111 個采樣 , 每個采樣是 444 字節的單精度浮點類型 float 類型 ;

上述 111 個音頻幀的字節大小是 2×4=82\times 4 = 82×4=8 字節 ;

// 1. 音頻流構建器oboe::AudioStreamBuilder builder = oboe::AudioStreamBuilder();// 設置音頻流方向builder.setDirection(oboe::Direction::Output);// 設置性能優先級builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);// 設置共享模式 , 獨占builder.setSharingMode(oboe::SharingMode::Exclusive);// 設置音頻采樣格式builder.setFormat(oboe::AudioFormat::Float);// 設置聲道數 , 單聲道/立體聲builder.setChannelCount(oboe::ChannelCount::Stereo);// 設置采樣率builder.setSampleRate(48000);// 設置回調對象 , 注意要設置 AudioStreamCallback * 指針類型builder.setCallback(&myCallback);

如果設置的 采樣格式 是 oboe::AudioFormat::I16 , 每個采樣都是一個 161616 位整型 , 222 字節 , 相當于 short 類型 ;

設置的 聲道數 是 oboe::ChannelCount::Stereo , 立體聲 , 左右雙聲道 ;

則對應的 111 個音頻幀 中包含 222 個采樣 , 左聲道 111 個采樣 , 右聲道 111 個采樣 , 每個采樣是 222 字節的 short 類型 ;

上述 111 個音頻幀的字節大小是 2×2=42\times 2 = 42×2=4 字節 ;





二、AudioStreamCallback 中的音頻數據幀說明



在 Oboe 播放器回調類 oboe::AudioStreamCallback 中 , 實現的 onAudioReady 方法 ,

其中的 int32_t numFrames 就是本次需要采樣的幀數 ,

注意單位是音頻幀 ,

這里的音頻幀就是上面所說的

采樣格式 是 oboe::AudioFormat::Float , 每個采樣都是一個 float 單精度浮點數 , 444 字節 ,

聲道數 是 oboe::ChannelCount::Stereo , 立體聲 , 左右雙聲道 ,

對應的 111 個音頻幀 中包含 222 個采樣 , 左聲道 111 個采樣 , 右聲道 111 個采樣 , 每個采樣是 444 字節的單精度浮點類型 float 類型 ;

上述 111 個音頻幀的字節大小是 2×4=82\times 4 = 82×4=8 字節 ;


因此在該方法中的后續采樣 , 每幀都要采集 222 個樣本 , 每個樣本 444 字節 , 每幀采集 888 字節的樣本 ,

總共 numFrames 幀需要采集 numFrames 乘以 888 字節的音頻采樣 ;


在 onAudioReady 方法中 , 需要 采集 8×8 \times8× numFrames 字節 的音頻數據樣本 , 并將數據拷貝到 void *audioData 指針指向的內存中 ;

// Oboe 音頻流回調類 class MyCallback : public oboe::AudioStreamCallback { public:oboe::DataCallbackResultonAudioReady(oboe::AudioStream *audioStream, void *audioData, int32_t numFrames) {// 需要生成 AudioFormat::Float 類型數據 , 該緩沖區類型也是該類型// 生產者需要檢查該格式// oboe::AudioStream *audioStream 已經轉換為適當的類型// 獲取音頻數據緩沖區auto *floatData = static_cast<float *>(audioData);// 生成正弦波數據for (int i = 0; i < numFrames; ++i) {float sampleValue = kAmplitude * sinf(mPhase);for (int j = 0; j < kChannelCount; j++) {floatData[i * kChannelCount + j] = sampleValue;}mPhase += mPhaseIncrement;if (mPhase >= kTwoPi) mPhase -= kTwoPi;}LOGI("回調 onAudioReady");return oboe::DataCallbackResult::Continue;} };

總結

以上是生活随笔為你收集整理的【Android 高性能音频】Oboe 开发流程 ( Oboe 音频帧简介 | AudioStreamCallback 中的数据帧说明 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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