Node.js 从NodeJS服务器向客户端获取实时流媒体音频

Node.js 从NodeJS服务器向客户端获取实时流媒体音频,node.js,html,socket.io,webrtc,html5-audio,Node.js,Html,Socket.io,Webrtc,Html5 Audio,我需要有一个实时直播音频流从一个客户端到一个服务器到多个侦听器客户端 目前,我已经从客户端录制了音频,并通过socket.io将音频流传输到服务器。服务器接收此数据,并且必须将音频(也通过socket.io?)流式传输给希望收听此流的客户端。它必须尽可能实时(尽量减少延迟) 我正在使用GetUserMedia录制麦克风(浏览器兼容性在这里并不重要)。我希望客户端使用HTML5音频标签来收听流。服务器上接收的数据是块(当前由700个块打包),打包在一个blob中,类型为audio/wav 这是我将

我需要有一个实时直播音频流从一个客户端到一个服务器到多个侦听器客户端

目前,我已经从客户端录制了音频,并通过socket.io将音频流传输到服务器。服务器接收此数据,并且必须将音频(也通过socket.io?)流式传输给希望收听此流的客户端。它必须尽可能实时(尽量减少延迟)

我正在使用GetUserMedia录制麦克风(浏览器兼容性在这里并不重要)。我希望客户端使用HTML5音频标签来收听流。服务器上接收的数据是块(当前由700个块打包),打包在一个blob中,类型为audio/wav

这是我将其发送到服务器的代码:

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);
}
在服务器上,我可以像这样将块发送到客户端:

socket.on('voice', function(blob) {
    socket.broadcast.emit('voice', blob);
});
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();
});
在客户端上,我可以这样玩:

socket.on('voice', function(blob) {
    socket.broadcast.emit('voice', blob);
});
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();
});
这适用于我发送的第一个blob块,但不允许您将audio.src更改为新的URL源,因此这不是一个有效的解决方案

我想我必须在服务器上创建某种流,我可以把它放在收听客户端的HTML5音频标签中,但我不知道怎么做。接收到的包含块的blob应该实时附加到此流


最好的方法是什么?从客户端麦克风到服务器,我做得对吗?

您可以动态更改
音频
src
,如下所示(假设为mp3类型):


您的浏览器不支持音频格式。
每当收到套接字事件时,调用以下函数:

function updateSource() { 
        var audio = document.getElementById('audio');

        var source = document.getElementById('mp3Source');
        source.src= <blob>;

        audio.load(); //call this to just preload the audio without playing
        audio.play(); //call this to play the song right away
    }
函数updateSource(){
var audio=document.getElementById('audio');
var source=document.getElementById('mp3Source');
source.src=;
audio.load();//调用此函数只预加载音频而不播放
audio.play();//调用此命令立即播放歌曲
}

我在这里参加聚会有点晚了,但如果您还没有完成,web audio API似乎将是您在这里的朋友。它允许您将音频流直接播放到输出设备,而无需将其连接到音频元素

我正在考虑做同样的事情,您的问题已经回答了我的问题-如何从客户机到服务器获取数据。web音频API的好处是能够将流添加到一起,并在服务器上对其应用音频效果


io事件应替换音频上下文中音频缓冲区对象中的数据。音频处理可以在nodeJS web音频上下文中进行,然后作为单个流发送到每个客户端。

如果您听说过webrtc,那么这是解决问题的自然方法,因为webrtc是对等的。我知道,但我不希望它是对等的,而是从服务器进行广播。录制音频的客户端没有足够的带宽向所有客户端广播,因此我需要一个服务器来实现这一点。您可以使用WebRTC的MCU体系结构,但我猜这超出了范围。为什么不发送一个二进制流呢?这与您得到的答案相符吗?对此非常好奇!这正是我试图实现的目标,但我很难遵循您链接的文档中的示例。当您从套接字接收到事件时,您是否有一个如何实现这一点的示例?