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

10

我试图使用fs.writeFile编写.wav文件。文件已成功创建,但长度仅为8-13字节,所以显然我做错了什么。

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

我几乎一无所知,在另一个类似的帖子中找到了没有答案的问题 - 在这里

任何建议都将不胜感激。

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>
3个回答

10

您可以将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);

1
我确实不理解你在这里做什么,但是我遇到了一个未捕获的类型错误 buffer.js:259 Uncaught TypeError: 第一个参数必须是字符串、缓冲区、数组缓冲区、数组或类似数组对象。. - angularchobo
在回调函数中,console.log(this.result) 显示什么? - mscdex
版本号为0.16.0。 - angularchobo
我认为node中存在一个错误,阻止它将其识别为ArrayBuffer(因为node和“浏览器”处于不同的V8上下文中)。目前,您应该使用new Uint8Array(this.result)代替this.result来使其正常工作。 - mscdex
这是有关Node的相关错误修复在这里,FWIW。 - mscdex
显示剩余3条评论

1

我在使用这两个选项时遇到了问题。我发现使用这个Node.js模块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);
    }
  });
});

0

使用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编码的音频数据。
至于其余部分,那就只是魔法了。别问我……

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接