我在通过带有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数据的连续块。