我正在使用 node.js,并将我的音频流式传输到我的 node.js 服务器。现在我在构建音频 blob 的过程中注意到:
var audioBlob = new Blob([dataview], { type: 'audio/wav' });
我在新的 Blob 处得到一个 ReferenceError。似乎不支持 Blob。如何创建一个我想用 node.js fs 模块保存的 blob。
多谢你们!
我正在使用 node.js,并将我的音频流式传输到我的 node.js 服务器。现在我在构建音频 blob 的过程中注意到:
var audioBlob = new Blob([dataview], { type: 'audio/wav' });
我在新的 Blob 处得到一个 ReferenceError。似乎不支持 Blob。如何创建一个我想用 node.js fs 模块保存的 blob。
多谢你们!
解决这个问题的方法是创建一个可以在 Array Buffers 和 Node Buffers 之间转换的函数。:)
将二进制 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 并发送 Buffer。
最终对我来说是一个简单的解决方案是
我使用base64-arraybuffer来执行 ArrayBuffer > Base64 String 转换(不过,在没有包的情况下执行此操作可能很简单)。
我使用此处的提示在客户端创建音频元素。
*我在测试限制方面没有做太多 - 所以我不知道这如何处理大型音频文件。
作为建议,您可能想阅读以下内容: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,它就会将其写入磁盘。你可以做任何你想做的验证。