【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
文章目錄
- 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 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 高性能音频】AAudi
- 下一篇: 【Android 高性能音频】AAudi