2010-10-17 36 views
51

J'ai testé des flux binaires dans Node.js et, à ma grande surprise, j'ai une démo de fonctionnement de la prise d'un flux Shoutcast en utilisant node-radio-stream et en le poussant dans un élément HTML5 en utilisant l'encodage en morceaux. Mais cela ne fonctionne que dans Safari!Diffusion audio d'un serveur Node.js vers HTML5 <audio> tag

Voici mon code serveur:

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

Mon code client est tout simplement:

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

Cela fonctionne bien dans Safari 5 sur Mac, mais ne semble rien faire dans Chrome ou Firefox. Des idées?

candidats possibles, y compris les questions d'encodage, ou tout simplement fonctionnalités HTML5 partiellement mises en œuvre ...

+0

Avez-vous déjà eu cette opération? – abeger

+0

Oui, consultez la réponse de Nate ci-dessous pour plus d'informations. –

+1

+1 Excellent travail. –

Répondre

19

Here's a (slightly outdated) summary of the current status of HTML5 Audio and Icecast streams. Comme vous pouvez le voir, une source MP3 ne semble fonctionner que dans Safari (et peut-être IE9). Vous devrez peut-être expérimenter avec un transcodage côté serveur (avec ffmpeg ou mencoder) vers OGG Vorbis. Je suis certain que j'ai réussi à faire en sorte que Chrome se comporte correctement lorsque j'envoyais des données Vorbis. Firefox était encore un gosse, peut-être qu'il n'aime pas le codage en morceaux (tous les serveurs SHOUTcast répondent avec une réponse de version HTTP/1.0, qui n'avait pas encore défini Transfer-Encoding: chunked). Essayez d'envoyer un en-tête de réponse Transfer-Encoding: identity avec le flux OGG pour désactiver chunked et Firefox peut fonctionner. Je n'ai pas testé ça.

Faites-moi savoir comment ça se passe! À votre santé!

+0

Merci! Je vérifie FFMpeg maintenant pour l'essayer. –

+0

J'ai été capable de déranger un peu la nuit dernière, et j'ai pu faire en sorte que Chrome joue les données OGG Vorbis transcodées! Il semblait que 'ffmpeg' ne pouvait pas créer un fichier OGG approprié à partir du flux MP3, mais Chrome était toujours capable de le lire. J'expérimente également en invoquant 'lame' et' oggenc' manuellement, et le résultat semble prometteur (un joli fichier OGG conforme). Je soupçonne que Firefox fonctionnera aussi avec ce genre de flux. Je vais essayer de faire un exemple mis à jour dans le repo 'node-radio-stream' bientôt! – TooTallNate

+0

Génial! Je viens de remarquer la mise à jour sur la liste des nœuds - c'est vraiment sympa! –