Как писать.wav-файл из blob в Javascript / Node
Я пытаюсь написать .wav файл с fs.функция WriteFile. Файл создан успешно, однако он имеет длину всего 8-13bytes, поэтому, очевидно, я не делаю что-то правильно.
если 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 ответов
Вы можете преобразовать 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);
обратите внимание, что метод буфера "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);
    }
  });
});
