使用Node.js和WebSockets的流式二进制文件

使用Node.js和WebSockets的流式二进制文件,node.js,websocket,Node.js,Websocket,我已经在谷歌上搜索了一下这个,在stackoverflow周围搜索了一段时间,但还没有找到解决方案——因此我发布了这篇文章 出于好奇,我正在玩Node.js和WebSockets。我正在尝试将一些二进制数据(mp3)传输到客户端。到目前为止,我的代码如下,但显然没有按预期工作 我怀疑我的问题是我实际上没有从服务器发送二进制数据,希望得到一些澄清/帮助 这是我的服务器 var fs = require('fs'); var WebSocketServer = require('ws').Serve

我已经在谷歌上搜索了一下这个,在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的二进制音频数据组成的消息。在调用
decodeAudioData
之前,您的客户端应重新生成音频文件

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

您现在有两个选择:

  • 您可以在不使用流事件的情况下加载整个文件(fs.read),并使用ws.send发送整个文件(易于操作)
  • 您可以使用流事件,修改客户端以接受数据块,并在调用
    decodeAudioData
  • 问题解决了

    我通过从传递给“createReadStream()”的选项中删除“'encoding':'binary'”参数,以及在

    根据我的一些评论,当我更新createReadStream选项时,第一个区块正在播放,但所有其他区块都在执行来自decodeAudioData()的onError回调。上面链接中的解决方案为我解决了这个问题。 decodeAudioData()似乎对它接收的块的格式有点挑剔。它们应该是有效的块显然


    感谢您的反馈。我要试一试。我以前看过fs.read,但不想一次就把文件读出来。实际上,我只是在考虑这个解决方案。这不意味着它不是真正的流文件吗?我将在开始播放之前等待接收整个文件…只是更新。我认为这个问题可能与。。。我尝试过使用readFile而不是createReadSTream,它工作得非常好——就像文件被传递并开始播放一样。然而,它并没有流化…我仍然在试图弄清楚如何创建有效的块!好吧,我有进展了。如果我只是用。。。fs.createReadStream(“test.mp3”)(删除选项),成功接收并播放第一个区块。但是,所有后续的块都会导致在客户端上执行错误回调…您能为我提供完整的示例或代码吗?因为我正在学习node.js和web套接字,我的要求也是如此。您能为我提供完整的示例或代码吗?因为我正在学习node.js和web套接字,我的要求是audohtml流媒体