【发布时间】:2012-02-04 07:13:22
【问题描述】:
我在使用 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/');
客户端以字符串类型接收数据,但我想将数据提供给 decodeAudioData,它似乎不喜欢字符串。对 decodeAudioData 的调用导致以下错误消息:
Uncaught Error: SYNTAX_ERR: DOM Exception 12
我认为 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>
【问题讨论】:
-
你找到解决这个问题的方法了吗?
-
我还没有找到使用 socket.io 的解决方案。请参阅我自己的答案以获得没有 socket.io 的解决方案。
-
Socket.io 1.0 支持二进制,我试过了,但是不行。我也尝试使用 websocket,但错误完全相同。你有一个如何解决这个问题的例子吗?。
-
@cmarrero01 我当时的解决方案是使用ws而不是Socket.io。但我知道它适用于当前的 Socket.io 版本。在服务器端,我必须明确告诉 ws 发送二进制数据,如
ws.send(array, { binary: true, mask: true });不确定我是否将掩码设置为 true 或 false。 HTH -
尝试从
createReadStream中删除'encoding': 'binary',
标签: javascript html node.js websocket socket.io