【问题标题】:Ices/Icecast - streaming .ogg file that is being appended toIces/Icecast - 附加到的流式 .ogg 文件
【发布时间】:2014-02-13 03:37:46
【问题描述】:

我正在通过套接字将 PCM 音频数据发送到一个小型 node.js 服务,然后我想用 Icecast 作为“实时”音频进行流式传输。我每 5 秒左右发送一次数据,所以我基本上有 5 秒的剪辑,我希望以一系列文件或一个文件的形式无缝流式传输。基本要点是这是一个现场录音,我希望在它正在编写时进行流式传输。

我尝试了以下方法:

1) 使用 ffmpeg 获取音频并将其转换为 .ogg,然后将文件路径写入播放列表文件以提供标准 ices 类型的基本/播放列表配置 - 这样它就可以像标准一样滚动文件播放列表。

2) 使用 ffmpeg 获取音频,将其转换为 .ogg,并将新创建的 .ogg 文件连接到主要的“超级”.ogg 文件,并使用标准的 ices 类型的基本/播放列表配置来提供它。

3) 只需在每次接收到 PCM 数据时通过 stdinpcm 输入将其通过管道传输到 ices(因此每隔 5 秒左右将 PCM 数据扔给 ices)。

无论我尝试什么,我都只能流式传输一个切片并且冰停止。它认为它已经完成了创建、流式传输和拆除 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();

【问题讨论】:

    标签: streaming pcm ogg icecast


    【解决方案1】:

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

    这种方法效果很好。 Icecast 和 SHOUTcast 都易于交互:

    【讨论】:

    • 谢谢 - 这是有道理的。我试图避免编写客户端,但看起来这确实是唯一体面的方法。间歇性地提供流是否存在问题(在初始握手以进行身份​​验证之后)?当我从输入中获取流数据时,我会以小批量的方式提供流数据。
    • 服务器将在您的编码数据可用时将其发送给客户端。由于您仅每 5 秒发送一次数据,因此客户端可能必须重新缓冲,但如果您每 5 秒发送 5 秒的音频,它们最终应该无间隙地播放。 (这就是缓冲区的重点。)您可以通过为 Icecast 配置更大的缓冲区或在 Node 应用程序中添加缓冲区来轻松解决此问题。如果放在Node端:stackoverflow.com/a/20585620/362536
    • 再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    相关资源
    最近更新 更多