首页 > 解决方案 > 使用lamejs将blob编码为mp3

问题描述

我使用一个简单的脚本从麦克风录制音频,此代码为演示目的而简化。

navigator.mediaDevices.getUserMedia({audio: true}).then(function(stream) {
    const mediaRecorder = new window.MediaRecorder(stream);

    mediaRecorder.ondataavailable = function(e) {
        const chunk = e.data;

        const fileReader = new FileReader();

        fileReader.onload = function (event) {
            const mp3Data = [];
            const mp3encoder = new lamejs.Mp3Encoder(1, 44100, 128);
            const samples = new Int16Array(event.target.result);  // <- Some times this arrayBuffer contains Int16Array sometimes it doesn't

            var mp3Tmp = mp3encoder.encodeBuffer(samples);
            mp3Data.push(mp3Tmp);
            mp3Tmp = mp3encoder.flush();
            mp3Data.push(mp3Tmp);

            const blob = new Blob(mp3Data, {type: 'audio/mp3'});
            const file = new File([blob], 'audio-recording.mp3', {type: 'audio/mp3'});
        }
    }
});

如果 arrayBuffer 包含 Int16Array 它的长度很小,这看起来很奇怪。所以我有点猜测那部分工作不正常。

当我下载 blob 时它太短而且只有噪音。

我一直试图让这个片段整天工作,但没有成功。

任何帮助表示赞赏,

标签: javascriptgetusermedianavigator

解决方案


推荐阅读