我用getUserMedia()做了一个录音机。使用Recorder.js保存文件HTML5以低kbps记录音频
但输出文件比我想要的要重得多。
4分钟的音频记录有40MB的东西。我无法将其发送到我的服务器。如果是这样,它会崩溃。
所以,我搜索了如何减少记录kbps。但我什么都没发现。只是一些Flash解决方案。但是这些不适合我的项目。
所以,我的问题是,是否有可能使用getUserMedia()降低音频记录的kbps?
我用getUserMedia()做了一个录音机。使用Recorder.js保存文件HTML5以低kbps记录音频
但输出文件比我想要的要重得多。
4分钟的音频记录有40MB的东西。我无法将其发送到我的服务器。如果是这样,它会崩溃。
所以,我搜索了如何减少记录kbps。但我什么都没发现。只是一些Flash解决方案。但是这些不适合我的项目。
所以,我的问题是,是否有可能使用getUserMedia()降低音频记录的kbps?
你有几个选项。首先,对于较小尺寸的缩小,您可以随时修改RecorderJS中的recorderWorker.js文件以使用较低的采样率和位深度。这需要了解数字音频如何工作的一些知识,以及使用键入阵列的某种程度的舒适性 - 但不应太难。如果沿着这条路走,this page对WAVE格式有很好的解释。减少比特深度应该是相当直接的。降采样可能会稍微复杂一点,但应该通过一点研究来实现。一旦你获得了你想要的位深度和采样率,改变RecorderJS的encodeWAV
函数中的标题应该是非常简单的。
另一种选择是转换为有损格式(例如MP3)。 This是我现在知道的唯一可以做到这一点的图书馆,尽管可能会有更多。我没有真正使用过这个,并且听说它有点慢 - 但是如果这是一个问题,你可以在网络工作者中运行它。
从4月/ 5月开始,在记录器Worker.js中缩减采样的方式在这个问题中得到了很好的解释:Decrease bitrate on WAV file created with recorderjs。
在我的情况下,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);
}
不错!我会尽快测试它! –
另一个策略可能不是计算平均比特率,只考虑每个步骤的一个采样:'result [offsetResult] = buffer [offsetBuffer];' –
这似乎工作正常。 – Knelis