Pau*_*nel 1 audio stream node.js internet-radio soundcloud
我正在使用节点服务器的Soundcloud api.我想同时向多个用户流式传输音轨.
我试过这样的事情(使用此问题上的代码将Node.js服务器上的音频流式传输到HTML5 <audio>标签),但它不起作用.有关如何做到这一点的任何想法?
var radio = require("radio-stream");
var http = require('http');
var url = "http://api.soundcloud.com/tracks/79031167/stream?client_id=db10c5086fe237d1718f7a5184f33b51";
var stream = radio.createReadStream(url);
var clients = [];
stream.on("connect", function() {
console.error("Radio Stream connected!");
console.error(stream.headers);
});
stream.on("data", function (chunk) {
if (clients.length > 0){
for (client in clients){
clients[client].write(chunk);
};
}
});
stream.on("metadata", function(title) {
console.error(title);
});
var server = http.createServer(function(req, res){
res.writeHead(200,{
"Content-Type": "audio/mpeg",
'Transfer-Encoding': 'chunked'
});
clients.push(res);
console.log('Client connected; streaming');
});
server.listen("8000", "0.0.0.0");
console.log('Server running at http://127.0.0.1:8000');
Run Code Online (Sandbox Code Playgroud)
radio-stream您使用的模块在4年内未更新.这是Node.js API时代的永恒.我建议不要使用它,因为Node.js的当前和未来版本无疑存在兼容性问题.至少,使用新的流API有更好的方法来处理这个问题.
在任何情况下,该模块都不遵循HTTP重定向.SoundCloud API正在将您重定向到实际的媒体文件.
此外,该radio-stream模块用于解复用SHOUTcast/Icecast风格的元数据,而不是MP3 ID3数据.它对你没有帮助.
你需要的只是一个简单的http.get().然后,您可以自己遵循重定向,也可以使用该request包.更多信息: 如何在Node.js中遵循HTTP重定向?
许多流客户端无法处理分块编码.当您有流输出时,Node.js(正确)添加它.但是,出于我们的目的,让我们禁用它.
res.useChunkedEncodingByDefault = false;
Run Code Online (Sandbox Code Playgroud)
从理论上讲,你可以在MPEG流之后附加MPEG流,一切都可以正常工作.实际上,这不起作用.ID3标签会破坏流.一个文件的采样率可能与另一个文件的采样率不同,大多数软件无法动态地将硬件切换到新的采样率.基本上,你不能可靠地做你想做的事情.
您唯一能做的就是通过播放这些音频文件来重新编码整个流,并从另一端获得可靠的流.这为您提供额外的奖励,您可以处理其他编解码器和格式,而不仅仅是MP3.
要处理许多编解码器问题,您可以使用FFmpeg.但是,您需要一种方法将这些文件播放到FFmpeg进行编码.
您必须以播放速率传输音频.(您可以发送初始缓冲区以快速启动客户端,但是您无法尽快将数据抨击它们.)如果不这样做,您将很快耗尽服务器上的内存,如客户会降低他们的TCP窗口大小降为零,呆在那里,直到声音已经赶上足以让缓冲更多的数据.由于您没有使用pipe,您的流处于流动模式,并将无限期地缓冲在服务器上.现在,这在某些方面实际上是一件好事,因为这可以防止一个慢速客户端减慢其他客户端的速度.这是一个坏事,但是你的代码,你尽可能快地流式传输,而不是以播放速度.
如果您将音频播放到另一个编码器,请使用几秒钟的RTC作为时钟.它不一定是完美的,这就是客户端缓冲区的用途.如果您正在播放音频设备,它当然有自己的时钟,将被使用.
你偶然发现了一个巨大的项目.我强烈建议使用Liquidsoap.有一些方法可以从Node.js控制它.从那里,使用像Icecast这样的服务器进行流式传输.
| 归档时间: |
|
| 查看次数: |
1541 次 |
| 最近记录: |