web-dev-qa-db-fra.com

Comment écrire un fichier .wav à partir de blob en Javascript/Node

J'essaie d'écrire un fichier .wav avec fs.writeFile. Le fichier a été créé avec succès, mais sa longueur n’est que de 8 à 13 octets. Il est donc évident que je ne fais rien de bien.

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

Je suis un peu perdue ici, j'ai trouvé un autre fil similaire sans réponse - Ici

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) renvoie 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>
8
angularchobo

Vous pouvez convertir le blob en tableau typé puis en tampon pour le passage direct à fs.writeFileSync():

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

Utilisation de mscdex answer.

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, sa seule magie. Ne me demande pas ...

2
Doctor

J'ai eu du mal à obtenir l'un ou l'autre de ces objectifs 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);
    }
  });
});
1
rickrizzo