日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Android 高性能音频】AAudio 音频流 读写操作 ( 音频流读写数据 | 阻塞时间设定 | 注意事项 | AAudioStream_read | AAudioStream_write )

發布時間:2025/6/17 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 ;
//讀取 numFrames 幀數據 , 如果幀數不夠則一直阻塞 , 直到 timeout 毫秒后 超時 , 然后才能解除阻塞繼續執行 ; aaudio_result_t result =AAudioStream_read(stream, audioData, numFrames, timeout);//如果出現了錯誤 , 進行錯誤處理邏輯 ; if (result < 0) {// 錯誤處理邏輯 }//如果實際讀取的幀數 與 設定讀取的幀數不一致 , 一般是讀取的幀數小于設定的讀取幀數 , 這是由于超時造成的 ; if (result != numFrames) {// 將 audioData 指針指向的內存中 除 numFrames 幀音頻采樣數據之外的 剩余其它數據設置成 0 , 即靜音效果 ; memset(static_cast<sample_type*>(audioData) + result * samplesPerFrame, 0,sizeof(sample_type) * (numFrames - result) * samplesPerFrame); }

IV . AAudio 音頻流 寫出音頻數據 操作 注意點



AAudio 音頻流數據寫出 :

  • ① 緩沖區 : 先將數據放入緩沖區 , 該緩沖區大小 與 AAudio 音頻流整體性能相關 ;
  • ② 啟動音頻流 : 將緩沖區中的數據寫入 AAudio 音頻流 , 將 音頻流 啟動 ;
  • ③ 超時設置 : 寫出數據時 , timeoutNanos 參數必須設置成 0 , 代表其超時時間是 0 納秒 , 保證該操作是非阻塞操作 ;
  • ④ 緩沖區數據格式 : 緩沖區中存儲的音頻數據格式 與 AAudioStream_getDataFormat() 方法返回的格式必須一致 ;


V . AAudio 音頻流 讀取方法 AAudioStream_read 原型



AAudioStream_read 方法簡介 :

  • ① 函數原型 : 從 AAudio 音頻流中讀取數據 , 用于錄音 ;
AAUDIO_API aaudio_result_t AAudioStream_read(AAudioStream *stream,void *buffer,int32_t numFrames,int64_t timeoutNanoseconds )
  • ② 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 音頻流中寫出音頻數據 , 用于播放音頻 ;
AAUDIO_API aaudio_result_t AAudioStream_write(AAudioStream *stream,const void *buffer,int32_t numFrames,int64_t timeoutNanoseconds )
  • ② 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 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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