Node.js не може створити Blobs?


85

Я працюю з node.js і передав аудіо на свій сервер node.js. Тепер я помітив під час побудови аудіо-крапки:

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

Що я отримую ReferenceError у новій Blob. Здається, Blob не підтримується. Як я можу створити крапку, яку я хотів би зберегти за допомогою модуля node.js fs.

Спасибі, хлопці!


4
Що таке Blob? Звідки це береться?
Піт

1
Так, але blob не є рідним типом Node.js .. Знаєте, Number, String, Boolean, Object, Array тощо. Чому б вам не створити прототип об'єкта або модуль для NPM? Ви перевіряли NPM на щось подібне до того, що вам потрібно?
sent1nel

4
Мені здається, що ті, хто проголосував проти, не зрозуміли, що, мабуть, немає вирішення цього питання, ось чому я прошу.
zer02

1
@Jonathan Я подивлюсь на це, але чи можна визначити тип MIME?
zer02

1
@ zer02 Так і ні. Ви завжди можете додати mimeвластивість до, Bufferоскільки воно все ще динамічне. Але типи MIME призначені для передачі двійкових даних; не стільки для збереження на диск.
Джонатан Лоновський

Відповіді:


33

Рішенням цієї проблеми є створення функції, яка може перетворювати між буферами масивів та буферами вузлів. :)

Перетворити двійковий буфер NodeJS на JavaScript ArrayBuffer

В останніх версіях вузлів це просто:

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;

Вам вдалося змусити це запрацювати? Я можу записати аудіо у файл, але я не можу його слухати, хоча у нього є потрібний час.
Габріель

можеш допомогти мені? ви робили щось подібне на суть? gist.github.com/anonymous/11302966
Габріель

16
Привіт, мені потрібно те саме, що і ти, але я не розумію твого рішення. У мене є var audioBlob = new Blob ([dataview], {type: 'audio / mp3'}); але ви використовуєте змінну "arrayBuffer" у вашому прикладі
oihi08

7
знаходиться let arraybufferв вашому прикладі дорівнює new Blob?
mesqueeb

1
ArrayBufferLikeсхоже, бракує певних властивостей з 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
Матея Петрович

11

Просто використовуйте 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;

0

Іншим рішенням, яке слід розглянути, є використання рядка Base64 для передачі даних із сервера на клієнта.

Я працюю над проектом Node.js, де отримую аудіодані у вигляді ArrayBuffer, і я хочу надсилати та відтворювати ці дані у браузері. Більшість моїх труднощів виникали внаслідок спроби відправити ArrayBuffer клієнту або спроби перетворити ArrayBuffer і надіслати буфер.

Що виявилося простим рішенням для мене, це було

  1. Перетворіть ArrayBuffer у рядок, кодований Base64, на сервері
  2. Повернення / надсилання рядка Base64 клієнту з сервера
  3. Створіть звуковий елемент / об’єкт на стороні клієнта та відтворіть звук

Я використовував base64-arraybuffer для виконання перетворення ArrayBuffer> Base64 String (хоча це може бути просто зробити без пакета).

Я використовував поради тут, щоб створити звуковий елемент на стороні клієнта.

* Я не надто зробив тестування обмежень - тому я не знаю, як це може обробляти великі аудіофайли.


-2

Як пропозицію, ви можете прочитати це: http://howtonode.org/really-simple-file-uploads

Я маю на увазі, мабуть, я не знаю, що ти намагаєшся зробити. Можливо, не існує модуля для крапок, але якщо ви хочете просто написати щось на диск, є модуль fs .. Цей код не працюватиме безпосередньо, але ..

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

Просто опублікуйте mp3-файл або щось інше на / завантажте, і він запише його на диск. Ви можете робити будь-яку перевірку, яку хочете.


Привіт, я передав аудіо-буфери GetUserMedia Audio на мій сервер node.js і хочу кодувати масиви у форматі WAV.
zer02

Я використовував recorder.js. Я навіть продовжив його. Проблема полягає у створенні Blob на стороні сервера, а не на стороні клієнта. Мені потрібно знати, чи є спосіб створити крапку всередині node.js, тому що я передаю аудіо безпосередньо на node.js і хотів би створити файл wav / mp3 на сервері. :-)
zer02

Чи можете ви взяти вміст краплини, покласти його в буфер і перестрілити буфер? Вузол знає, як обробляти буфери, І ви можете вставити в них двійкові дані.
sent1nel

Я вже передав двосторонній двосторонній блок-блок-файл на node.js (потоковий), коли аудіо спочатку було записано на стороні клієнта та оброблено його за допомогою node.js, і він працює. Цього разу я хочу, щоб node.js взяв під контроль весь процес.
zer02
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.