【问题标题】:Streaming Binary with Node.js and WebSockets使用 Node.js 和 WebSockets 流式传输二进制文件
【发布时间】:2013-03-26 13:21:06
【问题描述】:

我一直在谷歌上搜索这个并在 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");
        });
};

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

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

谢谢

【问题讨论】:

  • 在我学习 node.js 和 web sockets 时,您能否提供完整的示例或代码,我的要求也相同

标签: node.js websocket


【解决方案1】:

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

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

你现在有两个选择:

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

【讨论】:

  • 感谢您的反馈。我会试一试。我之前在看 fs.read 但不想一口气读完文件。
  • 其实,只是在想那个解决方案。这是否意味着它没有真正流式传输文件?在开始播放之前,我将等待接收整个文件...
  • 只是一个更新。我认为这个问题可能与...... stackoverflow.com/questions/10470742/… 我尝试使用 readFile 而不是 createReadSTream 并且它工作得很好 - 因为文件被传递并开始播放。但是它没有流式传输...
  • 我仍在尝试找出如何创建有效块!
  • 好的,我到了某个地方。如果我只是使用... fs.createReadStream("test.mp3") (删除选项),第一个块被成功接收并播放。但是,所有后续块都会导致在客户端上执行错误回调...
【解决方案2】:

问题解决了。

我通过从传递给“createReadStream()”的选项中删除“'encoding': 'binary'”参数和解决方案...

decodeAudioData returning a null error

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

Define 'valid mp3 chunk' for decodeAudioData (WebAudio API)

【讨论】:

  • 在我学习 node.js 和 Web 套接字时,您能否提供完整的示例或代码,并且我的要求是 html 中的自动流式传输
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2012-02-04
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多