问题描述
我正在尝试使用recordRTC录制流音频。但我想将输出实时转换为mp3。对于转换,我遇到了lamejs。我找到了几个例子。但是我不知道如何将它们用于我想要的东西。
我得到一个blob
mediaRecorder = RecordRTC(webcamStream,{type: 'audio',mimeType: 'audio/mpeg-3',});
mediaRecorder.startRecording();
mediaRecorder.stopRecording(function() {
let blob = mediaRecorder.getBlob();
}
我试图满足自己需求的lamejs示例。
channels = 1; //1 for mono or 2 for stereo
sampleRate = 44100; //44.1khz (normal mp3 samplerate)
kbps = 128; //encode 128kbps mp3
mp3encoder = new lamejs.Mp3Encoder(channels,sampleRate,kbps);
var mp3Data = [];
samples = new Int16Array(44100); //one second of silence (get your data from the source you have)
sampleBlockSize = 1152; //can be anything but make it a multiple of 576 to make encoders life easier
var mp3Data = [];
for (var i = 0; i < samples.length; i += sampleBlockSize) {
sampleChunk = samples.subarray(i,i + sampleBlockSize);
var mp3buf = mp3encoder.encodeBuffer(sampleChunk);
if (mp3buf.length > 0) {
mp3Data.push(mp3buf);
}
}
var mp3buf = mp3encoder.flush(); //finish writing mp3
if (mp3buf.length > 0) {
mp3Data.push(new Int8Array(mp3buf));
}
var blob = new Blob(mp3Data,{type: 'audio/mp3'});
var url = window.URL.createObjectURL(blob);
console.log('MP3 URl: ',url);
如何将记录的缓冲区实时传递给lamejs?
解决方法
发布答案,以防有人需要。但是,并不是说输出mp3文件仍然存在一些问题。我将为此提出一个新问题。下面的代码将使您了解如何将recordRTC缓冲区传递给lamejs。 recordRTC具有ondataavailable
事件。我们可以用来将缓冲区数据传递给lamejs。
var config = {
recorderType: StereoAudioRecorder,mimeType: 'audio/wav',timeSlice: 1000,// concatenate intervals based blobs
ondataavailable: function(e) {
mp3encoder = new lamejs.Mp3Encoder(2,44100,128);
log(' data available')
const leftsamples = new Int16Array(e.data); //for stereo
const rightsamples = new Int16Array(e.data); //for stereo
let mp3Tmp = mp3encoder.encodeBuffer(leftsamples,rightsamples);
let fmp3Tmp = mp3encoder.flush();
let mp3Ct= fmp3Tmp.length;
if(mp3Ct>0) {
mp3Data.push(fmp3Tmp);
}
}
}
mediaRecorder = RecordRTC(webcamStream,config);
mediaRecorder.stopRecording(function() {
let fmp3Tmp = mp3encoder.flush();
if (fmp3Tmp.length > 0) {
mp3Data.push(new Int8Array(fmp3Tmp));
}
blob = new Blob(mp3Data,{type: 'audio/mp3'});
invokeSaveAsDialog(blob); //download file
});