我通过套接字将PCM音频数据发送到一个小node.js服务,然后我想用Icecast作为“实时”音频流。我每5秒左右发送一次数据,所以我基本上有5个第二个剪辑,我希望无缝地流式传输为一系列文件或一个文件。基本的要点是这是一个现场录音,我希望在写入时将其流式传输。
我尝试过以下方法:
1)使用ffmpeg获取音频并将其转换为.ogg,然后将文件路径写入播放列表文件以提供标准冰类型基本/播放列表配置 - 以便它像标准一样滚动文件播放列表。
2)使用ffmpeg获取音频,将其转换为.ogg,并将新创建的.ogg文件连接到主“super”.ogg文件,并使用标准冰类型基本/播放列表配置提供。
3)只需取出PCM数据,并在每次接收到stdinpcm输入时将其输送到冰(因此每隔5秒左右就会将PCM数据丢给冰)。
无论我尝试什么,我只能流一个切片,冰块停止。它认为它已经完成了创建,流式传输和拆除icecast挂载......并终止了客户端连接。
我觉得这可能从根本上说是错误的方法,所以我试图感觉其他人正在做些什么来解决同样的问题(“分块”多个音频文件以创建连续的流)。
提前感谢您的帮助!
更新:
谢谢,@ Brad。我现在能够对Icecast进行身份验证并启动mount / stream。但是,如果我尝试只为它提供一个文件流进行测试,那就会奇怪地播放(比如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 :(得分:0)
我有一个同样的应用程序,receiving PCM data from WebSocket clients and sending to SHOUTcast/Icecast servers。我的方法是采用交错采样,将它们发送到FFmpeg进行编码(通过STDIO),从FFmpeg获取结果,然后将其作为流直接发送到SHOUTcast / Icecast服务器。我用JavaScript编写了两个服务器的源客户端。
这种方法非常有效。 Icecast和SHOUTcast都很容易与之接口: