Obtenha áudio ao vivo do servidor NodeJS para os clientes

Eu preciso ter um fluxo de áudio ao vivo em tempo real de 1 cliente para um servidor para vários clientes ouvintes.

Atualmente, tenho a gravação do cliente funcionando e transmito o áudio através do socket.io para o servidor. O servidor recebe esses dados e deve transmitir o áudio (também por meio do socket.io?) Para os clientes que desejam ouvir esse fluxo. Deve ser o mais real possível (minimizar o atraso).

Estou usando o GetUserMedia para gravar o microfone (a compatibilidade do navegador não é importante aqui). Quero que os clientes usem a tag de áudio HTML5 para ouvir o fluxo. Os dados recebidos no servidor são pedaços (atualmente empacotados por 700) empacotados em um blob com o tipo audio / wav.

Este é o meu código para enviá-lo ao servidor:

mediaRecorder.ondataavailable = function(e) {
    this.chunks.push(e.data);
    if (this.chunks.length >= 700)
    {
        this.sendData(this.chunks);
        this.chunks = [];
    }
};
mediaRecorder.sendData = function(buffer) {
    blob = new Blob(buffer, { 'type' : 'audio/wav' });
    socket.emit('voice', blob);
}

No servidor, sou capaz de enviar os pedaços para o cliente da mesma maneira:

socket.on('voice', function(blob) {
    socket.broadcast.emit('voice', blob);
});

No cliente eu posso jogar assim:

var audio = document.createElement('audio');
socket.on('voice', function(arrayBuffer) {
    var blob = new Blob([arrayBuffer], { 'type' : 'audio/wav' });
    audio.src = window.URL.createObjectURL(blob);
    audio.play();
});

Isso funciona para o primeiro blob de blocos que eu envio, mas você não tem permissão para continuar mudando para audio.src para a nova fonte de URL, portanto, essa não é uma solução funcional.

Acho que tenho que criar algum tipo de fluxo no servidor que possa colocar na tag de áudio do HTML5 nos clientes que estão ouvindo, mas não sei como. Os blobs recebidos com pedaços devem ser anexados a esse fluxo em tempo real.

Qual é a melhor abordagem para fazer isso? Estou fazendo isso diretamente do microfone do cliente para o servidor?

questionAnswers(2)

yourAnswerToTheQuestion