2010-10-17 13 views
51

He estado experimentando con transmisiones binarias en Node.js, y para mi asombro realmente tengo una demostración en funcionamiento de tomar una transmisión Shoutcast usando node-radio-stream y empujándolo a un elemento HTML5 usando codificación fragmentada. ¡Pero solo funciona en Safari!Transmitiendo audio desde un servidor Node.js a HTML5 <audio> tag

Aquí está mi código de servidor:

var radio = require("radio-stream"); 
var http = require('http'); 
var url = "http://67.205.85.183:7714"; 
var stream = radio.createReadStream(url); 

var clients = []; 

stream.on("connect", function() { 
    console.error("Radio Stream connected!"); 
    console.error(stream.headers); 
}); 


// When a chunk of data is received on the stream, push it to all connected clients 
stream.on("data", function (chunk) { 
    if (clients.length > 0){ 
     for (client in clients){ 
      clients[client].write(chunk); 
     }; 
    } 
}); 

// When a 'metadata' event happens, usually a new song is starting. 
stream.on("metadata", function(title) { 
    console.error(title); 
}); 

// Listen on a web port and respond with a chunked response header. 
var server = http.createServer(function(req, res){ 
    res.writeHead(200,{ 
     "Content-Type": "audio/mpeg", 
     'Transfer-Encoding': 'chunked' 
    }); 
    // Add the response to the clients array to receive streaming 
    clients.push(res); 
    console.log('Client connected; streaming'); 
}); 
server.listen("8000", "127.0.0.1"); 

console.log('Server running at http://127.0.0.1:8000'); 

Mi código de cliente es simplemente:

<audio controls src="http://localhost:8000/"></audio> 

Esto funciona bien en Safari 5 en el Mac, pero no parece hacer nada en Chrome o Firefox. ¿Algunas ideas?

candidatos posibles, incluyendo problemas de codificación, o características de HTML5 simplemente implementadas parcialmente ...

+0

¿Alguna vez se puso en marcha? – abeger

+0

Sí, consulte la respuesta de Nate a continuación para obtener más información. –

+1

+1 Excelente trabajo. –

Respuesta

19

Here's a (slightly outdated) summary of the current status of HTML5 Audio and Icecast streams.

Como puede ver, una fuente de MP3 solo parece funcionar en Safari (y posiblemente en IE9). Es posible que deba experimentar con alguna transcodificación del lado del servidor (con ffmpeg o mencoder) a OGG Vorbis. Estoy bastante seguro de que pude hacer que Chrome se comportara correctamente cuando estaba enviando datos de Vorbis.

Firefox todavía era un mocoso, tal vez no le gusta la codificación fragmentada (todos los servidores SHOUTcast responden con una respuesta de versión HTTP/1.0, que aún no había definido Transfer-Encoding: chunked). Intente enviar un encabezado de respuesta Transfer-Encoding: identity con la secuencia OGG para deshabilitar chunked y Firefox MIGHT funcionará. No he probado esto.

¡Avísame cómo te va! ¡Aclamaciones!

+0

¡Gracias! Estoy revisando FFMpeg ahora para intentarlo. –

+0

¡Pude perder el tiempo con esto un poco anoche, y de hecho pude obtener Chrome para reproducir los datos OGG Vorbis transcodificados! Parecía que 'ffmpeg' no podía crear un archivo OGG apropiado a partir de la transmisión de MP3, pero Chrome todavía podía reproducirlo. También estoy experimentando con invocar 'lame' y' oggenc' manualmente, y el resultado parece prometedor (un buen archivo OGG compatible). Sospecho que Firefox también funcionará con este tipo de transmisión. ¡Trataré de hacer un ejemplo actualizado en el repositorio 'node-radio-stream' pronto! – TooTallNate

+0

¡Impresionante! Me di cuenta de la actualización en la lista de nodos, ¡esto es realmente bueno! –

Cuestiones relacionadas