Node.js无法创建Blob?


81

我正在使用node.js,并将音频流式传输到node.js服务器。现在,我在构建音频Blob的过程中注意到:

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

我在新的Blob处收到ReferenceError。似乎不支持Blob。如何创建要使用node.js fs模块保存的Blob。

谢谢你们!


4
什么是Blob?它从何而来?
皮特

1
是的,但是blob不是本机的Node.js类型。您知道Number,String,Boolean,Object,Array等。为什么不为NPM创建对象原型或模块?您是否检查过NPM是否有您需要的东西?
send1nel

4
在我看来,那些投票否决的人似乎并没有意识到这个问题显然没有解决办法,这就是我要问的原因。
zer02

1
@Jonathan我将对此进行介绍,但是可以定义MIME类型吗?
zer02

1
@ zer02是和否。您可以随时向其添加mime属性,Buffer因为它仍然是动态的。但是,MIME类型用于传递二进制数据。没有太多的保存到磁盘。
乔纳森·洛诺夫斯基

Answers:


33

解决此问题的方法是创建一个可以在数组缓冲区和节点缓冲区之间转换的函数。:)

将二进制NodeJS缓冲区转换为JavaScript ArrayBuffer

在最新的节点版本中,它只是:

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

您设法使其正常工作了吗?我可以将音频录制到文件中,但是时间合适,但我无法收听。
加百利

你能帮助我吗?您在主旨上做了这样的事情吗?gist.github.com/anonymous/11302966
Gabriel

12
嗨,我需要和您一样的人,但我不了解您的解决方案。我有这个var audioBlob = new Blob([dataview],{type:'audio / mp3'}); 但您在示例中使用了“ arrayBuffer”变量
oihi08 '02

7
let arraybuffer在你的榜样等于new Blob
mesqueeb

1
ArrayBufferLike似乎从缺少某些属性Blobts 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;

1

要考虑的另一种解决方案是使用Base64字符串将数据从服务器传输到客户端。

我正在一个Node.js项目中,我以ArrayBuffer的形式接收音频数据,我想在浏览器中发送和播放该数据。我大部分的努力来自尝试将ArrayBuffer发送到客户端或尝试转换ArrayBuffer并发送Buffer。

最终对我来说是一个简单的解决方案是

  1. 在服务器上将ArrayBuffer转换为Base64编码的字符串
  2. 从服务器返回/发送Base64字符串给客户端
  3. 在客户端创建一个Audio元素/对象并播放声音

我使用了base64-arraybuffer来执行ArrayBuffer> Base64 String转换(尽管没有包也可以很简单地完成此操作)。

我从这里开始使用技巧在客户端上创建音频元素。

*我在测试极限方面做得并不多-因此我不知道这可能如何处理大型音频文件。


-2

作为建议,您可能需要阅读以下内容:http : //howtonode.org/really-simple-file-uploads

我的意思是我想我不知道你想做什么。可能没有用于Blob的模块,但是如果您只想向磁盘写入内容,则有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或其他内容发布到/ upload,它就会将其写入磁盘。您可以执行所需的任何验证。


您好,我将GetUserMedia Audio的音频缓冲区流式传输到我的node.js服务器,并想将数组编码为WAV。
zer02

我用过recorder.js。我什至扩展了它。问题是创建服务器端而不是客户端的Blob。我需要知道是否有一种在node.js内创建blob的方法,因为我将音频直接流式传输到node.js并想在服务器上构建wav / mp3文件。:-)
zer02

您能否将Blob的内容放入缓冲区中,然后将缓冲区发射出去?Node知道如何处理缓冲区,并且您可以将二进制数据放入其中。
send1nel

我已经将客户端blob二进制文件传输到了node.js(流式传输),最初是在客户端上录制了音频,然后使用node.js处理了它,然后它就可以工作了。这次,我希望node.js能够控制整个过程。
zer02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.