如何从 Javascript/Node 中的 blob 写入 .wav 文件
How to write .wav file from blob in Javascript/Node
我正在尝试使用 fs.writeFile 编写 .wav 文件。文件创建成功,但是它只有 8-13 个字节长,所以显然我做错了什么。
如果 blob 已经 audio/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)
returns 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 转换为类型化数组,然后转换为缓冲区以直接传递给 fs.writeFileSync()
:
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编码的音频数据。
对于其余部分,它是唯一的魔法。不要问我...
我在让其中任何一个为我工作时遇到了问题。我找到了成功,并且使用这个节点模块 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);
}
});
});
我正在尝试使用 fs.writeFile 编写 .wav 文件。文件创建成功,但是它只有 8-13 个字节长,所以显然我做错了什么。
如果 blob 已经 audio/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)
returns 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 转换为类型化数组,然后转换为缓冲区以直接传递给 fs.writeFileSync()
:
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编码的音频数据。
对于其余部分,它是唯一的魔法。不要问我...
我在让其中任何一个为我工作时遇到了问题。我找到了成功,并且使用这个节点模块 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);
}
});
});