NodeJS - Аудио в прямом эфире на определенный URL с аудио-фрагментами mp3 - PullRequest
0 голосов
/ 03 октября 2018

Я работаю над созданием приложения, которое будет захватывать аудио из браузера за 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);
        }
    });
}

Я видел несколько вопросов, которые задают похожая концепция, но не совсем конечная цель, которую я ищу.Есть ли способ сделать эту работу?

...