Osk*_*ski 1 audio-streaming websocket node.js socket.io asp.net-web-api
我将创建语音聊天。我的后端服务器在Node.js上运行,并且客户端与服务器之间的几乎每个连接都使用socket.io。
websocket是否适合我的用例?与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);
}
Run Code Online (Sandbox Code Playgroud)
但是在接收到其他客户端的数据后,我不知道如何从缓冲区阵列播放此音频流。
编辑
1)为什么如果我不将ScriptProcessor(记录器变量)连接到目标,则不会触发onaudioprocess方法?
文档信息-“尽管您只想可视化一些音频数据,但不必提供目的地” -Web音频概念和用法
2)为什么将记录器变量连接到目标之后,为什么我的扬声器没有听到任何声音,如果我将sourceNode变量直接连接到目标,我可以听到。即使onaudioprocess方法不执行任何操作。
有人可以帮忙吗?
我认为网络套接字在这里是合适的。只要确保您正在使用二进制传输即可。(我自己为此使用BinaryJS,允许我向服务器打开任意流。)
从用户媒体捕获中获取数据非常简单。您拥有一个好的开始。棘手的聚会正在播放中。您将必须缓冲数据并使用自己的脚本处理节点进行播放。
如果您在任何地方都使用PCM,这并不太难...从Web Audio API获得的原始样本。不利的一面是,将32位浮点PCM浪费在周围有很多开销。这将使用大量带宽,而这是单独语音所不需要的。
我认为,最简单的方法是将位深度减小到适合您的应用程序的任意位深度。8位样本足以识别语音,并且占用的带宽要少得多。通过使用PCM,您不必在JS中实现编解码器,而不必处理该编解码器的数据缓冲和成帧。
总而言之,一旦在脚本处理节点中将原始样本数据存储在类型化数组中,就编写一些内容将这些样本从32位浮点型转换为8位有符号整数。通过二进制Web套接字,将这些缓冲区以与传入时相同的大小块发送到服务器。然后,服务器会将它们发送到其二进制Web套接字上的所有其他客户端。当客户端收到音频数据时,它将在您选择的任何时间量内缓冲数据,以防止音频丢失。您的客户代码会将这些8位样本转换回32位浮点数,并将其放入播放缓冲区中。您的脚本处理节点将拾取缓冲区中的所有内容,并在数据可用时开始播放。
| 归档时间: |
|
| 查看次数: |
7890 次 |
| 最近记录: |