我试图用recorderjs ,用户上传短录音(比方说,1至十几秒钟长)上的应用程序引擎的网站。 我已经注意到,WAV文件,我上传的,比我预期的要大得多。 例如,我刚创建,持续大约900秒的记录,上传的斑点是1736769个字节,这是> 1.5兆字节。
题:
如何修改recorderjs代码(或我自己的代码 - 也许我使用recorderjs错误),使我的声音斑点具有较低的比特率? 我想10秒记录下1 MB是安全的。
我的猜测是,我需要修改encodeWAV功能在这里 ,也许exportWAV,但我不知道怎么样。 难道是有意义的刚落中exportWAV交织缓冲区的所有其他元素? 有没有一种更智能的方式做到这一点? 如何导出WAV的比特率依赖于我的计算机(例如我的声卡的采样率)的属性?
我可以在我自己的代码添加一些细节,如果它可能会有所帮助。
编辑:如果你想看到一个活生生的例子,安装谷歌Chrome测试版,并尝试这个页面 。 在我的电脑上,记录5-10秒长超过1 MB。
非常感谢,
阿德里安
你可以尝试一些事情。 首先,我认为你是到一些有关“丢弃交错缓冲区的所有其他元素”(声音转换为单声道)。
对于您可以选择保留向左或右声道。 你可以改变的“交错”功能是:
function interleave(inputL, inputR){
return inputL; // or inputR
}
如果你想保持两个通道,但“泛”他们两个中心(以单一单声道),你可以这样做:
function interleave(inputL, inputR){
var result = new Float32Array(inputL.length);
for (var i = 0; i < inputL.length; ++i)
result[i] = 0.5 * (inputL[i] + inputR[i]);
return result;
}
话虽这么说,也有可能放在你就必须被表示为立体声到单声道改变编码的音频很多其他的。 然而,我的猜测是(我没用过recorder.js,所以我不知道它的内部运作),在recorderWorker线113/114或许可以改为1。
我的猜测是,你可以只改变这里提到的两个地闪避(交错功能,并在通道数设置的地方[线114]),因为:交织和encodeWAV仅通过exportWAV函数调用,所以不触摸如何原来的工人已记录的音频(和它一直在录制立体声),希望不会打破它。 我们会在这种情况下,只有在更改了存储的音频。
在我来说,Chrome的记录以96kHz和Firefox在44.1,这使得庞大的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);
}
我使用相同的代码记录,我需要降低比特率。 我的解决方案产生11025Hz单声道文件。 这是不是很优雅,所以我会很高兴,如果有人纠正我。
首先,我改变采样率的init
函数为11025,而不是音频上下文的比特率(这是因为上下文可能不是44100Hz非优雅的部分)。
我更换interleave
功能内容与此
var length = inputL.length / 4;
var result = new Float32Array(length);
var index = 0,
inputIndex = 0;
while (index < length) {
result[index++] = 0.25 * (inputL[inputIndex++] + inputL[inputIndex++] +
inputL[inputIndex++] + inputL[inputIndex++]);
}
return result;
此只对左声道和每4个缓冲样品变成1中的结果,因此占据更小的存储器。 如果比特率是通过相同的比例(除以4例如11025)改变时,该文件将发音相同但会小得多。
我也改变了通道计数encodeWAV
一个
/* channel count */
view.setUint16(22, 1, true);
该记录将在大小1/8比原来生成的文件。