web-dev-qa-db-ja.com

JavaScript / NodeのBLOBから.wavファイルを書き込む方法

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>
_
10
angularchobo

Blobを型付き配列に変換してから、fs.writeFileSync()に直接渡すためのバッファに変換できます。

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

これらのいずれかが機能するようにするには問題がありました。このノードモジュール 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);
    }
  });
});
2
rickrizzo

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でエンコードされたオーディオデータです。
残りは、その唯一の魔法です。聞かないで...

2
Doctor