web-dev-qa-db-ger.com

Wie schreibt man eine .wav-Datei aus blob in Javascript/Node?

Ich versuche, eine .wav-Datei mit fs.writeFile zu schreiben. Die Datei wurde erfolgreich erstellt, sie ist jedoch nur 8-13 Byte lang, daher mache ich offensichtlich nichts richtig.

Wenn das Blob bereits Audio/WAV ist, kann ich auf die Festplatte schreiben oder muss ich es in Base 64 konvertieren?

Ich bin ziemlich ratlos hier, ich fand einen anderen ähnlichen Thread ohne Antwort - Hier

Jede Eingabe wäre dankbar.

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

Es ist nicht wirklich relevant, aber hier ist mein 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

Sie können den Blob in ein typisiertes Array und dann in einen Puffer konvertieren, um ihn direkt an fs.writeFileSync() zu übergeben:

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

Verwenden von mscdex answer.

Dies hat bei mir funktioniert, wenn NodeWebkit als Browser verwendet wird.

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

Beachten Sie, dass die "from" -Methode des Puffers verschwunden ist. Und "Blob", der in meiner letzten Zeile übergeben wird, sind Audiodaten, die in wav codiert sind.
Für den Rest ist es nur Magie. Frag mich nicht ...

2
Doctor

Ich hatte Probleme, einen dieser beiden für mich zu arbeiten. Ich habe mit diesem Knotenmodul express-fileupload Erfolg und eine viel einfachere Implementierung gefunden. Hier ist ein 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