我需要从1个客户端到服务器到多个侦听器客户端的实时实时音频流.
目前我从客户端进行录音工作,并通过socket.io将音频流传输到服务器.服务器接收此数据,并且必须将音频(也通过socket.io?)传输到想要侦听此流的客户端.它必须尽可能实时(最小化延迟).
我正在使用GetUserMedia来录制麦克风(浏览器兼容性在这里并不重要).我希望客户端使用HTML5音频标签来收听流.在服务器上接收的数据是打包在带有audio/wav类型的blob中的块(当前由700打包).
这是我将代码发送到服务器的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
在服务器上,我能够以相同的方式将块发送到客户端:
socket.on('voice', function(blob) {
socket.broadcast.emit('voice', blob);
});
Run Code Online (Sandbox Code Playgroud)
在客户端我可以这样玩:
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();
});
Run Code Online (Sandbox Code Playgroud)
这适用于我发送的第一个块的块,但是你不允许继续更改为audio.src到新的URL源,所以这不是一个有效的解决方案.
我想我必须在服务器上创建某种流,我可以在侦听客户端上放入HTML5的音频标签,但我不知道如何.接收到的带有块的blob应该实时附加到此流.
这样做的最佳方法是什么?我是从客户端麦克风到服务器吗?