如何在 Javascript/Node 中从 blob 写入 .wav 文件

Posted

技术标签:

【中文标题】如何在 Javascript/Node 中从 blob 写入 .wav 文件【英文标题】:How to write .wav file from blob in Javascript/Node 【发布时间】:2017-01-16 15:18:22 【问题描述】:

我正在尝试使用 fs.writeFile 编写一个 .wav 文件。文件创建成功,但它只有 8-13 字节长,所以显然我做的不对。

如果 blob 已经是音频/wav,我可以写入磁盘还是需要将其转换为 Base 64?

我在这里几乎不知所措,我发现另一个没有答案的类似帖子 - Here

我们将不胜感激。

routerApp.controller('audiotest', function($scope) 
 $scope.saveToDisk = function()
  var nw = require('nw.gui');
  var fs = require('fs');
  var path = require('path');
  fs.writeFileSync('test.wav', $scope.recordedInput)
 ;

console.log($scope.recordedInput) 返回Blob size: 294956, type: "audio/wav"

这不是很相关,但这是我的 html

<div class="row" ng-controller="audiotest">
<div class="row">
    <button type="button" ng-click="saveToDisk()"> Write this sucker to disk </button>
    </div>

<ng-audio-recorder id='audioInput' audio-model='recordedInput'>
  <!-- Start controls, exposed via recorder-->
  <div ng-if="recorder.isAvailable">
    <button ng-click="recorder.startRecord()" type="button" ng-disabled="recorder.status.isRecording">
        Start Record
    </button>
    <button ng-click="recorder.stopRecord()" type="button" ng-disabled="recorder.status.isRecording === false">
        Stop Record
    </button>

</ng-audio-recorder>
</div>

【问题讨论】:

【参考方案1】:

您可以将 Blob 转换为 Typed Array,然后转换为 Buffer 以直接传递给fs.writeFileSync()

var fileReader = new FileReader();
fileReader.onload = function() 
  fs.writeFileSync('test.wav', Buffer.from(new Uint8Array(this.result)));
;
fileReader.readAsArrayBuffer($scope.recordedInput);

【讨论】:

我绝对不明白你在这里做什么,但无论如何我得到一个未捕获的 TypeError buffer.js:259 Uncaught TypeError: First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object. console.log(this.result) 在回调中显示什么? [object ArrayBuffer] 好的,那应该没有问题。你用的是什么版本的 nw.js? 版本为0.16.0【参考方案2】:

使用 mscdex 答案。

当我使用 NodeWebkit 作为浏览器时,这对我有用。

var fileReader = new FileReader();
fileReader.onload = function () 
       fs.writeFileSync('test.wav', Buffer(new Uint8Array(this.result)));
;
fileReader.readAsArrayBuffer(blob);

注意 Buffer 的“from”方法已经消失。最后一行中传递的“blob”是以 wav 编码的音频数据。 其余的,它唯一的魔法。不要问我...

【讨论】:

【参考方案3】:

我无法让其中任何一个为我工作。我找到了成功,并且使用此节点模块express-fileupload 更容易实现。这是一些代码:

var express = require('express');
var fileUpload = require('express-fileupload');

app.use(fileUpload());

app.post('/', function(req, res) 


  console.log(req.files.data);
  req.files.data.mv('test.wav', function(err) 
    if (err) 
      console.log(err);
    
  );
);

【讨论】:

以上是关于如何在 Javascript/Node 中从 blob 写入 .wav 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Javascript/Node.js 中访问函数的结果 [重复]

如何在 JavaScript/Node.js 中生成 MD5 文件哈希?

Solana - 如何从 JavaScript / Node.js 中的本地密钥对获取帐户?

如何在 JavaScript node.js 中将 xml 文件解析为数组

如何使用来自客户端 C# Winforms 的 asmx 服务 (BL) 的类函数

国产安卓手机全系通用刷机解锁BL锁-胎教级教程