Java 如何为VoIP处理音频流和混音

Java 如何为VoIP处理音频流和混音,java,audio,bandwidth,mixing,Java,Audio,Bandwidth,Mixing,我们正在开发一个基于Java的IP语音程序,我们需要找到一种有效的方法将流和服务器端压力保持在合理的水平。我们写这篇文章是为了一个多人游戏,我们计划有一些不同的模式来决定如何混合和发送音频。如果无用的流选择不参与语音聊天,我们计划让它“选择加入”,以避免它们进入平衡。除此之外,我们还考虑了频道、私人聊天(2人)和近距离。如果我们使用的频道中有16人以上,我们想知道是否有办法避免x^2个流(本例中为256个)。我们还需要将客户端的工作保持在合理的水平,因为它将运行一个游戏。我们不太确定一台大型服务

我们正在开发一个基于Java的IP语音程序,我们需要找到一种有效的方法将流和服务器端压力保持在合理的水平。我们写这篇文章是为了一个多人游戏,我们计划有一些不同的模式来决定如何混合和发送音频。如果无用的流选择不参与语音聊天,我们计划让它“选择加入”,以避免它们进入平衡。除此之外,我们还考虑了频道、私人聊天(2人)和近距离。如果我们使用的频道中有16人以上,我们想知道是否有办法避免x^2个流(本例中为256个)。我们还需要将客户端的工作保持在合理的水平,因为它将运行一个游戏。我们不太确定一台大型服务器可以处理多少工作,因为它将是指数级的,因为在一个通道中有更多的人。我们可能需要限制每个频道的人数,或者允许服务器所有者这样做,以及限制频道的数量。根据受欢迎程度的不同,这个游戏一次可以在一台服务器上有大约40-500人,我们不确定如何处理服务器处理和带宽上的这种压力


本质上,我们是在问,是否有人知道现有系统有一种有效的处理方法。我们正在使用JSpeex进行音频编码,如果这有任何关联的话。那么,有没有什么方法来处理这个问题,或者甚至可能有一些来自社区的想法?我们还计划在我们一直在开发的一个类似Skype的小规模程序中重新实现这一点

我不明白为什么需要256个流。你不应该直接从一个客户到另一个客户

对于每个客户端,您都需要一个到服务器的双向连接。所有输入/输出音频都直接通过服务器。服务器将播放器要接收的所有音频多路复用到单个音频流中,并将其转发

当您进行私人聊天时,服务器只需转发来自与您进行私人聊天的其他玩家的数据包

当使用邻近性时,服务器将来自范围内任何播放器的音频多路复用到单个流中


我假设任何合适的音频编码包都支持多路复用来自多个频道的音频,但我对JSpeex一无所知。

256个流通过服务器传输。x^2流,因为我们需要向每个人分发音频,来自每个人,不包括您自己的音频(回声)。如果我们有办法在返回时“静音”他们自己的音频,我们只需要x个流。这是一种混合型的东西,我们不确定如何处理。这就是我要说的。您不需要每个人都有一个单独的流。您只需要服务器将每个人的输入多路传输到一起。所以每个用户只需要一个输入和一个输出通道。服务器只需要是智能的。它显然不包括任何回声音频。我们计划每个客户端只有一个套接字连接。我们纯粹是在讨论服务器处理中的流。不确定我是否遗漏了什么,但是发送到每个客户机的输出将被多路复用。如果我完全遗漏了什么,我很抱歉。是的,但是每个玩家应该只有一个输出流和一个输入流。服务器应该将音频合并成每个客户端独有的单一流,然后转发。这正是我的观点。也就是说,我们需要分割输入流,并为每个连接的人相应地分配它们。16人连接意味着16进16出,但我们需要创建重复项来创建每个用户的输出流。也就是说,服务器上有x^2个流。如果有一种方法可以在混合前不进行复制,我很乐意找到答案。