Node.js 不能创建 Blob?

IT技术 javascript html node.js audio
2021-02-04 15:48:02

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

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

我在新的 Blob 上得到了一个 ReferenceError。似乎不支持 Blob。如何创建一个我想用 node.js fs module保存的 blob。

多谢你们!

5个回答

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

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

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

let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;
这个答案在创建数组缓冲区时停止。然后呢?
2021-03-16 15:48:02
嗨,我需要和你一样的,但我不明白你的解决方案。我有这个 var audioBlob = new Blob([dataview], { type: 'audio/mp3' }); 但是您在示例中使用了“arrayBuffer”变量
2021-03-27 15:48:02
使用与问题中使用的相同的变量名称对您来说不是更好,以便我们确切地知道如何转换代码?
2021-03-27 15:48:02
let arraybuffer在你的榜样等于new Blob
2021-04-07 15:48:02
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
2021-04-08 15:48:02

从 Node.js 16 开始,Blob可以导入:

import {Blob} from 'node:buffer';

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

否则,只需使用cross-blob

import Blob from 'cross-blob';
 
new Blob([]);
//=> Blob {size: 0, type: ''}
 
// Global patch (to support external modules like is-blob).
globalThis.Blob = Blob;
cross-blob 现在使用 ESM - 更新了答案
2021-03-16 15:48:02
错误:必须使用导入来加载 ES module
2021-03-27 15:48:02
Blob 是 cross-blob 的默认导出,它只是 import Blob from 'cross-blob'
2021-04-08 15:48:02
注意:此答案仅适用于您想遵循 Richie Bendall 的答案的情况。

简答:

避免Blob'node:buffer'.

相反,更喜欢像这样导入它(如NodeJS 文档中所述。(此处的实现示例)):

import { Blob } from 'buffer';

长答案:

Richie Bendall 的回答对我帮助很大。但似乎Blobnode:buffer中断了 Jest 单元测试的导入,抛出了这个错误:

 FAIL  dist/tests/unit/users/getOneById.spec.js
  ● Test suite failed to run

    ENOENT: no such file or directory, open 'node:buffer'

      2 | import config from '../config/config';
      3 | import { getFileExt, getFileName, removeFile } from './file';
    > 4 | import { Blob } from 'node:buffer';
        | ^
      5 |
      6 | class PdfHelpers {
      7 |

      at Runtime.readFile (node_modules/jest-runtime/build/index.js:2118:21)
      at Object.<anonymous> (src/helpers/pdf.ts:4:1)

我没有尝试node:buffer用一些奇怪/棘手的代码来模拟导入,而是查看了 NodeJS 文档示例。所以它表明Blob可以从'buffer'

import { Blob } from 'buffer';

// ...

// Only the import is changing, don't change your existing implementation
const blob = new Blob([buf], { type: 'application/pdf' });

所有 Jest 错误都已消失!

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

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

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

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

我使用base64-arraybuffer来执行 ArrayBuffer > Base64 String 转换(不过,在没有包的情况下执行此操作可能很简单)。

我使用这里的技巧在客户端创建音频元素。

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

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

我的意思是我想我不知道你想做什么。可能没有用于 blob 的module,但是如果您只想将某些内容写入磁盘,则可以使用 fs module。此代码不能直接工作,但是...

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,它就会将其写入磁盘。你可以做任何你想做的验证。

我已经将客户端 blob 二进制文件传输到 node.js(流式传输),当音频首先在客户端录制并用 node.js 处理时,它可以工作。这次我想让 node.js 控制整个过程。
2021-03-29 15:48:02
我用过 recorder.js。我什至延长了它。问题是创建 Blob 服务器端而不是客户端。我需要知道是否有办法在 node.js 中创建 blob,因为我将音频直接流式传输到 node.js 并希望在服务器上构建 wav/mp3 文件。:-)
2021-03-30 15:48:02
你能取出 blob 的内容,将它们放入缓冲区,然后将缓冲区射过吗?Node 知道如何处理缓冲区,并且您可以将二进制数据放入其中。
2021-03-30 15:48:02
您好,我将 GetUserMedia Audio 的音频缓冲区流式传输到我的 node.js 服务器,并希望将数组编码为 WAV。
2021-04-09 15:48:02