audio - 将多个 RTP 流混合成一个流

标签 audio udp rtp

我正在尝试建立一个基于普通 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 流。

我只是不知道该怎么做。

最佳答案

在您的情况下,我知道两种选择:

  • MCU或多点控制单元
  • 或RTP联播

  • 单片机控制单元

    这是获取多个 RTP 流并生成一个或多个 RTP 流的中间盒(网络元素)。

    您可以自己实现它,但这并非易事,因为您需要处理:
  • 流解码(因此您需要实现 jitter buffer 和编解码器)
  • 流混合-因此您需要在流之间进行一些同步(从源 1 和源 2 收集一些数据,混合它们并发送到目标 3)

  • 还有几个项目可以为你做这件事(比如 Asterisk、FreeSWITCH 等),你可以尝试用它们编写一些集成级别。我没有听说过关于 Node.js 的任何消息

    联播

    这是一项相当新的技术,其规范仅在 IETF 草案中可用。这里的核心思想是在一个 RTP 流中同时发送多个 RTP 流。

    当目的地接收到多个 RTP 流时,它需要执行与 MCU 完全相同的操作 - 解码所有流并将它们混合在一起,但在这种情况下,目的地可能会使用硬件音频混音器来做到这一点。

    这种方法的主要缺点是客户端设备的带宽。如果您有 N 个参与者,您需要:
  • 要么将所有 N 个流发送到所有其他
  • 或根据语音事件或音频级别等元数据选择流

  • 第一个效率不高,第二个非常棘手。

    关于audio - 将多个 RTP 流混合成一个流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46711318/

    相关文章:

    javascript - 同时播放两种以上不同的声音时,声音会被削波

    ffmpeg - 如何在不丢失时间信息的情况下将 H264/RTP 流转储到文件中?

    audio - RTP 上的 FFMPEG 音频流

    python:调用 socket.recvfrom() 两次

    video-streaming - 通过 RTP 将 H.264 视频从 Live555 流式传输到 VLC

    android - AudioRecord 和 AudioTrack 延迟

    javascript - 仅使用javascript检查音频文件是否存在

    jQuery 更改值旋钮

    c# - UDP原始数据在应用程序和wireshark中有所不同

    c++ - 弄清楚网络、十六进制和 ascii 如何交互