【问题标题】:Converting WAV to any compressed audio format in client-side JavaScript在客户端 JavaScript 中将 WAV 转换为任何压缩音频格式
【发布时间】:2013-07-01 16:14:16
【问题描述】:

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

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

我不介意转换为:

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

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

PS:我做了很多搜索以找到在 JS 中转换 WAV 的任何内容,但一无所获。 libmp3lame.js 在 Chrome 中不起作用。

谢谢!

【问题讨论】:

  • 我在stackoverflow.com/questions/17507799/… 有一个类似的帖子——我遇到了基本相同的问题,我真的希望有人回答你的问题。
  • 我昨天看到了你的问题。对我来说,文件太大,所以将它上传到服务器并转换它不是一个可行的选择。对于你的情况,如果你想上传然后转换,使用虚拟机是最好的选择。
  • @ArjunBajaj 你找到解决方案了吗?如果你愿意,我很感兴趣。

标签: javascript wav audio-recording getusermedia


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题 想出了一个快速而肮脏的解决方案:

    • 使用 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】:

    我遇到了类似的问题(也使用了 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】:

      我制作了一个录音机,可以直接从结合 RecorderJS 和 libmp3lame.js 的浏览器录制到 mp3

      你可以在这里找到 gitHub 项目: https://github.com/nusofthq/Recordmp3js

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

      【讨论】:

      • 谢谢,谢谢,谢谢。我希望我能投票 1000 次
      • @Remus Negrota,这适用于 Chrome,但在 Firefox 上挂起。我的研究发现,Firefox 的 libmp3lame.min.js 中出现了无限循环。您使用的是 libmp3lame.min.js 的修改版本吗?
      【解决方案5】:

      我能够使用opus.js 实现压缩,

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

      【讨论】:

        猜你喜欢
        • 2013-02-06
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 1970-01-01
        • 1970-01-01
        • 2011-03-12
        • 1970-01-01
        • 2013-02-02
        相关资源
        最近更新 更多