Я работаю над созданием приложения, которое будет захватывать аудио из браузера за 5-секундные «чанки» (это полные аудиофайлы, а не просто частичные файлы), отправлять эти 5-секундные чанки на сервер, конвертировать их из webm.в mp3 на сервере, а затем транслировать mp3-файл клиентам, подключенным через веб-сокет или статический URL.
Мне успешно удалось выполнить части 1 и 2;однако, я не совсем уверен, что лучший способ передать этот созданный аудиофайл 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);
}
});
}
Я видел несколько вопросов, которые задают похожая концепция, но не совсем конечная цель, которую я ищу.Есть ли способ сделать эту работу?