2013-08-21 62 views
7

我用getUserMedia()做了一個錄音機。使用Recorder.js保存文件HTML5以低kbps記錄音頻

但輸出文件比我想要的要重得多。

4分鐘的音頻記錄有40MB的東西。我無法將其發送到我的服務器。如果是這樣,它會崩潰。

所以,我搜索瞭如何減少記錄kbps。但我什麼都沒發現。只是一些Flash解決方案。但是這些不適合我的項目。

所以,我的問題是,是否有可能使用getUserMedia()降低音頻記錄的kbps?

回答

1

你有幾個選項。首先,對於較小尺寸的縮小,您可以隨時修改RecorderJS中的recorderWorker.js文件以使用較低的採樣率和位深度。這需要了解數字音頻如何工作的一些知識,以及使用鍵入陣列的某種程度的舒適性 - 但不應太難。如果沿着這條路走,this page對WAVE格式有很好的解釋。減少比特深度應該是相當直接的。降採樣可能會稍微複雜一點,但應該通過一點研究來實現。一旦你獲得了你想要的位深度和採樣率,改變RecorderJS的encodeWAV函數中的標題應該是非常簡單的。

另一種選擇是轉換爲有損格式(例如MP3)。 This是我現在知道的唯一可以做到這一點的圖書館,儘管可能會有更多。我沒有真正使用過這個,並且聽說它有點慢 - 但是如果這是一個問題,你可以在網絡工作者中運行它。

10

在我的情況下,Chrome在96kHz和Firefox上以44.1kHz記錄音頻,這使得巨大的WAV文件。我實現了內部recorderWorker.js降採樣功能,您可以選擇您想要的採樣率,如16000

function downsampleBuffer(buffer, rate) { 
    if (rate == sampleRate) { 
     return buffer; 
    } 
    if (rate > sampleRate) { 
     throw "downsampling rate show be smaller than original sample rate"; 
    } 
    var sampleRateRatio = sampleRate/rate; 
    var newLength = Math.round(buffer.length/sampleRateRatio); 
    var result = new Float32Array(newLength); 
    var offsetResult = 0; 
    var offsetBuffer = 0; 
    while (offsetResult < result.length) { 
     var nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio); 
     var accum = 0, count = 0; 
     for (var i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) { 
      accum += buffer[i]; 
      count++; 
     } 
     result[offsetResult] = accum/count; 
     offsetResult++; 
     offsetBuffer = nextOffsetBuffer; 
    } 
    return result; 
} 

,我把它稱爲導出WAV文件時:

function exportWAV(rate, type) { 
    var bufferL = mergeBuffers(recBuffersL, recLength); 
    var bufferR = mergeBuffers(recBuffersR, recLength); 
    var interleaved = interleave(bufferL, bufferR); 
    var downsampledBuffer = downsampleBuffer(interleaved, rate); 
    var dataview = encodeWAV(rate, downsampledBuffer, false); 
    var audioBlob = new Blob([ dataview ], { 
     type : type 
    }); 

    this.postMessage(audioBlob); 
} 
+0

不錯!我會盡快測試它! –

+0

另一個策略可能不是計算平均比特率,只考慮每個步驟的一個採樣:'result [offsetResult] = buffer [offsetBuffer];' –

+0

這似乎工作正常。 – Knelis