gpt4 book ai didi

node.js - 使用 Node.js 和 WebSockets 流式传输二进制文件

转载 作者:IT老高 更新时间:2023-10-28 23:27:14 32 4
gpt4 key购买 nike

我一直在谷歌上搜索这个并在 stackoverflow 上搜索了一段时间,但没有找到解决方案 - 因此发布了这篇文章。

出于好奇,我正在玩弄 Node.js 和 WebSockets。我正在尝试将一些二进制数据(mp3)流式传输到客户端。到目前为止,我的代码如下,但显然没有按预期工作。

我怀疑我的问题是我实际上并没有从服务器发送二进制数据,需要一些澄清/帮助。

这是我的服务器...

var fs = require('fs');
var WebSocketServer = require('ws').Server;

var wss = new WebSocketServer({port: 8080,host:"127.0.0.1"});
wss.on('connection', function(ws) {
var readStream =
fs.createReadStream("test.mp3",
{'flags': 'r',
'encoding': 'binary',
'mode': 0666,
'bufferSize': 64 * 1024});

readStream.on('data', function(data) {
ws.send(data, {binary: true, mask: false});
});
});

还有我的客户……

context = new webkitAudioContext();
var ws = new WebSocket("ws://localhost:8080");
ws.binaryType = 'arraybuffer';

ws.onmessage = function (evt) {
context.decodeAudioData(
evt.data,
function(buffer) {
console.log("Success");
},
function(error) {
console.log("Error");
});
};

对解码的调用总是在错误回调中结束。我假设这是因为它收到了错误的数据。

所以我的问题是如何正确地将文件作为二进制流式传输?

谢谢

最佳答案

您的服务器正在做的是向您的客户端发送包含 64 KB block 的二进制音频数据的消息。您的客户端应在调用 decodeAudioData 之前重建音频文件。

每次您的客户端在 websocket 上收到消息时,您都在调用 decodeAudioData。您必须创建一个单独的缓冲区才能将所有 block 添加到其中。然后在传输完成时,应该将缓冲区输入到 decodeAudioData

你现在有两个选择:

  1. 您在不使用流事件的情况下加载整个文件 (fs.read) 并使用 ws.send 发送整个文件(很容易做到)
  2. 您使用流事件,修改您的客户端以接受数据 block 并在调用 decodeAudioData
  3. 之前组装它们

关于node.js - 使用 Node.js 和 WebSockets 流式传输二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15638096/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com