Javascript webRTC-使用RecordRTC录制音频并使用lamejs转换为mp3

Javascript webRTC-使用RecordRTC录制音频并使用lamejs转换为mp3,javascript,recordrtc,Javascript,Recordrtc,我正在尝试使用recordRTC录制流音频。但是我想把输出实时转换成mp3。在转换过程中,我遇到了lamejs。我找到了几个例子。但我不知道如何使用它们来满足我的需求 我得到一个blob mediaRecorder = RecordRTC(webcamStream,{type: 'audio', mimeType: 'audio/mpeg-3',}); mediaRecorder.startRecording(); mediaRecorder.stopRecording(function()

我正在尝试使用recordRTC录制流音频。但是我想把输出实时转换成mp3。在转换过程中,我遇到了lamejs。我找到了几个例子。但我不知道如何使用它们来满足我的需求

我得到一个
blob

mediaRecorder = RecordRTC(webcamStream,{type: 'audio', mimeType: 'audio/mpeg-3',});
mediaRecorder.startRecording();

mediaRecorder.stopRecording(function() {
     let blob = mediaRecorder.getBlob();

}
我正试图将我的需求融入其中的一个例子

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);
channels=1//1个用于单声道,2个用于立体声
采样器=44100//44.1khz(正常mp3采样器)
kbps=128//编码128kbps mp3
mp3encoder=新的lamejs.mp3encoder(通道、采样器、kbps);
var mp3Data=[];
样本=新的INT16阵列(44100)//沉默一秒钟(从你的数据来源获取数据)
样本块大小=1152//可以是任何东西,但使其成为576的倍数,使编码器的生活更轻松
var mp3Data=[];
对于(变量i=0;i0){
mp3Data.push(mp3buf);
}
}
var mp3buf=mp3encoder.flush()//写完mp3
如果(mp3buf.length>0){
mp3Data.push(新的Int8Array(mp3buf));
}
var blob=新blob(mp3Data,{type:'audio/mp3'});
var url=window.url.createObjectURL(blob);
log('mp3url:',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
        });

请您添加一个有关MP3文件制作的相关问题的链接。谢谢。@TimHunt,我没有实现录音功能,因为我在尝试将音频转换为MP3时遇到了许多问题,包括声音的怪异行为。我放弃了这一点,把这个功能删掉了。谢谢@Newbie的回复。我最近发现这可能是我问题的答案,但我还没有时间去尝试。这似乎很好。我在挣扎的时候没有找到它,所以我无法对此发表评论。试试看。不同的浏览器以不同的工作方式使开发人员的生活陷入地狱:)。我希望有一个标准。祝你好运。