2014-02-10 35 views
1

的Ids/Icecast - 流式傳輸.ogg文件我通過套接字將PCM音頻數據發送到小型node.js服務,然後我想用Icecast作爲「現場」音頻進行流式傳輸。我每隔5秒左右發送一次數據,所以我基本上有5秒鐘的剪輯,我希望將它們無縫地串流爲一系列文件或一個文件。基本的要點是,這是一個現場錄音,我希望在正在寫入時進行流式傳輸。Ices/Icecast - 正在追加到

我嘗試以下方法:

1)使用的ffmpeg採取音頻並將其轉換爲.OGG,然後寫文件路徑的播放列表文件與標準型冰基本服務上/播放列表配置 - 以便像標準播放列表一樣瀏覽文件。

2)使用的ffmpeg採取的音頻,將其轉換爲.OGG,並concatonate新創建的.ogg文件爲主要的「超級」的.ogg文件,並投放了一個標準的冰基本型/播放列表的配置。

3)每次收到PCM數據並用stdinpcm輸入將它傳送給冰塊(因此每5秒左右將PCM數據傳送給冰塊)。

無論我嘗試什麼,我只能夠流片和冰止。它認爲它已經完成了創建,流媒體和拆除icecast安裝程序......並終止了客戶端連接。我覺得這可能從根本上是錯誤的方法,所以我試圖感受別人正在做什麼來解決同樣的問題(「分塊」多個音頻文件以創建連續流)。

在此先感謝您的幫助!

更新:

謝謝,@布拉德。我現在可以驗證Icecast並啓動掛載/流。但是,如果我試圖給它一個文件流進行測試,它會奇怪地播放(如15秒,然後突然停止)。所以我認爲我正在讓流媒體部分非常錯誤 - 這是否應該發生在同一個請求中 - 或者是一個新的後續請求?這裏是一個代碼示例:

'use strict'; 

var http = require('http'); 
var fs = require('fs'); 

var options = { 
    host: 'iceserver_host.net', 
    path: '/stream.ogg', 
    port: '8000', 
    method: 'SOURCE /stream.ogg ICE/1.0', 
    headers: { 
     'Authorization': 'Basic ' + new Buffer('source:somepassword').toString('base64'), 
     'Content-Type': 'application/ogg', 
     'User-Agent': 'mysource/1.0', 
     'ice-name': 'Test Stream', 
     'ice-url': 'http://server.com', 
     'ice-genre': 'talk', 
     'ice-bitrate': '128', 
     'ice-private': '0', 
     'ice-public': '1', 
     'ice-description': 'Some description.' 
    } 
}; 

var req = http.request(options, function(response) { 
    if (response.statusCode == '200') { 
     console.log('************* Authenticated! *************'); 
     // this only sort of works... 
     var stream = fs.createReadStream('audio.ogg'); 
     stream.pipe(req); 
    } 
}); 
req.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
}); 

req.end(); 

回答

0

我有一個應用程序可以做同樣的事情,receiving PCM data from WebSocket clients and sending to SHOUTcast/Icecast servers。我的方法是採取交錯樣本,將它們發送到FFmpeg進行編碼(通過STDIO),從FFmpeg獲取結果,並將其作爲流直接發送到SHOUTcast/Icecast服務器。我用JavaScript編寫了兩臺服務器的源客戶端。

這種方法工作得很好。雙方的Icecast和Shoutcast一樣易於使用的接口:

+0

感謝 - 這是有道理的。我試圖避免寫一個客戶端,但看起來這是真正實現它的唯一體面的方式。間歇性地饋送流(在初始握手進行身份驗證之後)是否存在問題?當我從輸入中得到它們時,我將以小爆發形式提供流數據。 – mercury

+0

服務器將在您的編碼數據可用時將其發送到客戶端。由於您每5秒只發送一次數據,因此客戶端可能需要重新緩衝,但如果您每5秒鐘發送5秒鐘的音頻,它們最終應該無間隙地播放。 (這是緩衝區的要點。)通過配置更大的緩衝區Icecast或在Node應用程序中添加緩衝區,您可以輕鬆解決此問題。如果你把它放在Node端:http://stackoverflow.com/a/20585620/362536 – Brad

+0

再次感謝您的幫助! – mercury