javascript - HTML5 以低 kbps 录制音频

标签 javascript html audio-recording web-audio-api

我使用 getUserMedia() 做了一个录音机。并使用 Recorder.js 保存文件

但输出文件比我希望的要重得多。

一段 4 分钟的录音大约有 40mb。而且我无法将其发送到我的服务器。如果是这样,它将崩溃。

所以,我搜索了如何降低录制 kbps。但我什么也没找到。只是一些 Flash 解决方案。但是这些不适合我的项目。

所以,我的问题是,是否可以使用 getUserMedia() 降低音频记录的 kbps?

最佳答案

在我的例子中,Chrome 以 96kHz 录制音频,而 Firefox 以 44.1kHz 录制音频,这会产生巨大的 WAV 文件。我在 recorderWorker.js 中实现了一个下采样功能,您可以在其中选择您想要的采样率,例如 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;
}

我在导出 wav 文件时调用它:

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

关于javascript - HTML5 以低 kbps 录制音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18348813/

相关文章:

django - 在浏览器上录制音频

android - 在 android 中记录通话为什么这不起作用

javascript - 在 Angular2 中加载具有 document.write 的外部 JS

html - Bootstrap div 响应表在断点处具有多个对齐方式

javascript - 为 jquery 添加 Rails 输入名称时遇到问题

html - Scrapy,如何从 <b> 中提取 s subtext

jquery - jQuery 数据方法的返回值不会转换为 Number

audio - 我可以使用动态速度离线渲染音频文件吗?

Javascript window.open(..) 由于 "restrictions in effect on this computer"而失败

javascript - Material Icon 在网站首次加载时显示为名称