与Node.js和WebSocketsstream二进制

我一直在谷歌search这个,看看周围的计算器一段时间,但还没有find一个解决scheme – 因此后。

出于好奇,我正在玩Node.js和WebSockets。 我正在试图将一些二进制数据(一个mp3)stream到客户端。 我的代码到目前为止,但显然不按预期工作。

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

下面是我的服务器…

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"); }); }; 

解码调用总是以错误callback结束。 我假设这是因为它正在接收不良的数据。

所以我的问题是如何正确stream文件作为二进制?

谢谢

你的服务器在做什么,它是发送消息包括二进制audio数据在64 KB块到您的客户端。 在调用decodeAudioData之前,客户端应该重buildaudio文件。

每当您的客户端在websocket上收到消息时,您都会调用decodeAudioData 。 你必须创build一个单独的缓冲区来添加所有的块。 然后在传输完成时,缓冲区应该被赋予decodeAudioDatainput。

你现在有两个select:

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

问题解决了。

我解决了这个问题,从传递给“createReadStream()”的选项中去掉“encoding”:“binary”参数,

decodeAudioData返回一个空错误

根据我的一些评论,当我更新了createReadStream选项时,第一个块正在播放,但所有其他块正在执行decodeAudioData()的onErrorcallback。 上面的链接解决scheme为我解决这个问题。 看起来decodeAudioData()对于接收的数据块应该如何格式化有点挑剔。 他们应该是有效的块显然…

为decodeAudioData(WebAudio API)定义'有效的mp3块'