webRTC-使用RecordRTC录制音频并使用lamejs

问题描述

我正在尝试使用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
        });