Javascript webRTC-使用RecordRTC录制音频并使用lamejs转换为mp3
我正在尝试使用recordRTC录制流音频。但是我想把输出实时转换成mp3。在转换过程中,我遇到了lamejs。我找到了几个例子。但我不知道如何使用它们来满足我的需求 我得到一个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()
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的回复。我最近发现这可能是我问题的答案,但我还没有时间去尝试。这似乎很好。我在挣扎的时候没有找到它,所以我无法对此发表评论。试试看。不同的浏览器以不同的工作方式使开发人员的生活陷入地狱:)。我希望有一个标准。祝你好运。