我正在开发一个应用程序,该应用程序将在5秒钟的“块”中捕获来自浏览器的音频(这些是完整的音频文件,而不仅仅是部分文件),将这5秒钟的块发送到服务器,从webm进行转换到服务器上的mp3,然后将mp3文件广播到通过websocket或静态网址连接的客户端。
我已经成功地完成了第一部分和第二部分;但是,我不太确定将创建的mp3音频文件传输给用户的最佳方法。我的想法是生成供客户端收听的单个URL,例如http://localhost/livestream.mp3(一个实时流URL,它将自动使用最新的音频数据更新自身),或通过websocket向客户端发送音频文件。并尝试无缝播放这些排序的音频文件,而在切换音频文件时,它们之间没有明显的间隙。
这是我创建mp3文件的[打字稿]代码的片段,我指出了我将在其中执行写流的区域,我希望从那里可以在用户进行HTTP传输时将其传递给用户要求
private createAudioFile(audioObj: StreamObject, socket: SocketIO.Socket) : void {
const directory: string = `${__dirname}/streams/live`;
fs.writeFile(`${directory}/audio_${audioObj.time}.webm`, audioObj.stream, (err: NodeJS.ErrnoException) => {
if (err) logger.default.info(err.toString());
try {
const process: childprocess.ChildProcess = childprocess.spawn('ffmpeg', ['-i', `${directory}/audio_${audioObj.time}.webm`, `${directory}/audio_${audioObj.time}.mp3`]);
process.on('exit', () => {
// Ideally, this is where I would be broadcasting the audio from
// the static URL by adding the new stream data to it, or by
// emitting it out to all clients connected to my websocket
// const wso = fs.createWriteStream(`${directory}/live.mp3`);
// const rso = fs.createReadStream(`${directory}/audio_${audioObj.time}.mp3`);
// rso.pipe(wso);
if (audioObj.last == true) {
this.archiveAudio(directory, audioObj.streamName);
}
});
} catch (e) {
logger.default.error('CRITICAL ERROR: Exception occurred when converting file to mp3:');
logger.default.error(e);
}
});
}
我已经看到了许多问题,这些问题需要一个 概念,但并不是我要寻找的最终目标。有办法使这项工作吗?