【问题标题】:Web audio API downsample 44.1 khz in JavascriptJavascript 中的 Web 音频 API 下采样 44.1 khz
【发布时间】:2014-12-10 22:12:50
【问题描述】:

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

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

【问题讨论】:

    标签: audio getusermedia downsampling recorder.js


    【解决方案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;
    };
    

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多