我用getUserMedia()做了一个录音机。并使用Recorder.js保存文件
但是输出文件比我想象的要重得多。
一张4分钟的录音大约有40mb。我不能把它发送到我的服务器上。如果是这样,它将崩溃。
因此,我研究了如何降低记录kbps。但我什么也没找到。只是一些闪存解决方案。但这些不适合我的项目。
所以,我的问题是,是否可以使用getUserMedia()来降低音频记录的kbps?
发布于 2014-10-08 04:53:50
在我的例子中,Chrome录制音频的频率为96 WAV,而Firefox录制音频的频率为44.1 WAV,这会产生巨大的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);
}发布于 2013-08-21 21:58:26
你有几个选择。
首先,对于较小的尺寸缩减,您始终可以修改RecorderJS中的recorderWorker.js文件,以使用较低的采样率和位深度。这将需要一些数字音频工作原理的知识,以及一定程度的使用类型化数组的舒适性-但不应该太难。如果你沿着这条路走下去,this page对WAVE格式有一个很好的解释。减少位深度应该是相当简单的。向下采样可能会稍微复杂一些,但只要稍微研究一下,就应该是可行的。一旦你得到了你想要的位深度和采样率,改变RecorderJS的encodeWAV函数中的头应该是非常简单的。
另一种选择是转换为有损格式(例如MP3)。This是目前我所知道的唯一可以做到这一点的库,尽管可能还有更多的库。我实际上没有用过它,听说它有点慢--但是如果它有问题,你可以在web worker中运行它。
发布于 2013-08-29 15:50:20
在4/5月的这个问题中:Decrease bitrate on WAV file created with recorderjs很好地解释了在recorderWorker.js中进行下采样的方法。
https://stackoverflow.com/questions/18348813
复制相似问题