我将创建语音聊天。我的后端服务器工作在Node.js上,几乎每个客户端和服务器之间的连接都使用socket.io。
websockets适合我的用例吗?我更喜欢客户端->服务器->客户端通信,而不是P2P,因为我希望有1000个客户端连接到一个房间。
如果websocket是ok的,那么哪种方法是最好的发送AudioBuffer到服务器和播放在其他客户端?我是这样做的:
navigator.getUserMedia({audio: true}, initializeRecorder, errorCallback);
function initializeRecorder(MediaStream) {
var audioCtx = new window.AudioContext();
var sourceNode = audioCtx.createMediaStreamSource(MediaStream);
var recorder = audioCtx.createScriptProcessor(4096, 1, 1);
recorder.onaudioprocess = recorderProcess;
sourceNode.connect(recorder);
recorder.connect(audioCtx.destination);
}
function recorderProcess(e) {
var left = e.inputBuffer.getChannelData(0);
io.socket.post('url', left);
}
但是在其他客户端接收数据后,我不知道如何从缓冲区数组播放此音频流。
编辑
1)为什么如果我不连接ScriptProcessor(记录器变量)到目的地,onaudioprocess方法没有被触发?
文档信息-"虽然你不需要提供一个目的地,如果你说,只是想可视化一些音频数据"- Web音频的概念和使用
2)为什么我没有听到任何从我的扬声器连接记录器变量到目的地后,如果我连接sourceNode变量直接到目的地,我做。即使onaudioprocess方法什么也不做
有人能帮忙吗?
我认为web sockets在这里是合适的。只要确保您使用的是二进制传输。(我自己使用BinaryJS,允许我打开任意流到服务器。)
从用户媒体捕获中获取数据非常简单。你所拥有的是一个良好的开端。棘手的派对正在播放。您必须缓冲数据并使用您自己的脚本处理节点进行回放。
如果你在任何地方使用PCM,这并不太难…从Web Audio API获得的原始样本。这样做的缺点是,有很多开销推32位浮点PCM。这使用了大量的带宽,而这些带宽单独用于语音是不需要的。
我认为在你的情况下最简单的事情是将位深度减少到一个任意位深度,这对你的应用程序很好。对于可识别的语音来说,8位采样已经足够了,并且占用的带宽会少一些。通过使用PCM,您可以避免在JS中实现编解码器,然后必须处理该编解码器的缓冲和数据帧。
总而言之,在脚本处理节点的类型化数组中拥有原始样例数据后,编写一些代码将这些样例从32位浮点数转换为8位有符号整数。通过二进制web套接字,将这些缓冲区以相同大小的块发送到服务器。然后服务器将这些发送到所有其他客户端的二进制web套接字。当客户端接收到音频数据时,它将缓冲它,无论您选择多少时间来防止丢失音频。您的客户端代码将把这些8位样本转换回32位浮点数,并将其放入回放缓冲区中。脚本处理节点将拾取缓冲区中的任何内容,并在数据可用时开始播放。