javascript html5 node.js websocket socket.io

javascript - ¿Cómo transmitir datos MP3 a través de WebSockets con node.js y socket.io?



html5 (3)

En su caso, context.decodeAudioData espera un ArrayBuffer de los datos binarios, sugeriría convertir su fragmento a una cadena base64, luego a un lado del cliente ArrayBuffer para los resultados más predecibles. Este script debe ser un buen punto de partida para la decodificación del lado del cliente desde la base64 de los datos fragmentados.

Agregar una línea con data = Base64Binary.decodeArrayBuffer(data); Justo después de obtener sus datos (cadena codificada en base 64) haría el truco ...

Tengo problemas para transmitir datos MP3 a través de WebSocket con node.js y socket.io. Todo parece funcionar, pero decodeAudioData no es justo conmigo.

Este es mi servidor de juguetes:

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/'');

El cliente recibe los datos como una cadena de tipo, pero quiero enviar los datos a decodeAudioData y parece que no le gustan las cadenas. La llamada a decodeAudioData da como resultado el siguiente mensaje de error:

Uncaught Error: SYNTAX_ERR: DOM Exception 12

Creo que decodeAudioData necesita los datos almacenados en un ArrayBuffer. ¿Hay una manera de convertir los datos?

Este es el código del cliente:

<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>


He encontrado una manera de transmitir datos MP3 a través de Websockets yo mismo.

Un problema fue el tamaño de los datos MP3. Parece que la API de audio web debe ser alimentada con fragmentos de MP3 válidos para poder decodificar los datos. Probablemente no sea sorprendente. En mi aplicación de demostración proporciono un conjunto de archivos de fragmentos de MP3.

Además, la calidad del audio no es perfecta. Tengo algunos fallos sutiles. Pude mejorar eso enviando trozos más grandes de datos MP3, pero todavía hay pequeños crepitantes.

EDIT: me las arreglé para mejorar la calidad de audio. Parece que el método de audio Web decodeAudioData no está realmente diseñado para decodificar fragmentos continuos de datos MP3.