将audio从Node.js服务器stream式传输到HTML5 <audio>标签
我一直在使用Node.js中的二进制stream进行试验,我非常惊讶,实际上有一个工作演示,使用节点无线电stream接收Shoutcaststream,并使用分块编码将其推送到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>
这在Mac 5的Safari 5中运行良好,但在Chrome或Firefox中似乎没有任何作用。 有任何想法吗?
可能的候选人包括编码问题,或只是部分实施的HTML5function…
以下是对HTML5 Audio和Icecaststream的现状(稍微过时) 。
正如你所看到的,一个MP3源只能在Safari(也可能是IE9)中工作。 您可能需要尝试一些服务器端代码转换(使用ffmpeg或mencoder )到OGG Vorbis。 我非常肯定,当我发送Vorbis数据时,我能够使Chrome正常运行。
火狐仍然是一个小丑,也许它不喜欢分块编码(所有的SHOUTcast服务器响应一个HTTP/1.0
版本的响应,尚未定义Transfer-Encoding: chunked
)。 尝试使用OGGstream发送Transfer-Encoding: identity
响应标头以禁用chunked
,并且Firefox MIGHT可以工作。 我没有testing过这个。
让我知道事情的后续! 干杯!