¿Node.js no puede crear blobs?

82

Estoy trabajando con node.js y transmití mi audio a mi servidor node.js. Ahora noté durante el proceso de construcción del blob de audio:

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

Que obtengo un ReferenceError en el nuevo Blob. Parece que Blob no es compatible. ¿Cómo puedo crear un blob que me gustaría guardar con el módulo node.js fs?

¡Gracias chicos!

zer02
fuente
4
¿Qué es Blob? ¿De dónde viene?
Pete
1
Sí, pero un blob no es un tipo nativo de Node.js ... Ya sabes, Número, Cadena, Booleano, Objeto, Matriz, etc. ¿Por qué no creas un prototipo de objeto o un módulo para NPM? ¿Verificó NPM para algo parecido a lo que necesita?
enviado
4
A mí me parece que los que votaron en contra no entendieron que aparentemente no hay solución a esta pregunta, por eso estoy preguntando.
zer02
1
@Jonathan Voy a echar un vistazo a esto, pero ¿es posible definir el tipo MIME?
zer02
1
@ zer02 Sí y no. Siempre puede agregar una mimepropiedad al Bufferya que sigue siendo dinámico. Pero, los tipos MIME son para comunicar datos binarios; no tanto por guardar en disco.
Jonathan Lonowski

Respuestas:

33

La solución a este problema es crear una función que pueda convertir entre Array Buffers y Node Buffers. :)

Convierta un búfer binario NodeJS en JavaScript ArrayBuffer

En las versiones recientes de nodos es solo:

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;
zer02
fuente
¿Lograste que funcionara? Puedo grabar el audio en un archivo pero no puedo escucharlo a pesar de que tiene el tiempo adecuado.
Gabriel
¿me puedes ayudar? ¿Hiciste algo como esto en la esencia? gist.github.com/anonymous/11302966
Gabriel
12
Hola, necesito lo mismo que tú, pero no entiendo tu solución. Tengo esta var audioBlob = new Blob ([dataview], {type: 'audio / mp3'}); pero usa la variable "arrayBuffer" en su ejemplo
oihi08
7
es let arraybufferen su ejemplo igual a new Blob?
mesqueeb
1
ArrayBufferLikeparece que le faltan ciertas propiedades de 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

Solo usa 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
fuente
1

Otra solución a considerar es utilizar una cadena Base64 para transferir datos desde el servidor al cliente.

Estoy trabajando en un proyecto de Node.js donde recibo datos de audio en forma de ArrayBuffer y quiero enviar y reproducir esos datos en el navegador. La mayoría de mis problemas surgieron al intentar enviar ArrayBuffer al cliente o intentar convertir ArrayBuffer y enviar un Buffer.

Lo que terminó siendo una solución simple para mí fue

  1. Convierta el ArrayBuffer en una cadena codificada en Base64 en el servidor
  2. Devolver / enviar la cadena Base64 al cliente desde el servidor
  3. Cree un elemento / objeto de audio en el lado del cliente y reproduzca el sonido

Utilicé base64-arraybuffer para realizar la conversión ArrayBuffer> Base64 String (aunque puede ser sencillo hacerlo sin un paquete).

Usé consejos de aquí para crear el elemento de audio en el lado del cliente.

* No he hecho mucho en cuanto a probar los límites, por lo que no sé cómo esto podría manejar archivos de audio grandes.

Gallo
fuente
-2

Como sugerencia, es posible que desee leer esto: http://howtonode.org/really-simple-file-uploads

Quiero decir, supongo que no sé lo que estás intentando hacer. Puede que no haya un módulo para blobs, pero si solo desea escribir algo en el disco, está el módulo fs. Este código no funcionará directamente, pero ...

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

Simplemente publique un mp3, o cualquier cosa en realidad, en / upload, y lo escribirá en el disco. Puede hacer la validación que desee.

sent1nel
fuente
Hola, transmití los búferes de audio de GetUserMedia Audio a mi servidor node.js y quiero codificar las matrices en WAV.
zer02
He usado recorder.js. Incluso lo extendí. El problema es crear el blob en el servidor, no en el cliente. Necesito saber si hay una manera de crear un blob dentro de node.js, porque estoy transmitiendo el audio directamente a node.js y me gustaría construir el archivo wav / mp3 en el servidor. :-)
zer02
¿Puede tomar el contenido del blob, ponerlo en un búfer y dispararlo al otro lado? Node sabe cómo manejar búferes, Y puede poner datos binarios en ellos.
enviado
Ya transferí el binario de blob del lado del cliente a node.js (transmitido), cuando el audio se grabó en el lado del cliente en primer lugar y lo procesé con node.js y funciona. Esta vez quiero que node.js tome el control de todo el proceso.
zer02