【Android 高性能音频】AAudio 音频流 读写操作 ( 音频流读写数据 | 阻塞时间设定 | 注意事项 | AAudioStream_read | AAudioStream_write )
文章目錄
- 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 ;
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ù) , 用于錄音 ;
- ② 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ù) , 用于播放音頻 ;
- ② 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)題。
- 上一篇: 【Android 高性能音频】AAudi
- 下一篇: 【Android 高性能音频】AAudi