簡體   English   中英

從Soundcloud源和節點同時流音頻

[英]Stream audio simultaneously from soundcloud source with node

我正在從節點服務器使用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'); 

有幾個問題

跟隨重定向

您使用的radio-stream模塊已經4年沒有更新了。 那是Node.js API時代的永恆。 我建議不要使用它,因為與當前和將來的Node.js版本無疑存在兼容性問題。 至少,現在有了使用新的Streams API處理此問題的更好的方法。

無論如何,該模塊都不遵循HTTP重定向。 SoundCloud API將您重定向到實際的媒體文件。

此外, radio-stream電流模塊用於對SHOUTcast / Icecast樣式的元數據進行解復用,而不是對MP3 ID3數據進行解復用。 它不會幫助你。

您只需要一個簡單的http.get() 然后,您可以自己進行重定向,也可以使用request包。 更多信息: 如何在Node.js中遵循HTTP重定向?

分塊編碼

許多流客戶端無法處理分塊編碼。 流輸出時,Node.js(正確)添加了它。 為了我們的目的,讓我們禁用它。

res.useChunkedEncodingByDefault = false;

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

建立連貫的流

從理論上講,您可以在MPEG流之后追加MPEG流,然后一切正常。 實際上,這是行不通的。 ID3標簽將破壞流。 一個文件的采樣率可能不同於另一文件,大多數軟件將無法即時將硬件切換到新的采樣率。 基本上,您不能可靠地執行您要執行的操作。

您唯一可以做的就是通過播放這些音頻文件來重新編碼整個流,並從另一端獲得可靠的流。 這給您帶來了額外的好處,您可以處理其他編解碼器和格式,而不僅僅是MP3。

要處理許多編解碼器問題,可以使用FFmpeg。 但是,您將需要一種將這些文件回放到FFmpeg進行編碼的方法。

限速

必須以播放速率流式傳輸音頻。 (您可以發送一個初始緩沖區來使客戶端快速啟動,但不能繼續向它們猛擊數據。)如果不這樣做,則會很快耗盡服務器上的內存,因為客戶端會將TCP窗口大小減小到零,並停留在該位置,直到音頻捕獲到足以允許緩沖更多數據的程度為止。 由於您沒有使用pipe ,因此流處於流模式,並且將無限期地在服務器上緩沖。 現在,在某些方面這實際上是一件好事,因為這可以防止一個速度較慢的客戶端降低其他客戶端的速度。 這是一件壞事,盡管在您的代碼中,您正在盡可能快地流式傳輸而不是以回放的速度傳輸。

如果將音頻回放到另一個編碼器,請在幾秒鍾內將RTC用作時鍾。 不一定是完美的,這就是客戶端緩沖區的用途。 如果您正在播放音頻設備,則當然會有它自己的時鍾,它將被使用。

你應該做什么

您偶然發現了一個巨大的項目。 我強烈建議改用Liquidsoap 您可以通過多種方法從Node.js中對其進行控制。 從那里,使用Icecast之類的服務器進行流式傳輸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM