Node.js nie może tworzyć obiektów BLOB?

85

Pracuję z node.js i przesłałem strumieniowo dźwięk na mój serwer node.js. Teraz zauważyłem podczas budowania bloba audio:

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

Że otrzymuję ReferenceError w nowym Blob. Wygląda na to, że Blob nie jest obsługiwany. Jak mogę utworzyć obiekt blob, który chciałbym zapisać za pomocą modułu node.js FS.

Dzięki chłopaki!

zer02
źródło
4
Co to jest Blob? Skąd to pochodzi?
Pete
1
Tak, ale obiekt blob nie jest rodzimym typem Node.js .. Wiesz, liczba, łańcuch, wartość logiczna, obiekt, tablica itp. Dlaczego nie utworzysz prototypu obiektu lub modułu dla NPM? Czy sprawdziłeś NPM pod kątem czegoś, czego potrzebujesz?
sent1nel
4
Wydaje mi się, że ci, którzy głosowali w dół, nie zrozumieli, że najwyraźniej nie ma rozwiązania tego pytania, dlatego pytam.
zer02
1
@Jonathan Rzucę okiem na to, ale czy można zdefiniować typ MIME?
zer02
1
@ zer02 Tak i nie. Zawsze możesz dodać mimewłaściwość do właściwości, Bufferponieważ jest ona nadal dynamiczna. Ale typy MIME służą do przesyłania danych binarnych; nie tyle za zapisywanie na dysku.
Jonathan Lonowski

Odpowiedzi:

33

Rozwiązaniem tego problemu jest utworzenie funkcji, która może konwertować między buforami tablicy i buforami węzłów. :)

Przekonwertuj binarny bufor NodeJS na JavaScript ArrayBuffer

W ostatnich wersjach węzłów to po prostu:

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;
zer02
źródło
Czy udało ci się to uruchomić? Mogę nagrać dźwięk do pliku, ale nie mogę go słuchać, mimo że ma odpowiedni czas.
Gabriel
możesz mi pomóc? czy zrobiłeś coś takiego w istocie? gist.github.com/anonymous/11302966
Gabriel
16
Cześć, potrzebuję tego samego co Ty, ale nie rozumiem Twojego rozwiązania. Mam to var audioBlob = new Blob ([dataview], {type: 'audio / mp3'}); ale w swoim przykładzie
używasz
7
jest let arraybufferw twoim przykładzie równa new Blob?
mesqueeb
1
ArrayBufferLikewydaje się, że brakuje pewnych właściwości z 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

Po prostu użyj 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
źródło
0

Innym rozwiązaniem do rozważenia jest użycie ciągu Base64 do przesyłania danych z serwera do klienta.

Pracuję nad projektem Node.js, w którym odbieram dane audio w postaci ArrayBuffer i chcę wysyłać i odtwarzać te dane w przeglądarce. Większość moich problemów wynikała z próby wysłania ArrayBuffer do klienta lub próby przekonwertowania ArrayBuffer i wysłania bufora.

To, co okazało się dla mnie prostym rozwiązaniem, to

  1. Przekonwertuj ArrayBuffer na ciąg zakodowany algorytmem Base64 na serwerze
  2. Zwróć / wyślij ciąg Base64 do klienta z serwera
  3. Utwórz element / obiekt Audio po stronie klienta i odtwórz dźwięk

Użyłem base64-arraybuffer do wykonania konwersji ArrayBuffer> Base64 String (choć może to być proste bez pakietu).

Użyłem wskazówek stąd aby stworzyć element audio po stronie klienta.

* Nie zrobiłem zbyt wiele w zakresie testowania limitów - więc nie wiem, jak to poradzi sobie z dużymi plikami audio.

Kogut
źródło
-2

Jako sugestię możesz przeczytać to: http://howtonode.org/really-simple-file-uploads

Chyba nie wiem, co próbujesz zrobić. Może nie być modułu dla obiektów blob, ale jeśli chcesz po prostu zapisać coś na dysku, jest moduł fs .. Ten kod nie będzie działał bezpośrednio, ale ...

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

Po prostu wyślij plik mp3 lub cokolwiek naprawdę, do / załaduj, a zapisze to na dysku. Możesz zrobić, co chcesz.

sent1nel
źródło
Witam, przesłałem strumieniowo bufory audio z GetUserMedia Audio do mojego serwera node.js i chcę zakodować tablice do WAV.
zer02
Użyłem pliku recorder.js. Nawet go przedłużyłem. Problem polega na utworzeniu serwera Blob po stronie klienta, a nie po stronie klienta. Muszę wiedzieć, czy istnieje sposób na utworzenie obiektu blob wewnątrz node.js, ponieważ przesyłam strumieniowo dźwięk bezpośrednio do node.js i chciałbym zbudować plik wav / mp3 na serwerze. :-)
zer02
Czy możesz wziąć zawartość obiektu blob, umieścić je w buforze i przepuścić bufor? Węzeł wie, jak obsługiwać bufory ORAZ możesz umieścić w nich dane binarne.
sent1nel
Przekazałem już plik binarny obiektu blob po stronie klienta do node.js (przesyłany strumieniowo), kiedy dźwięk został nagrany po stronie klienta i przetworzył go za pomocą node.js i działa. Tym razem chcę, aby node.js przejął kontrolę nad całym procesem.
zer02