2010-10-17 14 views
51

Ich habe mit binären Streams in Node.js experimentiert, und zu meinem Erstaunen habe ich tatsächlich eine funktionierende Demo, einen Shoutcast-Stream mit Node-Radio-Stream aufzunehmen und schieben Sie es in ein HTML5-Element mit Chunked-Codierung. Aber es funktioniert nur in Safari!Streaming von Audio von einem Node.js-Server nach HTML5

Hier ist mein Server-Code:

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

Code Mein Kunde ist einfach:

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

Dies funktioniert in Safari 5 auf dem Mac in Ordnung, aber scheint nicht, etwas in Chrome zu tun oder Firefox. Irgendwelche Ideen?

Mögliche Kandidaten einschließlich Codierung Fragen, oder nur teilweise umgesetzt HTML5-Funktionen ...

+0

Haben Sie das schon einmal gemacht? – abeger

+0

Ja, sehen Sie sich Nates Antwort unten für weitere Informationen an. –

+1

+1 Ausgezeichnete Arbeit. –

Antwort

19

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

Wie Sie sehen können, scheint eine MP3-Quelle nur in Safari (und möglicherweise IE9) zu funktionieren. Möglicherweise müssen Sie mit einer serverseitigen Transcodierung (mit ffmpeg oder mencoder) zu OGG Vorbis experimentieren. Ich bin mir ziemlich sicher, dass ich Chrome dazu gebracht habe, sich korrekt zu verhalten, als ich Vorbis-Daten sendete.

Firefox war immer noch ein Brat, vielleicht mag es die Chunked-Codierung nicht (alle SHOUTcast-Server antworten mit einer HTTP/1.0 Versionsantwort, die Transfer-Encoding: chunked noch nicht definiert hatte). Versuchen Sie, einen Antwortkopf mit dem OGG-Stream zu senden, um chunked zu deaktivieren, und Firefox MIGHT funktioniert. Ich habe das nicht getestet.

Lassen Sie mich wissen, wie es geht! Prost!

+0

Danke! Ich überprüfe FFMpeg jetzt, um es zu versuchen. –

+0

Ich konnte letzte Nacht etwas damit herumspielen und konnte Chrome sogar dazu bringen, die transcodierten OGG-Vorbis-Daten abzuspielen! Es schien, dass 'ffmpeg' keine richtige OGG-Datei aus dem MP3-Stream erstellen konnte, aber Chrome konnte sie trotzdem abspielen. Ich experimentiere auch mit "lame" und "oggenc" manuell aufrufen, und das Ergebnis scheint vielversprechend (eine nette konforme OGG-Datei). Ich vermute, dass Firefox auch mit dieser Art von Stream arbeiten wird. Ich werde versuchen, in Kürze ein aktuelles Beispiel im 'node-radio-stream' Repo zu machen! – TooTallNate

+0

Super! Ich habe gerade das Update auf der Knotenliste bemerkt - das ist wirklich nett! –