2014-12-10 79 views
3

我使用RecorderJS從用戶錄製麥克風流。默認導出是一個44.1 kHz,16位的WAV文件。無論如何,我可以將這個縮減到11kHz或16kHz,而不會聽起來很奇怪嗎? 是否有反正我可以得到一個16位16khz的WAV文件出一個Web Audio API getUserMedia流,通過使用唯一的JavaScript?使用Javascript的Web音頻API下采樣44.1 khz

我試圖減少文件大小,從而爲用戶節省了很多帶寬。謝謝。

回答

1

編輯:一件事,你也可以,只發送一個信道,而不是兩個......

我不知道這是正確的做法,但我沒有做數據的插入從麥克風, 我猜,你是從麥克風這樣的捕捉你的數據接收,

this.node.onaudioprocess = function(e){ 
     if (!recording) return; 
     worker.postMessage({ 
      command: 'record', 
      buffer: [ 
       e.inputBuffer.getChannelData(0), 
       e.inputBuffer.getChannelData(1) 
       ] 
     }); 
    } 

現在修改成

var oldSampleRate = 44100, newSampleRate = 16000; 
this.node.onaudioprocess = function(e){ 

    var leftData = e.inputBuffer.getChannelData(0); 
    var rightData = e.inputBuffer.getChannelData(1); 
    leftData = interpolateArray(leftData, leftData.length * (newSampleRate/oldSampleRate) ); 
    rightData = interpolateArray(rightData, rightData.length * (newSampleRate/oldSampleRate)); 
    if (!recording) return; 
    worker.postMessage({ 
     command: 'record', 
     buffer: [ 
       leftData, 
       rightData 
       ] 
    }); 
} 

function interpolateArray(data, fitCount) { 
    var linearInterpolate = function (before, after, atPoint) { 
     return before + (after - before) * atPoint; 
    }; 

    var newData = new Array(); 
    var springFactor = new Number((data.length - 1)/(fitCount - 1)); 
    newData[0] = data[0]; // for new allocation 
    for (var i = 1; i < fitCount - 1; i++) { 
     var tmp = i * springFactor; 
     var before = new Number(Math.floor(tmp)).toFixed(); 
     var after = new Number(Math.ceil(tmp)).toFixed(); 
     var atPoint = tmp - before; 
     newData[i] = linearInterpolate(data[before], data[after], atPoint); 
    } 
    newData[fitCount - 1] = data[data.length - 1]; // for new allocation 
    return newData; 
};