如何混合多个PCM音频包(语音流)

时间:2020-10-30 20:24:20

标签: java android audio

我正在为游戏开发Java语音聊天,当几个玩家同时讲话时,我的音频混音有问题。音频仅发送到附近的播放器,因此我将每个用户的缓冲区分别存储在客户端上,并将ID和语音数据包一起发送到服务器上。要收听,我要遍历用户列表并检查现有用户的缓冲区以重现它们。但是,我在混合音频时遇到问题,可能是混合错误。我应该如何混合这些音频包?音频是16位PCM。当几个玩家一起聊天时,这些音频中有很多杂音/嘶嘶声,因此音频几乎听不到。

适用于此混音器的正确算法是什么?

1 个答案:

答案 0 :(得分:0)

基于我对话筒输入的有限经验,我的出发点是尝试以下步骤:

  1. 将16位字节转换为PCM
  2. (考虑对PCM应用低通滤波器,并可能增加音量)
  3. 将要混合的每一行的PCM值相加
  4. 将PCM转换回字节

根据您的描述,我无法确定您是否正确地执行了步骤1。

可能需要进一步研究的地方是jitsi.org。他们的服务是用Java编写的,并且是开源的。知道他们如何处理这件事将很有趣。但是在我看来,最平常的事情是在任何一次都只选择并播放一条线。对此限制可能有充分的理由。但是我不知道这是否是技术性的(例如,噪音以淹没声音的方式积累)还是仅仅是人们同时讲话很容易造成混乱。我认为可能还有回声/反馈注意事项。我将期待看到其他人可以为此提供哪些信息。