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

Posted

技术标签:

【中文标题】在客户端 JavaScript 中将 WAV 转换为任何压缩音频格式【英文标题】:Converting WAV to any compressed audio format in client-side JavaScript 【发布时间】: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 中不起作用。

谢谢!

【问题讨论】:

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

【讨论】:

以上是关于在客户端 JavaScript 中将 WAV 转换为任何压缩音频格式的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Android 中将 .mid 转换为 .wav 文件?

在 C# 或 C++ 中将压缩的 wav 文件转换为未压缩的 wav 文件的最简单方法是啥?

在 .NET 中将 Opus (.ogg) 转换为 PCM (.wav)

在Android中将WAV文件转换为矢量

在Java中将mp3转换为wav

如何在 Python 中将 WAV 从立体声转换为单声道?