我正在通过一个套接字向一个小型node.js服务发送PCM音频数据,然后我想将该服务与Icecast一起作为“实时”音频流。我每5秒左右发送一次数据,所以我基本上有5秒的剪辑,我希望将它们无缝地作为一系列文件或一个文件进行流。基本的要点是,这是一个现场录音,我希望它是流的,因为它正在编写。
我尝试了以下方法:
1)使用ffmpeg获取音频并将其转换为.ogg,然后将文件写到播放列表文件中,以标准ices类型的basic/播放列表配置提供服务--以便像标准播放列表一样在文件中滚动。
2)使用ffmpeg获取音频,将其转换为.ogg,并将新创建的.ogg文件连接为主“超级”.ogg文件,并提供标准的ices类型basic/播放列表配置。
3)每次接收PCM数据时,只需使用stdinpcm输入(因此每隔5秒左右将PCM数据扔到ices)即可将其输送到ices。
不管我怎么尝试,我只能流一片,冰就停了。它认为它已经完成了创造,流动,并撕毁了一座冰盖.并终止客户端连接。
我觉得这可能是根本错误的方法,所以我想了解其他人正在做什么来解决同样的问题(“分块”多个音频文件来创建一个连续的流)。
提前感谢您的帮助!
更新:
谢谢,布拉德。我现在可以对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();发布于 2014-02-11 01:01:18
我有一个应用程序可以做同样的事情,从WebSocket客户端接收PCM数据并发送到SHOUTcast/Icecast服务器。我的方法是获取交错的示例,将它们发送到FFmpeg进行编码(通过STDIO),获取来自FFmpeg的结果,并将其作为流直接发送到SHOUTcast/Icecast服务器。我在JavaScript中为这两个服务器编写了源代码客户端。
这种方法效果很好。Icecast和SHOUTcast都很容易与以下方面进行接口:
https://stackoverflow.com/questions/21688449
复制相似问题