我询问是因为我无法在任何地方找到答案。 我已经成功地使用RecorderJS来记录JS中的麦克风输入。然而,录制的文件是WAV格式,导致文件很大。我正在寻找一种方法直接使用JS进行MP3录音,或以某种方式将位编码为MP3而不是WAV。
如何完成?是否有Web Audio API函数可以完成此操作或JS MP3编码器之类的工具?
我询问是因为我无法在任何地方找到答案。 我已经成功地使用RecorderJS来记录JS中的麦克风输入。然而,录制的文件是WAV格式,导致文件很大。我正在寻找一种方法直接使用JS进行MP3录音,或以某种方式将位编码为MP3而不是WAV。
如何完成?是否有Web Audio API函数可以完成此操作或JS MP3编码器之类的工具?
我所见过的唯一一款JavaScript MP3编码器是https://github.com/akrennmair/libmp3lame-js,这是一个使用emscripten进行移植的库。据说它很慢,而且我从未使用过。
我不知道是否有原生编写的JavaScript MP3编码器,而且编码不包含在Web Audio API中。
有一个纯JavaScript编写的库,名为lamejs。它可以从原始音频中编码出MP3文件。它比使用emscripten编译的libmp3lame要快得多。https://github.com/zhuker/lamejs
用法示例:
lib = new lamejs();
mp3encoder = new lib.Mp3Encoder(1, 44100, 128); //mono 44.1khz encode to 128kbps
samples = new Int16Array(44100); //one second of silence
var mp3 = mp3encoder.encodeBuffer(samples); //encode mp3
https://github.com/sb2702/audioRecord.js
用法
创建一个录音对象(异步,因为需要用户许可)
Recorder.new(function(recorder){
});
recorder.start();
recorder.stop();
导出为mp3格式
recorder.exportMP3(function(mp3Blob){
console.log("Here is your blob: " + URL.createObjectURL(mp3Blob));
});
将编码转换为较小格式目前仅由Firefox支持:
Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
不支持 25.0 (25.0) 不支持 不支持 不支持
据我所知,只有OGG格式受支持。但是OGG比WAV更好。
使用Web Worker通过JavaScript录制mp3而不使用任何其他框架,您可以使用此项目:https://github.com/nusofthq/Recordmp3js,这里也有非常好的解释:
http://audior.ec/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/
使用此功能,您可以将文本写入 .mp3 文件并使其可下载。
我为我的项目创建了一个易于使用的lamejs包装器。它可以以任何比特率将声音记录为单声道或立体声的MP3格式。您只需告诉它要记录哪个AudioNode即可。
import { Mp3Recorder } from './Mp3Recorder.mjs';
let recorder = new Mp3Recorder();
await recorder.configure(inputAudioNode, channels, bitRate);
recorder.start();
recorder.pause();
recorder.resume();
let bytes = await recorder.getRecordedSize();
let mp3 = await recorder.stop();
const audio = new AudioContext();
let micStream = await navigator.mediaDevices.getUserMedia({ audio: true })
const mic = audio.createMediaStreamSource(micStream);
await recorder.configure(mic, 1, 128);
recorder.start();
// ...later, when you're ready to stop recording:
let mp3 = await recorder.stop();