【Android 高性能音频】AAudio 音频流 读写操作 ( 音频流读写数据 | 阻塞时间设定 | 注意事项 | AAudioStream_read | AAudioStream_write )
文章目錄
- I . AAudio 音頻流 讀寫操作 簡介
- II . AAudio 音頻流 讀寫操作 阻塞時間設定
- III . AAudio 音頻流 讀取 固定幀數 操作 注意點
- IV . AAudio 音頻流 寫出音頻數據 操作 注意點
- V . AAudio 音頻流 讀取方法 AAudioStream_read 原型
- VI . AAudio 音頻流 讀取方法 簡介
- VII . AAudio 音頻流 寫出方法 AAudioStream_write 原型
I . AAudio 音頻流 讀寫操作 簡介
1 . 創建 AAudio 音頻流 : 使用 AAudio 音頻流構建器 AAudioStreamBuilder 創建 AAudio 音頻流后 , 調用 AAudioStreamBuilder_openStream 打開 AAudio 音頻流 , 此時音頻流正式創建 ;
2 . 開啟 AAudio 音頻流播放 : 調用 AAudioStream_requestStart 方法 , 即可開始 AAudio 音頻流的播放 ;
3 . 讀寫操作前提 ( Started 狀態 ) : 當 AAudio 處于 Started 狀態后 , 便可進行 AAudio 音頻流的讀寫操作 ;
4 . 讀寫操作函數 :
- ① 讀取操作 : 從 AAudio 音頻流中讀取數據到內存中 , AAudioStream_read(stream, buffer, numFrames, timeoutNanos) ;
- ② 寫出操作 : 將內存中的數據寫出到 AAudio 音頻流中 , AAudioStream_write(stream, buffer, numFrames, timeoutNanos) ;
5 . 讀寫數據格式 : AAudio 音頻流讀寫數據的格式 , 與 AAudioStream_getDataFormat() 方法返回的格式 的 采樣率 , 樣本格式 必須一致 , 否則會出錯 ;
II . AAudio 音頻流 讀寫操作 阻塞時間設定
阻塞時間設定 :
- ① 指定幀數讀寫 : 如果要讀寫固定幀數的數據 , 需要設置一個大于 0 的超時時間 , 因為可能會在很長時間內無法讀取到足夠的數據 , 而一直阻塞 , 導致程序無法執行下去 , 這里設置一個超時時間避免這種情況發生 ;
- ② 不限定幀數讀寫 : 如果讀寫數據不限定幀數 , 則可以將超時時間設置成 0 , 讀寫的幀數就是實際操作的幀數 ;
III . AAudio 音頻流 讀取 固定幀數 操作 注意點
AAudio 音頻流數據讀取 :
- ① 幀數驗證 : 從 AAudio 音頻流中讀取數據時 , 需要驗證當前讀取的幀數 ;
- ② 超時讀取 : 如果讀取時在超時時間內未能讀取到指定 的 numFrames 幀數的數據 , 則也會繼續執行, 此時 audioData 中除了讀取的數據之外 , 還有一部分未知數據 ;
- ③ 未知數據 : 因為讀取的數據中可能包含未知數據 , 如果將未知數據當做音頻采樣數據 , 會造成不可預知后果 , 出現電流等干擾 ;
- ④ 處理方法 : 將非讀取的數據使用 0 填充 , 這些數據播放出來就是靜音的效果, 沒有意外的電流或雜音 ;
- ⑤ 代碼示例 : 設定讀取 numFrames 幀數據到 audioData 指針指向的內存中 , 如果 timeout 納秒內還沒讀取完畢 , 繼續執行下面的代碼 , 之后首先判定是否完整讀取了 numFrames 幀的數據 , 如果讀取了幀數小于 numFrames 需要將后半部分的隨機數據設置為 0 ;
IV . AAudio 音頻流 寫出音頻數據 操作 注意點
AAudio 音頻流數據寫出 :
- ① 緩沖區 : 先將數據放入緩沖區 , 該緩沖區大小 與 AAudio 音頻流整體性能相關 ;
- ② 啟動音頻流 : 將緩沖區中的數據寫入 AAudio 音頻流 , 將 音頻流 啟動 ;
- ③ 超時設置 : 寫出數據時 , timeoutNanos 參數必須設置成 0 , 代表其超時時間是 0 納秒 , 保證該操作是非阻塞操作 ;
- ④ 緩沖區數據格式 : 緩沖區中存儲的音頻數據格式 與 AAudioStream_getDataFormat() 方法返回的格式必須一致 ;
V . AAudio 音頻流 讀取方法 AAudioStream_read 原型
AAudioStream_read 方法簡介 :
- ① 函數原型 : 從 AAudio 音頻流中讀取數據 , 用于錄音 ;
- ② AAudioStream *stream 參數 : AAudio 音頻流 ;
- ③ void *buffer 參數 : 從 AAudio 音頻流中讀取的音頻數據指針 , 該指針指向的內存地址中存儲讀取的音頻數據 ;
- ④ int32_t numFrames 參數 : 讀取的幀數 , 每幀的樣本數就是通道數 ;
- ⑤ int64_t timeoutNanoseconds 參數 : AAudio 讀取音頻流的超時時間 , 如果在這個 timeoutNanoseconds 納秒內沒有讀取到 numFrames 幀數據 , 就會解除阻塞 , 繼續執行后續代碼 ;
- ⑥ 返回值 : aaudio_result_t 類型 , 返回實際讀取到的幀數 , 如果出現錯誤 , 會返回錯誤碼 ;
VI . AAudio 音頻流 讀取方法 簡介
1 . 方法阻塞時間 : AAudioStream_read 方法執行時會阻塞當前線程 , 滿足下面兩種條件的任意一種 , 線程阻塞解除 ;
- ① 執行完畢 : 從 AAudio 音頻流中讀取了指定幀數的音頻數據 ;
- ② 執行超時 : 沒有讀取到足夠的幀數 , 但是超過了指定的超時時間 , 這種情況返回值返回的是實際讀取的音頻數據幀數 ;
2 . 方法非阻塞設置 : 如果將 AAudioStream_read 方法的 timeoutNanoseconds 參數設置成 0 , 那么該方法不會阻塞 , 嘗試讀取一次 , 不管讀取到多少數據 , 都會立刻繼續執行后續代碼 ;
3 . 超時時間說明 : 超時時間 timeoutNanoseconds 納秒值 , 是一個相對的時間 , 如果線程 sleep 后 , 該時間也會繼續計時 , 如果 sleep 結束 , 發現超時時間已過 , 會瞬間解除 AAudioStream_read 方法的阻塞 ;
VII . AAudio 音頻流 寫出方法 AAudioStream_write 原型
AAudioStream_write 寫出方法 :
- ① 方法原型 : 向 AAudio 音頻流中寫出音頻數據 , 用于播放音頻 ;
- ② AAudioStream *stream 參數 : AAudio 音頻流 ;
- ③ void *buffer 參數 : 向 AAudio 音頻流中寫出的音頻數據指針 , 該指針指向的內存地址中存儲讀取的音頻數據首地址 ;
- ④ int32_t numFrames 參數 : 要寫出的幀數 , 每幀的樣本數就是通道數 ;
- ⑤ int64_t timeoutNanoseconds 參數 : AAudio 寫出音頻流的超時時間 , 如果在這個 timeoutNanoseconds 納秒內沒有寫出 numFrames 幀數據 , 就會解除阻塞 , 繼續執行后續代碼 ;
- ⑥ 返回值 : aaudio_result_t 類型 , 返回實際寫出到 AAudio 音頻流的幀數 , 如果出現錯誤 , 會返回錯誤碼 ;
總結
以上是生活随笔為你收集整理的【Android 高性能音频】AAudio 音频流 读写操作 ( 音频流读写数据 | 阻塞时间设定 | 注意事项 | AAudioStream_read | AAudioStream_write )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 高性能音频】AAudi
- 下一篇: 【Android 高性能音频】AAudi