2010-10-17 17 views
51

Eksperymentowałem ze strumieniami binarnymi w Node.js, i ku mojemu zdumieniu rzeczywiście mam działającą wersję demonstracyjną, w której biorę strumień Shoutcast za pomocą strumienia radiowego node-stream i wepchnięcie go do elementu HTML5 przy użyciu kodowania kodowanego. Ale działa tylko w Safari!Strumieniowe przesyłanie dźwięku z serwera Node.js do HTML5 <audio> tag

Oto mój kod serwera:

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

Mój kod klienta jest po prostu:

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

To działa prawidłowo w Safari 5 na Mac, ale nie wydaje się, aby zrobić coś w Chrome lub Firefox. Jakieś pomysły?

potencjalnych kandydatów w tym kwestie kodowania, lub tylko częściowo realizowanych funkcji HTML5 ...

+0

Czy zdarzyło Ci się to kiedyś uruchomić? – abeger

+0

Tak, sprawdź odpowiedź Nate'a poniżej, aby uzyskać więcej informacji. –

+1

+1 Doskonała robota. –

Odpowiedz

19

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

Jak widać, źródło MP3 działa tylko w Safari (i prawdopodobnie IE9). Być może trzeba będzie poeksperymentować z transkodowaniem po stronie serwera (z ffmpeg lub mencoder) na OGG Vorbis. Jestem pewien, że udało mi się sprawić, by Chrome zachowywał się właściwie, gdy wysyłałem dane Vorbis.

Firefox wciąż był bachorem, może nie lubi kodowanego kodowania (wszystkie serwery SHOUTcast odpowiadają wersją HTTP/1.0, która jeszcze nie zdefiniowała Transfer-Encoding: chunked). Spróbuj wysłać nagłówek odpowiedzi Transfer-Encoding: identity ze strumieniem OGG, aby wyłączyć chunked i pracę przeglądarki Firefox MIGHT. Nie testowałem tego.

Daj mi znać, jak to działa! Twoje zdrowie!

+0

Dzięki! Sprawdzam teraz FFMpeg, żeby spróbować. –

+0

Byłem w stanie poradzić sobie z tym trochę zeszłej nocy, i faktycznie mogłem skłonić Chrome do odtworzenia transkodowanych danych OGG Vorbis! Wyglądało na to, że 'ffmpeg' nie mógł utworzyć właściwego pliku OGG ze strumienia MP3, ale Chrome wciąż mógł go odtworzyć. Eksperymentuję też z wywoływaniem 'lame' i' oggenc' ręcznie, a wynik wydaje się obiecujący (całkiem zgodny plik OGG). Podejrzewam, że Firefox również będzie działał z tym rodzajem strumienia. Spróbuję zrobić zaktualizowany przykład w repozytorium 'node-radio-stream' wkrótce! – TooTallNate

+0

Awesome! Właśnie zauważyłem aktualizację na liście węzłów - to jest naprawdę miłe! –