【问题标题】:Stream audio simultaneously from soundcloud source with node使用节点同时从 soundcloud 源流式传输音频
【发布时间】:2015-03-16 15:34:04
【问题描述】:

我正在使用来自节点服务器的 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'); 

【问题讨论】:

    标签: node.js audio stream soundcloud internet-radio


    【解决方案1】:

    有几个问题

    跟随重定向

    您使用的radio-stream 模块已经有 4 年没有更新过了。这在 Node.js API 时代是永恒的。我建议不要使用它,因为 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 窗口大小降低到零,并一直停留在那里,直到音频赶上足以允许缓冲更多数据为止。由于您没有使用pipe,因此您的流处于流动模式并且将无限期地在服务器上缓冲。现在,这在某些方面实际上是一件好事,因为这可以防止一个慢客户端减慢其他客户端的速度。这是一件坏事,因为您的代码尽可能快地进行流式传输,而不是以播放速度。

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

    你应该做什么

    您偶然发现了一个巨大的项目。我强烈建议改用Liquidsoap。您可以通过 Node.js 控制它。从那里,使用像 Icecast 这样的服务器进行流式传输。

    【讨论】:

    • 谢谢,非常好的答案。在我批准之前让我测试所有这些。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多