如何在Javascript / Node中从Blob中编写.wav文件

我试图用fs.writeFile写一个.wav文件。 该文件已成功创build,但它只有8-13字节长,显然我没有做正确的事情。

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

我在这里非常困惑,我发现另一个类似的线程没有答案 – 在这里

任何input将不胜感激。

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> 

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

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

使用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编码的audio数据。
其余的只有它的魔力。 不要问我

我有问题得到这些为我工作。 我发现成功,并且使用此节点模块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); } }); });