gpt4 book ai didi

node.js - 使用 Node 从 soundcloud 源同时传输音频

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:54 24 4
gpt4 key购买 nike

我正在使用来自 Node 服务器的 Soundcloud api。我想同时向多个用户传输音轨。

我尝试了类似的方法(使用此问题上的代码 Streaming audio from a Node.js server to HTML5 <audio> tag ),但它不起作用。知道我该如何做到这一点吗?

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

最佳答案

有几个问题

跟随重定向

您使用的radio-stream模块已经4年没有更新了。对于 Node.js API 来说,那是永恒的时间。我建议不要使用它,因为毫无疑问,当前和 future 版本的 Node.js 存在兼容性问题。至少,现在使用新的流 API 有更好的方法来处理这个问题。

无论如何,该模块都不遵循 HTTP 重定向。 SoundCloud API 正在将您重定向到实际的媒体文件。

此外,radio-stream 模块旨在解复用 SHOUTcast/Icecast 风格的元数据,而不是 MP3 ID3 数据。这对你没有帮助。

您所需要的只是一个简单的http.get()。然后,您可以自己遵循重定向,或使用 request 包。更多信息请参见:How do you follow an HTTP Redirect in Node.js?

分块编码

许多流媒体客户端无法处理分块编码。当你有流输出时,Node.js(正确地)添加它。但出于我们的目的,让我们禁用它。

res.useChunkedEncodingByDefault = false;

https://stackoverflow.com/a/11589937/362536

构建一致的流

理论上,您只需在 MPEG 流之后附加 MPEG 流即可,一切都会正常工作。实际上,这是行不通的。 ID3 标签会损坏流。一个文件的采样率可能与另一个文件不同,并且大多数软件将无法即时将硬件切换到新的采样率。基本上,您无法可靠地完成您想要做的事情。

您唯一能做的就是通过播放这些音频文件来重新编码整个流,并从另一端获取可靠的流。这给您带来了额外的好处,您可以处理其他编解码器和格式,而不仅仅是 MP3。

要处理许多编解码器问题,您可以使用 FFmpeg。但是,您将需要一种方法将这些文件回放到 FFmpeg 进行编码。

速率限制

必须以播放速率传输音频。 (您可以发送初始缓冲区以使客户端快速启动,但您无法尽可能快地向它们发送数据。)如果您不这样做,您将很快耗尽服务器上的内存,因为客户端会将其 TCP 窗口大小降低到零并保持不变,直到音频 catch 足够的速度以允许缓冲更多数据。由于您没有使用pipe,因此您的流处于流动模式,并且将无限期地在服务器上缓冲。现在,这在某些方面实际上是一件好事,因为这可以防止一个缓慢的客户端拖慢其他客户端的速度。但这是一件坏事,因为您的代码会尽可能快地进行流式传输,而不是按照播放速率。

如果您将音频播放到另一个编码器,请使用几秒钟的 RTC 作为时钟。它不必是完美的,这就是客户端缓冲区的用途。如果您正在播放音频设备,它当然有自己的时钟,将使用该时钟。

你实际上应该做什么

你无意中发现了一个巨大的项目。我强烈建议使用Liquidsoap反而。您可以通过多种方式从 Node.js 控制它。从那里,使用类似 Icecast 的服务器为了您的流媒体。

关于node.js - 使用 Node 从 soundcloud 源同时传输音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com