NodeJS-通过mp3音频“块”将音频流实时传输到特定URL

时间:2018-10-03 01:31:15

标签: node.js audio websocket stream live-streaming

我正在开发一个应用程序,该应用程序将在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);
        }
    });
}

我已经看到了许多问题,这些问题需要一个 概念,但并不是我要寻找的最终目标。有办法使这项工作吗?

0 个答案:

没有答案