Потоковое аудио с сервера Node.js в тег HTML5 <audio> - PullRequest
51 голосов
/ 18 октября 2010

Я экспериментировал с двоичными потоками в Node.js, и, к моему большому изумлению, у меня действительно есть рабочая демонстрация, состоящая в том, чтобы взять поток Shoutcast с помощью радиопотока node-radio и вставить его в элемент HTML5 с помощью кусочного кодирования. Но это работает только в Safari!

Вот мой код сервера:

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

Мой код клиента просто:

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

Это прекрасно работает в Safari 5 на Mac, но, похоже, ничего не делает в Chrome или Firefox. Есть идеи?

Возможные кандидаты, включая проблемы с кодировкой, или только частично реализованные функции HTML5 ...

1 Ответ

19 голосов
/ 20 октября 2010

Вот (немного устаревшая) сводка текущего статуса потоков HTML5 Audio и Icecast .

Как видите, источник MP3 работает только в Safari (и, возможно, IE9). Возможно, вам придется поэкспериментировать с некоторым транскодированием на стороне сервера (с ffmpeg или mencoder ) в OGG Vorbis. Я почти уверен, что смог заставить Chrome вести себя правильно, когда я отправлял данные Vorbis.

Firefox все еще оставался недовольным, хотя, может быть, ему не нравилась чанкованная кодировка (все серверы SHOUTcast отвечают ответом версии HTTP/1.0, который еще не определил Transfer-Encoding: chunked). Попытайтесь отправить заголовок ответа Transfer-Encoding: identity с потоком OGG, чтобы отключить chunked, и Firefox МОЖЕТ работать. Я не проверял это.

Дайте мне знать, как это происходит! Ура!

...