AAC 是應用非常廣泛的音頻壓縮格式,Android 硬體編碼天生支持 AAC。我們採集的原始 PCM 音頻,一般不直接用來網路傳輸,而是經過編碼器壓縮成 AAC,這樣就提高了傳輸效率,節省了網路帶寬。
簡言之,編碼就是壓縮,解碼就是解壓。編碼的目的是減小數據的體積,方便網路傳輸和本地存儲。編碼後的數據是不能直接使用的,必須先解碼成原來的樣子。就像 zip 壓縮文件裡面有張圖片,我們用圖片查看器是無法打開的,必須先解壓文件,恢復圖片原來的數據,這樣才能查看。音視頻編解碼也是同樣的道理。
Android 在 API 16 後引入的音視頻編解碼 API,Android 應用層統一由 MediaCodec API 提供音視頻編解碼的功能,由參數配置來決定採用何種編解碼演算法、是否採用硬體編解碼加速等。由於使用硬體編解碼,兼容性有不少問題,據說 MediaCodec 坑比較多。
MediaCodec 採用了基於環形緩衝區的「生產者-消費者」模型,非同步處理數據。在 input 端,Client 是這個環形緩衝區「生產者」,MediaCodec 是「消費者」。在 output 端,MediaCodec 是這個環形緩衝區「生產者」,而 Client 則變成了「消費者」。
(4)處理結束後,MediaCodec 將原始數據 buffer 置為 empty 後放回 input 緩衝區隊列,將編解碼後的數據放入到 output 緩衝區隊列