我们正在开发一个基于 Java 的 IP 语音程序,我们需要找到一种有效的方法来将流和服务器端压力保持在合理的范围内。我们正在为多人游戏编写此内容,并且计划使用几种不同的模式来确定如何混合和发送音频。我们计划让它“选择加入”,以将无用的流排除在等式之外,如果他们选择不参与语音聊天的话。除此之外,我们还在考虑 channel 、私有(private)聊天(2 人)和邻近度。如果我们使用的 channel 中有 16 人以上,我们想要找到是否有办法避免 x^2 数量的流(在本例中为 256)。我们还需要尝试将客户端工作保持在合理的水平,因为它将运行游戏。我们不太确定大型服务器可以处理多少工作,因为随着 channel 中的人数增加,它会呈指数级增长。我们可能需要限制每个 channel 的人数,或者允许服务器所有者这样做,以及限制 channel 的数量。该游戏可以同时在服务器上容纳大约 40-500 人,具体取决于受欢迎程度,并且我们不确定如何处理服务器处理和带宽上的这种类型的压力。
本质上,我们询问是否有人对现有系统有任何了解,并且可以有效地处理此问题。如果有任何相关性的话,我们将使用 JSpeex 进行音频编码。那么,有没有什么方法可以解决这个问题,或者甚至可能有来自社区的一些想法?我们还计划在我们一直在开发的较小规模的类似 Skype 的程序中重新实现这一点。
最佳答案
我不明白为什么你需要 256 个流。您不应该直接从一个客户到另一个客户。
对于每个客户端,您都需要一个到服务器的双向连接。所有输入/输出音频均通过服务器定向。然后,服务器将播放器要接收的所有音频多路复用为单个音频流并将其转发。
当您处于私有(private)聊天中时,服务器仅转发来自与您私有(private)聊天的其他玩家的数据包。
使用邻近度时,服务器会将范围内任何播放器的音频多路复用到单个流中。
我假设任何像样的音频编码包都支持将多个 channel 的音频复用在一起,但我对 JSpeex 一无所知。
关于java - 如何处理 VoIP 的音频流和混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432092/