2015-11-24 81 views
2

我使用網絡音頻api將n通道音頻文件解碼爲單獨的通道,然後將這些通道渲染到畫布上以可視化地創建頻率計。更高效的decodeAudioData()?

我正在使用decodeAudioData解碼字節的數組緩衝區,然後將其分配給單獨函數中的音頻緩衝區源節點。

// load the specified sound 
function loadSound(url) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', url, true); 
    request.responseType = 'arraybuffer'; 

    // When loaded decode the data 
    request.onload = function() { 

     // decode the data 
     context.decodeAudioData(request.response, function (buffer) { 
      // when the audio is decoded play the sound 
      holdingBuffer = buffer; 
      setupSound(buffer); 
     }, onError); 
    } 
    request.send(); 
} 

我遇到的問題是,當我試圖解碼大約60MB +音頻,瀏覽器會崩潰,由於缺乏存儲space.The decodeAudioData功能是極其內存餓了!

我想知道是否有人有更有效的方式解碼較大的音頻文件的任何經驗?

+0

您是否在移動設備上運行? 60 MB(壓縮)很大,但對臺式機來說不是那麼大。 –

回答

3

問題是解碼的音頻佔用的內存量。只是爲了舉例,我假設你的60MB音頻文件是MP3。

這顯然取決於比特率,但假設你在128kbps - 這是相當典型的。這意味着你正在加載大約一小時的立體聲音頻。

但Web Audio API解碼爲32位,通常爲44.1或48kHz(這取決於您的聲卡,從我記得的位置)。

無論如何,比方說48位的32位。

這意味着每個通道是每秒32 * 48000比特。這是每分鐘32 * 48000 * 60位,整個小時32 * 48000 * 60 * 60位。當然,我們乘以2,因爲我們假設立體聲。

這意味着總共有11059200000個音頻數據位 - 這是一個需要加載到內存中的1.3824GB音頻緩衝區。所以,基本上 - 這是一大堆記憶。

這裏真的沒有簡單的答案。你可以嘗試生成服務器上的波形/攝譜儀/任何東西。或者您可以嘗試加載音頻文件,以便您可以單獨處理它們(以串行方式)並讓其被垃圾收集。

可能還有其他解決方案,但是這些是立即想到的兩個解決方案。

+1

或使用MediaElementAudioSource將mp3傳輸到WebAudio。 –

+0

是的,如果渲染可以實時發生,肯定有效。出於某種原因,我認爲OP正在尋找產生波形,但它聽起來像是實際上是一個譜圖。 –

+1

無論你在做什麼,你都不會一次在內存中需要一個完整的音頻文件。這就是爲什麼decodeAudioData API是瘋狂的。 – Esailija