首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用node.js和socket.io通过WebSockets流式传输MP3数据?

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

Stack Overflow用户
提问于 2012-01-06 23:04:49
回答 2查看 23.9K关注 0票数 18

我在使用node.js和socket.io通过WebSocket流式传输MP3数据时遇到了问题。一切似乎都很顺利,但是decodeAudioData对我不公平。

这是我的玩具服务器:

代码语言:javascript
复制
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/');

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

代码语言:javascript
复制
Uncaught Error: SYNTAX_ERR: DOM Exception 12

我认为decodeAudioData需要将数据存储在ArrayBuffer中。有没有转换数据的方法?

这是客户端代码:

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-10 16:12:54

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

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

此外,音频的质量也不是完美的。我有一些细微的故障。我能够通过发送更大的MP3数据块来改善这一点,但仍然存在微小的漏洞。

编辑:我设法提高了音频质量。似乎Web Audio method decodeAudioData实际上并不是为解码连续的MP3数据而设计的。

票数 10
EN

Stack Overflow用户

发布于 2012-01-07 03:01:50

在您的情况下,context.decodeAudioData需要二进制数据的ArrayBuffer,我建议将您的块转换为base64字符串,然后转换为ArrayBuffer客户端,以获得最可预测的结果。对于从分块数据的base64进行客户端解码来说,This script应该是一个很好的起点。

在获取数据(base-64编码的字符串)之后立即使用data = Base64Binary.decodeArrayBuffer(data);添加一行代码就可以完成此任务……

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8759842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档