首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >webRTC -使用RecordRTC录制音频,并使用lamejs转换为mp3

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

Stack Overflow用户
提问于 2020-10-24 18:06:53
回答 1查看 629关注 0票数 0

我正在尝试使用recordRTC录制流音频。但我想要将输出实时转换为mp3。对于转换,我遇到了lamejs。我找到了几个例子。但我不知道如何使用它们来做我想要的。

我得到了一个blob

代码语言:javascript
复制
mediaRecorder = RecordRTC(webcamStream,{type: 'audio', mimeType: 'audio/mpeg-3',});
mediaRecorder.startRecording();

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

}

我正在尝试修复我的需求的lamejs示例。

代码语言:javascript
复制
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);

如何将录制好的buffer实时传给lamejs?

EN

回答 1

Stack Overflow用户

发布于 2020-10-24 22:32:52

张贴答案,以防有人需要它。但这并不是说输出mp3文件仍然有一些问题。为此,我将提出一个新的问题。下面的代码将告诉你如何将recordRTC缓冲区传递给lamejs。recordRTC有ondataavailable事件。我们可以用来将缓冲区数据传递给lamejs。

代码语言:javascript
复制
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
        });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64512192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档