流二进制与Node.js和WebSockets



我已经在谷歌上搜索了一段时间,但还没有找到解决方案-因此发布

出于好奇,我正在玩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");
        });
};

对decode的调用总是以错误回调结束。我认为这是因为它接收了坏数据。

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

谢谢

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

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

你现在有两个选择:

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

问题解决

我修复了这个问题,从传递给"createReadStream()"的选项中删除了"'encoding': 'binary'"参数,并在…

decodeAudioData返回null错误

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

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

相关内容

  • 没有找到相关文章

最新更新