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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )

發布時間:2025/6/17 Android 28 豆豆

文章目錄

        • I . AAudio 音頻流內部緩沖區 與 音頻數據讀寫緩沖區 概念
        • II . AAudio 音頻流內部緩沖區 緩沖區幀容量 BufferCapacityInFrames 與 緩沖區幀大小 BufferSizeInFrames 區分
        • III . AAudio 音頻流內部緩沖區 緩沖區幀容量 BufferCapacityInFrames
        • IV . AAudio 音頻流內部緩沖區 緩沖區幀大小 BufferSizeInFrames
        • V . AAudio 音頻流內部緩沖區 脈沖串
        • VI . AAudio 音頻流內部緩沖區 工作機制 ( 播放音頻 )
        • VII . AAudio 音頻流內部緩沖區 優化
        • VIII . 音頻數據讀寫緩沖區



I . AAudio 音頻流內部緩沖區 與 音頻數據讀寫緩沖區 概念



1 . AAudio 音頻流內部緩沖區本質 : 該緩沖區是在音頻設備中進行維護的 , AAudio 音頻流會先將數據傳入該緩沖區 , 然后才進行播放 ;


2 . 音頻數據讀寫緩沖區 : 是在內存中維護的 , 其本質就是一個 void* 類型的數組 , 其數組字節大小由用戶設定 ;


3 . 概念區分 : 注意將 AAudio 音頻流內部緩沖區 與 音頻數據讀寫緩沖區 區分清楚 ; 兩個是完全不同的概念 ;



II . AAudio 音頻流內部緩沖區 緩沖區幀容量 BufferCapacityInFrames 與 緩沖區幀大小 BufferSizeInFrames 區分



下面要區分兩個概念 , 一個是緩沖區幀容量 BufferCapacityInFrames , 一個是緩沖區幀大小 BufferSizeInFrames , 這兩個開發者都可以設置 ;

  • ① 緩沖區幀容量 BufferCapacityInFrames : 是音頻設備的緩沖區最大值 ;
  • ② 緩沖區幀大小 BufferSizeInFrames : 用戶實際使用的緩沖區大小 , 小于等于 緩沖區容量 ;

做一個形象的比喻 , 水杯有 2L 的容量 , 最大可以裝 2L 水 , 2L 相當于緩沖區幀容量 ; 但是我們在水杯的 1.5L 位置畫了一個最高水位線 , 表示盛水時不能高于 1.5L , 這個 1.5L 就是我們使用的實際緩沖區幀大小 ;

每幀的樣本數就是通道數 , 單聲道每幀 1 個樣本 , 立體聲 每幀 2 個樣本 , 每個樣本的大小與樣本格式有關 , 16 位樣本 每個樣本 2 字節 ;



III . AAudio 音頻流內部緩沖區 緩沖區幀容量 BufferCapacityInFrames



AAudio 音頻流內部 緩沖區幀容量 : 音頻設備的緩沖區最大值 ;

  • ① 設置緩沖區最大容量 : 調用 AAudioStreamBuilder_setBufferCapacityInFrames() 方法可以設置音頻設備緩沖區最大容量 ;
  • ② 獲取緩沖區最大容量 : 調用 AAudioStream_getBufferCapacityInFrames() 方法可以獲取當前音頻設備緩沖區的最大容量 ;


IV . AAudio 音頻流內部緩沖區 緩沖區幀大小 BufferSizeInFrames



AAudio 音頻流內部緩沖區幀大小 : 為音頻設備設置了緩沖區最大容量 , 但是我們可能用不了這么大緩沖區 , 只使用其中一部分作為緩沖區 ;

  • ① 緩沖區幀大小 限制 : 緩沖區幀大小 BufferSizeInFrames 只能小于等于 緩沖區幀容量 BufferCapacityInFrames ;
  • ② 設置 緩沖區幀大小 作用 : 增加 緩沖區幀大小 BufferSizeInFrames 會增加音頻延遲 , 反之會減小延遲 ;
  • ③ 設置緩沖區幀大小 方法 : AAudioStreamBuilder_setBufferSizeInFrames() ;
  • ④ 獲取緩沖區幀大小 方法 : AAudioStreamBuilder_getBufferSizeInFrames() ;


V . AAudio 音頻流內部緩沖區 脈沖串



1 . 脈沖串概念 : 音頻設備讀取 音頻內部緩沖區數據時 , 會以離散的脈沖串形式從緩沖區中讀取音頻數據 , 每個脈沖串都包含多個音頻幀 ;


2 . 脈沖串設置 : 脈沖串包含的幀個數 , 以及脈沖串的讀取速度 , 這兩個屬性由 Android 系統控制 , 與音頻設備的電路相關 ;


3 . 脈沖串屬性固定 : 脈沖串的大小 和 速度 是無法修改的 , 可以根據 內部緩沖區 包含的脈沖串數量 設置內部緩沖區大小 ;


4 . 脈沖串 性能相關 設置 : AAudio 音頻流的 內部緩沖區幀大小 是 脈沖串大小的整數倍時 , 音頻延遲最短 ;



VI . AAudio 音頻流內部緩沖區 工作機制 ( 播放音頻 )



1 . 寫出數據到內部緩沖區 : 使用 AAudio 音頻流 播放音頻時 , 先將數據寫入 AAudio 音頻流的內部緩沖區 , 該過程會阻塞線程 , 直到寫入完成 ;

該緩沖區為音頻設備內部維護的


2 . AAudio 音頻流 會以 離散的 脈沖串形式 , 讀取內部緩沖區中的音頻數據 , 然后播放出來 ;


3 . 圖示 : 內部緩沖區工作機制如下圖 ;



VII . AAudio 音頻流內部緩沖區 優化



1 . AAudio 音頻流內部緩沖區優化步驟 : 設置一個合適的 緩沖區幀大小 BufferSizeInFrames , 先設置一個較大的緩沖區 , 逐步減小該緩沖區大小 , 監控 XRun ( 超限 或 欠載 ) 數值 , 當出現了上述情況 , 說明緩沖區減小到極限 , 出現了播放問題 , 此時再稍微將緩沖區調大 , 最終的緩沖區大小剛合適 , 兼顧性能與功能 ;

備選方案 : 先設置肯定出問題一個最小值 , 此時肯定會出現緩沖區不足的情況 , 逐步增加緩沖區大小 , 直到流暢讀寫為止 ;


2 . 調整時間 : 緩沖區大小調整的過程幾乎是一瞬間完成的 , 在開始播放第一幀數據時就已經完成 ;


3 . 靜音調整 : 緩沖區調整時 , 可以靜音初始化緩沖區大小 , 確保用戶聽不到電流聲 ;


4 . 不斷調整 : 在音頻播放的過程中 , 系統的性能可能隨時改變 , 這個緩沖區的大小也要跟著實時修改 , 一旦監測到了 欠載 UnderRun 或 超限 OverRun 就馬上調整緩沖區大小 ;


該過程可以參考上一篇博客 : 【Android 高性能音頻】AAudio 緩沖區控制 ( XRun | 欠載 UnderRun | 超限 OverRun | 獲取緩沖區大小 | 設置緩沖區大小 )



VIII . 音頻數據讀寫緩沖區



1 . 概念區分 ( AAudio 內部緩沖區 / 音頻讀寫緩沖區 ) : 該緩沖區是由用戶自己維護的 , 與 AAudio 音頻流緩沖區沒有任何關系 , 不要混淆這兩個概念 ;


2 . 緩沖區本質 : 音頻讀寫緩沖區是在堆內存中維護的 , 其本質就是一個 void* 類型的數組 , 其數組字節大小由用戶設定 ;


3 . 讀寫緩沖區作用 : 讀取音頻數據時 , 將音頻數據先讀取到該緩沖區中 ;


4 . 性能分析 : 該音頻數據讀寫緩沖區 與 采樣效率相關 , 采樣是需要消耗額外性能的 , 如果該緩沖區很大 , 一次采集很多樣本 , 采樣的效率會很高 , 但是減少了靈活性 , 如果采樣太少 , 就會額外消耗很多性能 ;

總結

以上是生活随笔為你收集整理的【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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