2016-09-08 4 views
6

J'essaie d'écrire un fichier .wav avec fs.writeFile. Le fichier est créé avec succès, mais il n'a que 8-13 octets de long, donc évidemment je ne fais pas quelque chose de bien.Comment écrire un fichier .wav à partir de blob dans Javascript/Node

Si le blob est déjà en audio/wav, puis-je écrire sur le disque ou dois-je le convertir en Base 64?

Je suis à peu près à une perte ici, j'ai trouvé un autre fil similaire sans réponse - Here

Toute entrée serait appréciée.

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) retours Blob {size: 294956, type: "audio/wav"}

Ce n'est pas vraiment pertinent, mais voici mon code 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> 

Répondre

6

Vous pouvez convertir le Blob à un tableau typé, puis à un tampon pour passer directement à fs.writeFileSync():

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

Je ne comprends pas vraiment ce que vous faites ici, mais de toute façon, je reçois un TypeError uncaught 'buffer.js: 259 Uncaught TypeError: Le premier argument doit être une chaîne, tampon, ArrayBuffer, Array ou objet de type tableau. – angularchobo

+0

Que montre 'console.log (this.result)' dans le rappel? – mscdex

+0

'[objet ArrayBuffer]' – angularchobo

2

Utilisation de Réponse mscdex

C'est ce qui a fonctionné pour moi lorsque j'utilise NodeWebkit comme navigateur.

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

Notez que la méthode "from" de Buffer a disparu. Et "blob" qui est passé dans ma dernière ligne est des données audio encodées en wav.
Pour le reste, c'est la seule magie. Ne me demandez pas ...

0

J'ai eu des problèmes à faire fonctionner l'un ou l'autre pour moi. J'ai trouvé le succès, et la mise en œuvre beaucoup plus facile avec ce module de nœud express-fileupload. Voici un code:

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); 
    } 
    }); 
});