最后一課的問題 希望老師回答(關于decodeAudioData是不是異步的問題)
我存了3首歌曲 大概都是4M左右 decodeAudioData大概3秒的樣子 當我連續點擊了很多首以后 感覺大量buffer囤積在解碼部分 每五秒完成一次 導致我的最后一次點擊的歌曲要很長時間才能播放 但是看您的視頻最后的延時 似乎并沒有等待太多時間 是我的代碼寫的有問題么??
如果是decodeAudioData同步的問題 那改如何解決? 請老師回答....謝謝
我存了3首歌曲 大概都是4M左右 decodeAudioData大概3秒的樣子 當我連續點擊了很多首以后 感覺大量buffer囤積在解碼部分 每五秒完成一次 導致我的最后一次點擊的歌曲要很長時間才能播放 但是看您的視頻最后的延時 似乎并沒有等待太多時間 是我的代碼寫的有問題么??
如果是decodeAudioData同步的問題 那改如何解決? 請老師回答....謝謝
2015-01-24
舉報
2015-01-25
好仔細啊,贊!
明白你的意思了,你面臨的問題,我也同樣面臨著!
首先說明:decodeAudioData方法是異步執行的,解碼過程是在一個不同于主線程的線程中進行
但是同一個AudioContext對象的decodeAudioData過程是在同一線程中,等待解碼的arraybuffer數據會以一個隊列的形式在線程中依次進行解碼
decodeAudioData方法又必須一次性解碼完成才能進行后續動作(成功回調或失敗回調),沒有類似于onprocess這種過程監聽事件,并且webAudio API也沒有提供可以阻斷解碼過程的方法,所以一旦進入解碼過程,就必須等待起解碼完畢(無論成功或失?。┎拍苓M行后續操作
其實webAudio 這些API并不適合(至少目前)播放較大的音頻資源,解碼播放很小的音樂片段還是很好的,因為解碼過程確實太耗時,并且還面臨以上問題。
但是嫩,基于你我面臨的這個問題我仍然還是嘗試過兩種解決方案,但都失敗了:
一:使用web Worker,但是由于WorkerGlobalScope(worker子線程中的全局對象)中并不存在AudioContext對象,也就沒辦法在該子線程中解碼得到AudioBuffer,并且postMessage方法也不能傳遞AudioContext這樣的對象到子線程中,所以也沒辦法在該子線程中得到AudioBuffer
二:每次解碼數據時都new 一個新的AudioContext實例對象,但由于每次創建AudioContext對象時資源消耗嚴重,性能極低,并且同一個document中最多只能創建6個,也就是說這個方法也失敗了(所以還是記住,一個document中通常只new 一個AudioContext實例對象)
嘿嘿,也真是黔驢技窮了,本人不才,到現在也還沒找出什么有效的解決方案,抱歉啦!當然如果你找到什么行之有效的方法,一定私信我哦,感謝!