如何使用node.js和socket.io通过WebSockets传输MP3数据?

Jan*_*ard 18 javascript html5 websocket node.js socket.io

我在使用node.js和socket.io通过WebSocket传输MP3数据时遇到问题.一切似乎都有效,但decodeAudioData对我不公平.

这是我的玩具服务器:

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/');
Run Code Online (Sandbox Code Playgroud)

客户端接收数据作为类型字符串,但我想将数据提供给decodeAudioData,它似乎不喜欢字符串.对decodeAudioData的调用导致以下错误消息:

Uncaught Error: SYNTAX_ERR: DOM Exception 12
Run Code Online (Sandbox Code Playgroud)

我认为decodeAudioData需要存储在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>
Run Code Online (Sandbox Code Playgroud)

Jan*_*ard 11

我找到了一种通过Websockets自己传输MP3数据的方法.

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

此外,音频的质量并不完美.我有一些微妙的故障.我能够通过发送更大块的MP3数据来改善这一点,但仍然存在微小的噼啪声.

编辑:我设法提高音频质量.似乎Web Audio方法decodeAudioData并不是真正设计用于解码连续的MP3数据块.

  • 你可以发布你的解决方案吗?我也在尝试将MP3数据流式传输到websocket. (10认同)
  • @digitxp github 项目没有任何与流媒体相关的内容 (3认同)
  • 对于仍在寻找的人,解决方案在他的 Github 页面上:https://github.com/polaris/audio-demo (2认同)