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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

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

發(fā)布時(shí)間:2025/6/17 Android 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 高性能音频】AAudio 音频流 读写操作 ( 音频流读写数据 | 阻塞时间设定 | 注意事项 | AAudioStream_read | AAudioStream_write ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • I . AAudio 音頻流 讀寫操作 簡(jiǎn)介
        • II . AAudio 音頻流 讀寫操作 阻塞時(shí)間設(shè)定
        • III . AAudio 音頻流 讀取 固定幀數(shù) 操作 注意點(diǎn)
        • IV . AAudio 音頻流 寫出音頻數(shù)據(jù) 操作 注意點(diǎn)
        • V . AAudio 音頻流 讀取方法 AAudioStream_read 原型
        • VI . AAudio 音頻流 讀取方法 簡(jiǎn)介
        • VII . AAudio 音頻流 寫出方法 AAudioStream_write 原型



I . AAudio 音頻流 讀寫操作 簡(jiǎn)介



1 . 創(chuàng)建 AAudio 音頻流 : 使用 AAudio 音頻流構(gòu)建器 AAudioStreamBuilder 創(chuàng)建 AAudio 音頻流后 , 調(diào)用 AAudioStreamBuilder_openStream 打開(kāi) AAudio 音頻流 , 此時(shí)音頻流正式創(chuàng)建 ;


2 . 開(kāi)啟 AAudio 音頻流播放 : 調(diào)用 AAudioStream_requestStart 方法 , 即可開(kāi)始 AAudio 音頻流的播放 ;


3 . 讀寫操作前提 ( Started 狀態(tài) ) : 當(dāng) AAudio 處于 Started 狀態(tài)后 , 便可進(jìn)行 AAudio 音頻流的讀寫操作 ;


4 . 讀寫操作函數(shù) :

  • ① 讀取操作 : 從 AAudio 音頻流中讀取數(shù)據(jù)到內(nèi)存中 , AAudioStream_read(stream, buffer, numFrames, timeoutNanos) ;
  • ② 寫出操作 : 將內(nèi)存中的數(shù)據(jù)寫出到 AAudio 音頻流中 , AAudioStream_write(stream, buffer, numFrames, timeoutNanos) ;

5 . 讀寫數(shù)據(jù)格式 : AAudio 音頻流讀寫數(shù)據(jù)的格式 , 與 AAudioStream_getDataFormat() 方法返回的格式 的 采樣率 , 樣本格式 必須一致 , 否則會(huì)出錯(cuò) ;



II . AAudio 音頻流 讀寫操作 阻塞時(shí)間設(shè)定



阻塞時(shí)間設(shè)定 :

  • ① 指定幀數(shù)讀寫 : 如果要讀寫固定幀數(shù)的數(shù)據(jù) , 需要設(shè)置一個(gè)大于 0 的超時(shí)時(shí)間 , 因?yàn)榭赡軙?huì)在很長(zhǎng)時(shí)間內(nèi)無(wú)法讀取到足夠的數(shù)據(jù) , 而一直阻塞 , 導(dǎo)致程序無(wú)法執(zhí)行下去 , 這里設(shè)置一個(gè)超時(shí)時(shí)間避免這種情況發(fā)生 ;
  • ② 不限定幀數(shù)讀寫 : 如果讀寫數(shù)據(jù)不限定幀數(shù) , 則可以將超時(shí)時(shí)間設(shè)置成 0 , 讀寫的幀數(shù)就是實(shí)際操作的幀數(shù) ;


III . AAudio 音頻流 讀取 固定幀數(shù) 操作 注意點(diǎn)



AAudio 音頻流數(shù)據(jù)讀取 :

  • ① 幀數(shù)驗(yàn)證 : 從 AAudio 音頻流中讀取數(shù)據(jù)時(shí) , 需要驗(yàn)證當(dāng)前讀取的幀數(shù) ;
  • ② 超時(shí)讀取 : 如果讀取時(shí)在超時(shí)時(shí)間內(nèi)未能讀取到指定 的 numFrames 幀數(shù)的數(shù)據(jù) , 則也會(huì)繼續(xù)執(zhí)行, 此時(shí) audioData 中除了讀取的數(shù)據(jù)之外 , 還有一部分未知數(shù)據(jù) ;
  • ③ 未知數(shù)據(jù) : 因?yàn)樽x取的數(shù)據(jù)中可能包含未知數(shù)據(jù) , 如果將未知數(shù)據(jù)當(dāng)做音頻采樣數(shù)據(jù) , 會(huì)造成不可預(yù)知后果 , 出現(xiàn)電流等干擾 ;
  • ④ 處理方法 : 將非讀取的數(shù)據(jù)使用 0 填充 , 這些數(shù)據(jù)播放出來(lái)就是靜音的效果, 沒(méi)有意外的電流或雜音 ;
  • ⑤ 代碼示例 : 設(shè)定讀取 numFrames 幀數(shù)據(jù)到 audioData 指針指向的內(nèi)存中 , 如果 timeout 納秒內(nèi)還沒(méi)讀取完畢 , 繼續(xù)執(zhí)行下面的代碼 , 之后首先判定是否完整讀取了 numFrames 幀的數(shù)據(jù) , 如果讀取了幀數(shù)小于 numFrames 需要將后半部分的隨機(jī)數(shù)據(jù)設(shè)置為 0 ;
//讀取 numFrames 幀數(shù)據(jù) , 如果幀數(shù)不夠則一直阻塞 , 直到 timeout 毫秒后 超時(shí) , 然后才能解除阻塞繼續(xù)執(zhí)行 ; aaudio_result_t result =AAudioStream_read(stream, audioData, numFrames, timeout);//如果出現(xiàn)了錯(cuò)誤 , 進(jìn)行錯(cuò)誤處理邏輯 ; if (result < 0) {// 錯(cuò)誤處理邏輯 }//如果實(shí)際讀取的幀數(shù) 與 設(shè)定讀取的幀數(shù)不一致 , 一般是讀取的幀數(shù)小于設(shè)定的讀取幀數(shù) , 這是由于超時(shí)造成的 ; if (result != numFrames) {// 將 audioData 指針指向的內(nèi)存中 除 numFrames 幀音頻采樣數(shù)據(jù)之外的 剩余其它數(shù)據(jù)設(shè)置成 0 , 即靜音效果 ; memset(static_cast<sample_type*>(audioData) + result * samplesPerFrame, 0,sizeof(sample_type) * (numFrames - result) * samplesPerFrame); }

IV . AAudio 音頻流 寫出音頻數(shù)據(jù) 操作 注意點(diǎn)



AAudio 音頻流數(shù)據(jù)寫出 :

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


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



AAudioStream_read 方法簡(jiǎn)介 :

  • ① 函數(shù)原型 : 從 AAudio 音頻流中讀取數(shù)據(jù) , 用于錄音 ;
AAUDIO_API aaudio_result_t AAudioStream_read(AAudioStream *stream,void *buffer,int32_t numFrames,int64_t timeoutNanoseconds )
  • ② AAudioStream *stream 參數(shù) : AAudio 音頻流 ;
  • ③ void *buffer 參數(shù) : 從 AAudio 音頻流中讀取的音頻數(shù)據(jù)指針 , 該指針指向的內(nèi)存地址中存儲(chǔ)讀取的音頻數(shù)據(jù) ;
  • ④ int32_t numFrames 參數(shù) : 讀取的幀數(shù) , 每幀的樣本數(shù)就是通道數(shù) ;
  • ⑤ int64_t timeoutNanoseconds 參數(shù) : AAudio 讀取音頻流的超時(shí)時(shí)間 , 如果在這個(gè) timeoutNanoseconds 納秒內(nèi)沒(méi)有讀取到 numFrames 幀數(shù)據(jù) , 就會(huì)解除阻塞 , 繼續(xù)執(zhí)行后續(xù)代碼 ;
  • ⑥ 返回值 : aaudio_result_t 類型 , 返回實(shí)際讀取到的幀數(shù) , 如果出現(xiàn)錯(cuò)誤 , 會(huì)返回錯(cuò)誤碼 ;


VI . AAudio 音頻流 讀取方法 簡(jiǎn)介



1 . 方法阻塞時(shí)間 : AAudioStream_read 方法執(zhí)行時(shí)會(huì)阻塞當(dāng)前線程 , 滿足下面兩種條件的任意一種 , 線程阻塞解除 ;

  • ① 執(zhí)行完畢 : 從 AAudio 音頻流中讀取了指定幀數(shù)的音頻數(shù)據(jù) ;
  • ② 執(zhí)行超時(shí) : 沒(méi)有讀取到足夠的幀數(shù) , 但是超過(guò)了指定的超時(shí)時(shí)間 , 這種情況返回值返回的是實(shí)際讀取的音頻數(shù)據(jù)幀數(shù) ;

2 . 方法非阻塞設(shè)置 : 如果將 AAudioStream_read 方法的 timeoutNanoseconds 參數(shù)設(shè)置成 0 , 那么該方法不會(huì)阻塞 , 嘗試讀取一次 , 不管讀取到多少數(shù)據(jù) , 都會(huì)立刻繼續(xù)執(zhí)行后續(xù)代碼 ;


3 . 超時(shí)時(shí)間說(shuō)明 : 超時(shí)時(shí)間 timeoutNanoseconds 納秒值 , 是一個(gè)相對(duì)的時(shí)間 , 如果線程 sleep 后 , 該時(shí)間也會(huì)繼續(xù)計(jì)時(shí) , 如果 sleep 結(jié)束 , 發(fā)現(xiàn)超時(shí)時(shí)間已過(guò) , 會(huì)瞬間解除 AAudioStream_read 方法的阻塞 ;



VII . AAudio 音頻流 寫出方法 AAudioStream_write 原型



AAudioStream_write 寫出方法 :

  • ① 方法原型 : 向 AAudio 音頻流中寫出音頻數(shù)據(jù) , 用于播放音頻 ;
AAUDIO_API aaudio_result_t AAudioStream_write(AAudioStream *stream,const void *buffer,int32_t numFrames,int64_t timeoutNanoseconds )
  • ② AAudioStream *stream 參數(shù) : AAudio 音頻流 ;
  • ③ void *buffer 參數(shù) : 向 AAudio 音頻流中寫出的音頻數(shù)據(jù)指針 , 該指針指向的內(nèi)存地址中存儲(chǔ)讀取的音頻數(shù)據(jù)首地址 ;
  • ④ int32_t numFrames 參數(shù) : 要寫出的幀數(shù) , 每幀的樣本數(shù)就是通道數(shù) ;
  • ⑤ int64_t timeoutNanoseconds 參數(shù) : AAudio 寫出音頻流的超時(shí)時(shí)間 , 如果在這個(gè) timeoutNanoseconds 納秒內(nèi)沒(méi)有寫出 numFrames 幀數(shù)據(jù) , 就會(huì)解除阻塞 , 繼續(xù)執(zhí)行后續(xù)代碼 ;
  • ⑥ 返回值 : aaudio_result_t 類型 , 返回實(shí)際寫出到 AAudio 音頻流的幀數(shù) , 如果出現(xiàn)錯(cuò)誤 , 會(huì)返回錯(cuò)誤碼 ;

總結(jié)

以上是生活随笔為你收集整理的【Android 高性能音频】AAudio 音频流 读写操作 ( 音频流读写数据 | 阻塞时间设定 | 注意事项 | AAudioStream_read | AAudioStream_write )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。