当前位置: 首页 > 面试题库 >

如何通过带有node.js和socket.io的WebSockets流MP3数据?

郎志
2023-03-14
问题内容

我在通过带有node.js和socket.io的WebSocket流MP3数据时遇到问题。一切似乎都可以正常工作,但是解码音频数据对我来说并不公平。

这是我的玩具服务器:

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(8081);

function handler (req, res) {
    res.writeHead(200, {
        'Content-Type': 'text/html',
    });
    res.end('Hello, world!');
}

io.configure('development', function() {
  io.set('log level', 1);

  io.set('transports', [ 'websocket' ]);
});

io.sockets.on('connection', function (socket) {
    console.log('connection established');

    var readStream = fs.createReadStream("test.mp3", 
                                         {'flags': 'r',
                                          'encoding': 'binary', 
                                          'mode': 0666, 
                                          'bufferSize': 64 * 1024});
    readStream.on('data', function(data) {
        console.log(typeof data);
        console.log('sending chunk of data')
        socket.send(data);
    });

    socket.on('disconnect', function () {
        console.log('connection droped');
    });
});

console.log('Server running at http://127.0.0.1:8081/');

客户端以字符串类型接收数据,但我想将数据提供给解码音频数据,看来它不喜欢字符串。调用encodeAudioData会导致以下错误消息:

Uncaught Error: SYNTAX_ERR: DOM Exception 12

我认为解码音频数据需要存储在ArrayBuffer中的数据。有没有办法转换数据?

这是客户端代码:

<script src="http://127.0.0.1:8081/socket.io/socket.io.js"></script>
<script>
    var audioBuffer = null;
    var context = null;
    window.addEventListener('load', init, false);
    function init() {
        try {
            context = new webkitAudioContext();
        } catch(e) {
            alert('Web Audio API is not supported in this browser');
        }
    }

    function decodeHandler(buffer) {
        console.log(data);
    }

    var socket = io.connect('http://127.0.0.1:8081');
    socket.on('message', function (data) {
            // HERE IS THE PROBLEM
        context.decodeAudioData(data, decodeHandler, function(e) { console.log(e); });
    });
</script>

问题答案:

我自己找到了一种通过Websockets流MP3数据的方法。

一个问题是MP3数据的块大小。似乎需要为Web Audio
API提供有效的MP3块,以便能够解码数据。可能不足为奇。在演示应用程序中,我提供了一组MP3块文件

音频质量也不是完美的。我有一些细微的故障。我可以通过发送更大的MP3数据来改善这一点,但是仍然有微小的裂纹。

编辑:我设法提高音频质量。看来,Web Audio方法的解码音频数据并不是真正设计用来解码MP3数据的连续块。



 类似资料:
  • 问题内容: 谁能使用WebSockets(Socket.io)为Node.js提供坚如磐石,简单的单元测试? 我使用用于Node.js的socket.io,并查看了socket.io-client以在测试中建立与服务器的客户端连接。但是,我似乎缺少了一些东西。 在下面的示例中,“ worked …”从未被打印出来。 相反,我只是得到: 有什么建议? 问题答案: 经过进一步的摸索和探索,我发现了一些

  • 问题内容: 当与socket.io握手时,是否可以轻松地传递身份验证cookie?我目前必须分别进行操作,如下所示: 问题答案: WebSockets确实支持cookie,因为它们是基于HTTP的,但是快速浏览Socket.IO的源代码显示不支持此内置。 因此,在这种情况下,直接使用cookie并不是可行的解决方案,而且,由于您使用的是Socket.IO,因此不能保证用户实际上会通过WebSock

  • 我正在构建一个复杂的聊天应用程序,使用WebSockets。我使用Node.js的socket.io库来实现协议。我应该为每个聊天创建单独的命名空间,还是为每个聊天创建单独的房间? socket.io中名称空间和房间的主要区别是什么?

  • 我用Node.js设置了Socket.io,它通过侦听/连接到端口8000(或另一个不是服务器运行端口的端口)在本地开发机器上工作。 当我试图在heroku上做同样的事情时,客户端脚本导入失败了。 我尝试过相对路径 编辑:我实际上是在使用geddy mvc框架,我想让它在heroku上如何设置(基本上就像socket.io一样),我发现这个答案让我看起来可以类似地使用它:GeddyJS&socke

  • 问题内容: 我是React-Redux的新技术,希望在某些实现方面对您有所帮助。 我想用套接字(socket.io)实现一个聊天应用程序。首先,用户必须注册(我在服务器端使用通行证),然后,如果注册成功,则用户必须连接到webSocket。 我认为最好的办法是对所有操作使用管道之类的中间件,并根据获取中间件的操作类型来执行不同的操作。 如果操作类型为,则创建客户端-服务器连接并设置所有将来自服务器

  • 问题内容: node.js中的socket.io和websockets有什么区别? 它们都是服务器推送技术吗?我唯一感觉到的是 socket.io允许我通过指定事件名称来发送/发送消息。 对于socket.io,来自服务器的消息将到达所有客户端,但是对于websockets中的消息,我被迫保留所有连接的数组并循环遍历,以将消息发送给所有客户端。 另外,我想知道为什么Web检查器(例如Chrome