我正在使用 node.js 并将我的音频流式传输到我的 node.js 服务器。现在我在构建音频 blob 的过程中注意到:
var audioBlob = new Blob([dataview], { type: 'audio/wav' });
我在新的 Blob 上得到了一个 ReferenceError。似乎不支持 Blob。如何创建一个我想用 node.js fs module保存的 blob。
多谢你们!
我正在使用 node.js 并将我的音频流式传输到我的 node.js 服务器。现在我在构建音频 blob 的过程中注意到:
var audioBlob = new Blob([dataview], { type: 'audio/wav' });
我在新的 Blob 上得到了一个 ReferenceError。似乎不支持 Blob。如何创建一个我想用 node.js fs module保存的 blob。
多谢你们!
这个问题的解决方案是创建一个可以在数组缓冲区和节点缓冲区之间转换的函数。:)
将二进制 NodeJS 缓冲区转换为 JavaScript ArrayBuffer
在最近的节点版本中,它只是:
let buffer = Buffer.from(arraybuffer);
let arraybuffer = Uint8Array.from(buffer).buffer;
从 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;
注意:此答案仅适用于您想遵循 Richie Bendall 的答案的情况。
避免Blob
从'node:buffer'
.
相反,更喜欢像这样导入它(如NodeJS 文档中所述。(此处的实现示例)):
import { Blob } from 'buffer';
Richie Bendall 的回答对我帮助很大。但似乎Blob
从node: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 并发送一个缓冲区。
最终对我来说一个简单的解决方案是
我使用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,它就会将其写入磁盘。你可以做任何你想做的验证。