首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTML5录制低kbps音频

HTML5录制低kbps音频
EN

Stack Overflow用户
提问于 2013-08-21 12:22:39
回答 3查看 4.1K关注 0票数 7

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

但是输出文件比我想象的要重得多。

一张4分钟的录音大约有40mb。我不能把它发送到我的服务器上。如果是这样,它将崩溃。

因此,我研究了如何降低记录kbps。但我什么也没找到。只是一些闪存解决方案。但这些不适合我的项目。

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

EN

回答 3

Stack Overflow用户

发布于 2014-10-08 04:53:50

在我的例子中,Chrome录制音频的频率为96 WAV,而Firefox录制音频的频率为44.1 WAV,这会产生巨大的WAV文件。我在recorderWorker.js中实现了一个下采样函数,你可以选择你想要的采样率,比如16000。

代码语言:javascript
复制
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文件时调用它:

代码语言:javascript
复制
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);
}
票数 11
EN

Stack Overflow用户

发布于 2013-08-21 21:58:26

你有几个选择。

首先,对于较小的尺寸缩减,您始终可以修改RecorderJS中的recorderWorker.js文件,以使用较低的采样率和位深度。这将需要一些数字音频工作原理的知识,以及一定程度的使用类型化数组的舒适性-但不应该太难。如果你沿着这条路走下去,this page对WAVE格式有一个很好的解释。减少位深度应该是相当简单的。向下采样可能会稍微复杂一些,但只要稍微研究一下,就应该是可行的。一旦你得到了你想要的位深度和采样率,改变RecorderJS的encodeWAV函数中的头应该是非常简单的。

另一种选择是转换为有损格式(例如MP3)。This是目前我所知道的唯一可以做到这一点的库,尽管可能还有更多的库。我实际上没有用过它,听说它有点慢--但是如果它有问题,你可以在web worker中运行它。

票数 1
EN

Stack Overflow用户

发布于 2013-08-29 15:50:20

在4/5月的这个问题中:Decrease bitrate on WAV file created with recorderjs很好地解释了在recorderWorker.js中进行下采样的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18348813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档