Decrease bitrate on WAV file created with recorderjs

前端 未结 3 470
误落风尘
误落风尘 2020-12-02 21:38

I\'m trying to use recorderjs on an app engine site where users upload short audio recordings (say, 1 to a dozen seconds long). I\'ve noticed that the WAV files I\'m uploadi

3条回答
  •  情深已故
    2020-12-02 22:26

    In my case Chrome records audio at 96kHz and Firefox at 44.1kHz, that makes huge WAV files. I implemented a downsampling function inside recorderWorker.js where you can select the sample ratio you want, like 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;
    }
    

    and i call it when exporting the wav file:

    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);
    }
    

提交回复
热议问题