合并两个 WebRTC 对等点时是否可以同步音频?

Is it possible synchronize audio when combining two WebRTC peers?

我正在开发一个 WebRTC 应用程序,正好有 2 位音乐家合作进行现场表演,并将组合的音频流式传输给第三方。由于不可能让两位音乐家完美同步地听到对方的声音,我的方法是:

A ----> B    (host streams to guest over WebRTC)
 \     /
  \   /
   ┙ ┕
    C        ("host" and "guest" streams merged using Web Audio API)

我相信为 C 实现完美的音频同步应该是可能的(例如,不违反物理定律)。出于本申请的目的,"perfect synchronization" 表示听众 C 应该听到 B 听到的在时间 TB 在时间 T.

播放 同时进行

我试过两种方法,都没有成功:

是否有已知方法可以通过这种方式与 WebRTC 同步音频?是获取正确的 WebRTC 统计信息的问题,还是我的方法完全偏离了?

解决方案B合并音频,延迟来自延迟浏览器=>环境和环境=>浏览器:由于B在环境中听和播放,所以两个流将在环境中同步,因此在 B 的浏览器中将上述两个延迟的总和关闭。这种影响的大小取决于 B 的硬件、操作系统和浏览器;没有办法衡量这一点。有可用于此测量的工具,例如 jack-delay(https://sources.debian.org/src/jack-delay/0.4.2-1/README/), but these do not work in the browser. Since you are in the WebRTC setting, I think something similar to frontend/crosscorrelation.js in https://github.com/ntgiwsvp/looper 是您的选择。

对于解决方案 A 合并音频(并且类似地对于 C 合并音频),我知道只有一个经过验证的解决方案到目前为止的问题,不幸的是有点hack:

  • 向音轨添加额外的声道 1。
  • A 向通道 0 提交其性能,向通道 1 提交周期性同步信号
  • B 通过她的往返延迟浏览器 <=> 环境延迟频道 1,如上所述。 B 的输出流由她在通道 0 中的录音和通道 1 中的延迟同步信号组成。
  • 一旦有人,比如 C,同时收到 A 和 B 的流,他们可以使用通道 A1 和 B1 通过适当的延迟同步流,然后播放通道 A0 和 B0。

在上述存储库的 frontend/client.js 文件中,您需要的大部分内容都有一个有效的实现。 (您的设置略有不同,但适用相同的概念。)