Web Audio API - 如何录制为 MP3 格式?

24

我询问是因为我无法在任何地方找到答案。 我已经成功地使用RecorderJS来记录JS中的麦克风输入。然而,录制的文件是WAV格式,导致文件很大。我正在寻找一种方法直接使用JS进行MP3录音,或以某种方式将位编码为MP3而不是WAV。

如何完成?是否有Web Audio API函数可以完成此操作或JS MP3编码器之类的工具?


我只知道另一种解码方式,即从MP3到WAV的转换-https://github.com/audiocogs/mp3.js。你可能需要深入研究https://github.com/kripken/emscripten,以在JS中获得WAV到MP3编码器。 - Stasik
谢谢,我正在研究Emscripten,但我仍然不知道它如何帮助。 - Light
你需要获取一些C语言编写的wav-mp3解码器,然后在浏览器中将wav解码为mp3 :) - Stasik
7个回答

13

我所见过的唯一一款JavaScript MP3编码器是https://github.com/akrennmair/libmp3lame-js,这是一个使用emscripten进行移植的库。据说它很慢,而且我从未使用过。

我不知道是否有原生编写的JavaScript MP3编码器,而且编码不包含在Web Audio API中。


10

有一个纯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

lamejs 对我来说效果很好。它似乎没有问题跟上实时,消除了工作线程的需要。我在我的网站上创建了一个测试页面,并提供了详细的说明。 - TeasingDart

2
我对这个问题感到沮丧,现有的解决方案也无法满足需求,因此我想出了一种更简单的方法:

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));

          });

大部分基于RecorderJS,但修改了一些内容以便导出为mp3文件,并且不需要使用AudioContext / navigator.getUs。

2
我发现了一个带有实时演示的不错的库:MediaStreamRecorder
其中一个演示在这里:音频录制RecordRTC 也很有用,但似乎以 MSR 开始更容易。请注意保留原文中的 HTML 标签,不要添加说明。

1

1

1

我为我的项目创建了一个易于使用的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();

例如,要以128 kbps的速度录制用户的单声道麦克风:
    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();

点击此处查看实时演示和源代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接