【发布时间】:2015-08-15 06:37:59
【问题描述】:
我要创建语音聊天。我的后端服务器在 Node.js 上工作,几乎每个客户端和服务器之间的连接都使用 socket.io。
websockets 适合我的用例吗?我更喜欢通信客户端 -> 服务器 -> 客户端而不是 P2P,因为我预计甚至 1000 个客户端连接到一个房间。
如果 websocket 没问题,那么哪种方法最好将 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 Audio concepts and usage
2) 为什么在将记录器变量连接到目标后我听不到扬声器的任何声音,如果我将 sourceNode 变量直接连接到目标,我会听到。 即使 onaudioprocess 方法没有做任何事情。
有人可以帮忙吗?
【问题讨论】:
-
“我预计甚至 1000 个客户连接到一个房间。”与 3 人以上的语音聊天很困难。不仅存在无法同时听懂 1,000 个人讲话的实际问题,而且会占用大量带宽。您确定要构建“语音聊天”应用程序吗?您确定您不是在尝试构建只有少数人在说话而大多数人在听的东西吗?
-
就像我说的 1000 个客户端连接到房间。只有一个人可以同时说话。我同意即使是 3 个人同时说话也会很混乱;)
-
我仍然不清楚您正在尝试构建什么......这些细节对于选择正确的解决方案很重要。一次只能说话?还是在会话的整个生命周期中都有一个?而且,您的延迟要求是什么?
-
chatonic.com - 我想创建这样的解决方案。但他们使用来自客户端的闪存。我只想使用 JavaScript。
-
我不知道 Chatonic 是什么,如果不创建帐户就无法尝试。您能否更详细地描述您正在尝试做什么?
标签: node.js websocket socket.io asp.net-web-api audio-streaming