Node.js kann keine Blobs erstellen?

80

Ich arbeite mit node.js und habe mein Audio auf meinen node.js-Server gestreamt. Jetzt bemerkte ich beim Erstellen des Audio-Blobs:

var audioBlob = new Blob([dataview], { type: 'audio/wav' });

Dass ich bei neuem Blob einen ReferenceError bekomme. Es scheint, dass Blob nicht unterstützt wird. Wie kann ich einen Blob erstellen, den ich mit dem Modul node.js fs speichern möchte?

Danke Leute!

zer02
quelle
4
Was ist Blob? Woher kommt das?
Pete
1
Ja, aber ein Blob ist kein nativer Node.js-Typ. Sie wissen, Number, String, Boolean, Object, Array usw. Warum erstellen Sie keinen Objektprototyp oder ein Modul für NPM? Haben Sie NPM auf etwas überprüft, was Sie brauchen?
Sent1nel
4
Mir scheint, dass diejenigen, die abgelehnt haben, nicht verstanden haben, dass es anscheinend keine Lösung für diese Frage gibt, deshalb frage ich.
zer02
1
@ Jonathan Ich werde einen Blick darauf werfen, aber ist es möglich, den MIME-Typ zu definieren?
zer02
1
@ zer02 Ja und nein. Sie können dem jederzeit eine mimeEigenschaft hinzufügen , Bufferda diese noch dynamisch ist. MIME-Typen dienen jedoch zur Kommunikation von Binärdaten. nicht so sehr zum Speichern auf der Festplatte.
Jonathan Lonowski

Antworten:

33

Die Lösung für dieses Problem besteht darin, eine Funktion zu erstellen, die zwischen Array-Puffern und Knotenpuffern konvertieren kann. :) :)

Konvertieren Sie einen binären NodeJS-Puffer in JavaScript ArrayBuffer

In neueren Knotenversionen ist es nur:

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;
zer02
quelle
Hast du es geschafft, es zum Laufen zu bringen? Ich kann das Audio in eine Datei aufnehmen, aber ich kann es nicht anhören, obwohl es die richtige Zeit hat.
Gabriel
können Sie mir helfen? Hast du so etwas im Kern gemacht? gist.github.com/anonymous/11302966
Gabriel
12
Hallo, ich brauche dasselbe wie du, aber ich verstehe deine Lösung nicht. Ich habe diesen var audioBlob = new Blob ([dataview], {type: 'audio / mp3'}); Aber Sie verwenden die Variable "arrayBuffer" in Ihrem Beispiel
oihi08
7
ist let arraybufferin deinem Beispiel gleich new Blob?
Mesqueeb
1
ArrayBufferLikescheint bestimmte Eigenschaften zu fehlen von Blob:ts Argument of type 'ArrayBufferLike' is not assignable to parameter of type 'File | Blob'. Type 'ArrayBuffer' is not assignable to type 'File | Blob'. Type 'ArrayBuffer' is missing the following properties from type 'Blob': size, type, arrayBuffer, stream, text
Mateja Petrovic
11

Verwenden Sie einfach cross-blob:

const Blob = require("cross-blob");

new Blob([]);
//=> Blob {size: 0, type: ""}

// Global patch (to support external modules like is-blob).
globalThis.Blob = Blob;
Richie Bendall
quelle
1

Eine andere zu berücksichtigende Lösung besteht darin, eine Base64-Zeichenfolge zu verwenden, um Daten vom Server zum Client zu übertragen.

Ich arbeite an einem Node.js-Projekt, bei dem ich Audiodaten in Form eines ArrayBuffers empfange und diese Daten im Browser senden und wiedergeben möchte. Die meisten meiner Probleme waren auf den Versuch zurückzuführen, den ArrayBuffer an den Client zu senden oder den ArrayBuffer zu konvertieren und einen Puffer zu senden.

Was für mich eine einfache Lösung war, war zu

  1. Konvertieren Sie den ArrayBuffer in einen Base64-codierten String auf dem Server
  2. Rückgabe / Senden der Base64-Zeichenfolge vom Server an den Client
  3. Erstellen Sie auf der Client-Seite ein Audio-Element / -Objekt und spielen Sie den Sound ab

Ich habe base64-arraybuffer verwendet , um die Konvertierung von ArrayBuffer> Base64 String durchzuführen (es kann jedoch einfach sein, dies ohne ein Paket zu tun).

Ich habe Tipps von hier verwendet , um das Audioelement auf der Clientseite zu erstellen.

* Ich habe beim Testen von Grenzwerten nicht viel getan - daher weiß ich nicht, wie dies mit großen Audiodateien umgehen kann.

Hahn
quelle
-2

Als Vorschlag möchten Sie vielleicht Folgendes lesen: http://howtonode.org/really-simple-file-uploads

Ich glaube, ich weiß nicht, was Sie versuchen zu tun. Es gibt möglicherweise kein Modul für Blobs, aber wenn Sie nur etwas auf die Festplatte schreiben möchten, gibt es das fs-Modul. Dieser Code funktioniert nicht direkt, aber ..

var fs = require('fs')
  , express = require('express')

app.post('/upload', function (req, res) {
  // asynch call to write file to disk
  fs.write("/tmp/file.mp3", req.params.body, function (err) {
    if (err) console.log(err)
  });
  res.end();
});

Posten Sie einfach eine MP3-Datei oder etwas wirklich zum Hochladen und schreiben Sie sie auf die Festplatte. Sie können jede gewünschte Validierung durchführen.

sent1nel
quelle
Hallo, ich habe die Audiopuffer von GetUserMedia Audio auf meinen node.js-Server gestreamt und möchte die Arrays in WAV codieren.
zer02
Ich habe recorder.js verwendet. Ich habe es sogar erweitert. Das Problem besteht darin, dass der Blob serverseitig und nicht clientseitig erstellt wird. Ich muss wissen, ob es eine Möglichkeit gibt, einen Blob in node.js zu erstellen, da ich das Audio direkt auf node.js streame und die wav / mp3-Datei auf dem Server erstellen möchte. :-)
zer02
Können Sie den Inhalt des Blobs nehmen, in einen Puffer legen und den Puffer darüber schießen? Der Knoten weiß, wie man mit Puffern umgeht, UND Sie können Binärdaten in sie einfügen.
Sent1nel
Ich habe die clientseitige Blob-Binärdatei bereits auf node.js (gestreamt) übertragen, als das Audio zuerst auf der Client-Seite aufgenommen und mit node.js verarbeitet wurde und es funktioniert. Dieses Mal möchte ich, dass node.js die Kontrolle über den gesamten Prozess übernimmt.
zer02