4

我正在使用 RecorderJS 记录来自用户的麦克风流。默认导出为 44.1 kHz、16 位的 WAV 文件。无论如何我可以将其降采样到 11kHz 或 16kHz 而不听起来很奇怪吗?无论如何,我可以通过仅使用 javascript 从 Web Audio API getUserMedia 流中获取 16 位 16khz WAV 文件吗?

我正在尝试减小文件大小,从而为用户节省大量带宽。谢谢。

4

1 回答 1

2

编辑: 还有一件事,你也可以只发送一个频道而不是两个......

我不确定这是否是正确的方法,但我是通过对从麦克风接收到的数据进行插值来做到的,我猜,你正在从麦克风中捕获你的数据,就像这样,

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;
};
于 2014-12-12T05:10:44.267 回答