的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();
感謝 - 這是有道理的。我試圖避免寫一個客戶端,但看起來這是真正實現它的唯一體面的方式。間歇性地饋送流(在初始握手進行身份驗證之後)是否存在問題?當我從輸入中得到它們時,我將以小爆發形式提供流數據。 – mercury
服務器將在您的編碼數據可用時將其發送到客戶端。由於您每5秒只發送一次數據,因此客戶端可能需要重新緩衝,但如果您每5秒鐘發送5秒鐘的音頻,它們最終應該無間隙地播放。 (這是緩衝區的要點。)通過配置更大的緩衝區Icecast或在Node應用程序中添加緩衝區,您可以輕鬆解決此問題。如果你把它放在Node端:http://stackoverflow.com/a/20585620/362536 – Brad
再次感謝您的幫助! – mercury