我用getUserMedia()做了一個錄音機。使用Recorder.js保存文件HTML5以低kbps記錄音頻
但輸出文件比我想要的要重得多。
4分鐘的音頻記錄有40MB的東西。我無法將其發送到我的服務器。如果是這樣,它會崩潰。
所以,我搜索瞭如何減少記錄kbps。但我什麼都沒發現。只是一些Flash解決方案。但是這些不適合我的項目。
所以,我的問題是,是否有可能使用getUserMedia()降低音頻記錄的kbps?
我用getUserMedia()做了一個錄音機。使用Recorder.js保存文件HTML5以低kbps記錄音頻
但輸出文件比我想要的要重得多。
4分鐘的音頻記錄有40MB的東西。我無法將其發送到我的服務器。如果是這樣,它會崩潰。
所以,我搜索瞭如何減少記錄kbps。但我什麼都沒發現。只是一些Flash解決方案。但是這些不適合我的項目。
所以,我的問題是,是否有可能使用getUserMedia()降低音頻記錄的kbps?
你有幾個選項。首先,對於較小尺寸的縮小,您可以隨時修改RecorderJS中的recorderWorker.js文件以使用較低的採樣率和位深度。這需要了解數字音頻如何工作的一些知識,以及使用鍵入陣列的某種程度的舒適性 - 但不應太難。如果沿着這條路走,this page對WAVE格式有很好的解釋。減少比特深度應該是相當直接的。降採樣可能會稍微複雜一點,但應該通過一點研究來實現。一旦你獲得了你想要的位深度和採樣率,改變RecorderJS的encodeWAV
函數中的標題應該是非常簡單的。
另一種選擇是轉換爲有損格式(例如MP3)。 This是我現在知道的唯一可以做到這一點的圖書館,儘管可能會有更多。我沒有真正使用過這個,並且聽說它有點慢 - 但是如果這是一個問題,你可以在網絡工作者中運行它。
從4月/ 5月開始,在記錄器Worker.js中縮減採樣的方式在這個問題中得到了很好的解釋:Decrease bitrate on WAV file created with recorderjs。
在我的情況下,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);
}
不錯!我會盡快測試它! –
另一個策略可能不是計算平均比特率,只考慮每個步驟的一個採樣:'result [offsetResult] = buffer [offsetBuffer];' –
這似乎工作正常。 – Knelis