在客户端JavaScript中将WAV转换为任何压缩音频格式

时间:2013-07-03 19:57:58

标签: javascript wav audio-recording getusermedia

我正在使用Recorder.js在浏览器中录制来自getUserMedia({audio:true});的音频,然后将其导出为WAV文件,因为这是该库提供的唯一选项。

1分20秒的文件大14.1 MB。我需要将音频上传到服务器,我需要快速完成。如何以任何其他压缩格式转换WAV音频以降低文件大小?

我不介意转换为:

  • MP3
  • 作品
  • 的WebM
  • 奥格
  • FLAC
  • 您知道的任何其他格式

如果目前无法转换为这些格式中的任何一种,我该如何压缩客户端上的WAV文件?

PS:我做了很多搜索,找到了在JS中转换WAV的东西,却什么也没找到。 libmp3lame.js无法在Chrome中使用。

谢谢!

5 个答案:

答案 0 :(得分:31)

我已经制作了一个录音机,可以直接从浏览器中记录到MP3,并结合RecorderJS和libmp3lame.js

您可以在此处找到gitHub项目: https://github.com/nusofthq/Recordmp3js

以及对实施的更详细说明: http://nusofthq.com/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/

答案 1 :(得分:4)

你真正想要的是mediaStream“Recording API”,目前正在进行中。在可用之前,我建议在C / C ++源代码上使用emscriptem,并考虑在webworker中运行它以避免阻止UI和其他选项卡。

答案 2 :(得分:3)

我遇到了同样的问题 提出了一个非常快速和肮脏的解决方案:

  • 使用zip.js压缩wav文件(适用于Chrome,Firefox,Safari 6和Internet Explorer 10)

进一步的英特尔见Documentation zip.js

至少这会减小很多尺寸,文件大约小于75%,因此 1:4压缩

更新:或许看看这个:https://webrtc.github.io/samples/

这是谷歌开发的Chrome和Firefox的聊天应用程序,我假设有一种CC-License

答案 3 :(得分:2)

我有一个类似的问题(也使用recorder.js),并设法解决使用精湛的videoconverter.js项目,其中包括使用emscripen的ffmpeg端口到Javascript。这方面的缺点是ffmpeg.js文件约为25Mb。

我修改了recorderWorker.js中现有的exportWAV函数,以返回WAV(用于HTML5 <audio>播放)和包含编码的MP2文件的Blob:

function encodeWAV(samples) {

  var buffer = new ArrayBuffer(44 + samples.length * 2);
  var view = new DataView(buffer);

  /* ... various writing methods */

  return { wavdata: new Blob([buffer], { type: "audio/wav" }), mp2data: ffmpeg_convert(buffer) };
}

function ffmpeg_convert(buffer) {
    console.log("starting mp2 conversion");
    var args = "-i input -f mp2 output.mp2";
    var results = ffmpeg_run({
        arguments: args.split(" "),
        files: [
          {
              data: new Uint8Array(buffer),
              "name": "input"
          }
        ]
    });
    if (results) {
        var file = results[0];
        console.log("File recieved", file.name, file.data);
        return new Blob([file.data], { type: "audio/mpeg" });
    }
    return null;
}

此方法可用于将WAV编码为ffmpeg的libavcodec

所支持的任何编解码器

答案 4 :(得分:1)

我能够使用opus.js

实现压缩

你可以在这里找到我的实现:recordOpus,但有一个问题,我的是服务器端,我使用node.js服务器....