【发布时间】:2015-04-29 09:20:07
【问题描述】:
我正在使用Recorder.js 和RecorderWorker.js 来录制音频。我们知道文件类型将是 .wav 并且文件大小非常大。我尝试了一种解决方案,该解决方案来自之前在 stackoverflow 上提出的类似问题,但仍然是 1 分钟音频,文件大小 >= 6.5 MB。我使用单通道而不是两个通道。这些是我在我的 javascript 中疯狂的以下更改。
在recorder.js-->
this.node.onaudioprocess = function(e){
if (!recording) return;
var buffer = [];
for (var channel = 0; channel <1; channel++){
buffer.push(e.inputBuffer.getChannelData(channel));
}
worker.postMessage({
command: 'record',
buffer: buffer
});
}
在recorderWorker.js-->
function record(inputBuffer){
for (var channel = 0; channel < 1; channel++){
recBuffers[channel].push(inputBuffer[channel]);
}
recLength += inputBuffer[0].length;
}
function exportWAV(type){
var bufferL = mergeBuffers(recBuffers[0], recLength);
var dataview = encodeWAV(bufferL);
var audioBlob = new Blob([dataview], { type: type });
this.postMessage(audioBlob);
}
function getBuffer(){
var buffers = [];
for (var channel = 0; channel < 1; channel++){
buffers.push(mergeBuffers(recBuffers[channel], recLength));
}
this.postMessage(buffers);
}
function interleave(inputL, inputR){
var length = inputL.length;
var result = new Float32Array(length);
var index = 0,
inputIndex = 0;
while (index < length){
result[index++] = inputL[inputIndex];
//result[index++] = inputR[inputIndex];
inputIndex++;
}
return result;
}
/* channel count */
view.setUint16(22, 1, true);
/* block align (channel count * bytes per sample) */
view.setUint16(32, 2, true);
我尝试使用 libmp3lame.js 将其转换为 mp3 文件类型,但速度很慢,而且我无法使用它录制超过 2 分钟的音频。
我首先要问的是,我做错了什么是因为尺寸没有减小吗?二、还有什么办法可以减小尺寸?
【问题讨论】:
-
问题不在于存储容量。问题是如果多个用户同时在服务器上录制和上传,那么上传可能需要更多时间,因为文件的大小会更大。
-
如果更改 audioContext.sampleRate 会怎样?
标签: javascript audio-recording recorder.js