我正在尝试建立一个基于普通 RTP 的基本电话 session 系统。
_____
RTP IN #1 ______ | | _______ MIX RTP receiver #1
|______| MIX |_____|
______| | RTP | |_______ MIX RTP receiver #2
RTP IN #2 |_____|
我正在通过 AudioStream 在 Android 上创建 RTP 流类并使用用 Node.js 编写的服务器来接收它们。
我一直在使用的天真的方法是服务器接收 UDP 数据包并将它们转发给对话的参与者。只要有两个参与者,这就会完美地工作,并且基本上就像两个参与者将他们的 RTP 流发送给对方一样。
我希望这可以与多个参与者一起使用,但是在 RDP 数据包到达服务器时转发它们似乎不起作用,可能是出于明显的原因。对于两个以上的参与者,将来自不同来源的数据包传递给每个参与者(不包括此类数据包的发送者)的结果会导致音频完全中断。
在不改变网络拓扑(星形而不是网状)的情况下,我假设服务器需要对数据包执行一些操作,以便提取包含混合输入 RTP 流的唯一输出 RTP 流。
我只是不知道该怎么做。
最佳答案
在您的情况下,我知道两种选择:
单片机控制单元
这是获取多个 RTP 流并生成一个或多个 RTP 流的中间盒(网络元素)。
您可以自己实现它,但这并非易事,因为您需要处理:
还有几个项目可以为你做这件事(比如 Asterisk、FreeSWITCH 等),你可以尝试用它们编写一些集成级别。我没有听说过关于 Node.js 的任何消息
联播
这是一项相当新的技术,其规范仅在 IETF 草案中可用。这里的核心思想是在一个 RTP 流中同时发送多个 RTP 流。
当目的地接收到多个 RTP 流时,它需要执行与 MCU 完全相同的操作 - 解码所有流并将它们混合在一起,但在这种情况下,目的地可能会使用硬件音频混音器来做到这一点。
这种方法的主要缺点是客户端设备的带宽。如果您有 N 个参与者,您需要:
第一个效率不高,第二个非常棘手。
关于audio - 将多个 RTP 流混合成一个流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46711318/