使用Javascript的Web音频API下采样44.1 khz
问题描述:
我使用RecorderJS从用户录制麦克风流。默认导出是一个44.1 kHz,16位的WAV文件。无论如何,我可以将这个缩减到11kHz或16kHz,而不会听起来很奇怪吗? 是否有反正我可以得到一个16位16khz的WAV文件出一个Web Audio API getUserMedia流,通过使用唯一的JavaScript?使用Javascript的Web音频API下采样44.1 khz
我试图减少文件大小,从而为用户节省了很多带宽。谢谢。
答
编辑:一件事,你也可以,只发送一个信道,而不是两个......
我不知道这是正确的做法,但我没有做数据的插入从麦克风, 我猜,你是从麦克风这样的捕捉你的数据接收,
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;
};