Ices / Icecast - 正在附加的流.ogg文件

时间:2014-02-10 21:36:57

标签: streaming pcm ogg icecast

我通过套接字将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();

1 个答案:

答案 0 :(得分:0)

我有一个同样的应用程序,receiving PCM data from WebSocket clients and sending to SHOUTcast/Icecast servers。我的方法是采用交错采样,将它们发送到FFmpeg进行编码(通过STDIO),从FFmpeg获取结果,然后将其作为流直接发送到SHOUTcast / Icecast服务器。我用JavaScript编写了两个服务器的源客户端。

这种方法非常有效。 Icecast和SHOUTcast都很容易与之接口: