【发布时间】: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();
【问题讨论】: