【问题标题】:Is it possible synchronize audio when combining two WebRTC peers?组合两个 WebRTC 对等点时是否可以同步音频?
【发布时间】:2020-07-19 04:49:33
【问题描述】:

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

  • 音乐家 A 是主持人,并按照他们认为合适的方式表演
  • 音乐家 B 是嘉宾,他会听到主持人的音频,然后根据他们从远程流中听到的内容及时演奏
  • 使用 Web Audio API,AB 的音频流被合并,并且这个合并的音频被共享到一个新的流上给听众C
A ----> B    (host streams to guest over WebRTC)
 \     /
  \   /
   ┙ ┕
    C        ("host" and "guest" streams merged using Web Audio API)

我相信为 C 获得完美的音频同步应该是可能的(例如,不违反物理定律)。就本应用而言,“完美同步”意味着侦听器 C 应该在时间 T 同时听到 B 听到 的内容以及 B 播放时间T

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

  • B 合并音频。 由于 B 的性能已经出现“同步”,我认为他们的合并流也可能是同步的。但是,输出仍然包含延迟。我从 B 的本地 MediaStream 接收数据到该数据完成合并流的处理之间的时间来猜测。

  • A 合并音频。 在这种方法中,主机 A 接收对等体 B 的音频并尝试通过在合并之前通过延迟节点传递 A 的本地音频来解决两个流之间的时间差。我使用 WebRTC Statistics API 来尝试 STUN 往返时间、抖动缓冲区延迟和 MediaStream 延迟估计等值,但似乎没有任何组合可以提供完美的延迟偏移。

是否有一种已知的方法可以以这种方式与 WebRTC 同步音频?是获得正确的 WebRTC 统计数据的问题,还是我的方法完全关闭?

【问题讨论】:

  • 我不知道如何使用 WebRTC 做到这一点,但底层技术 (RTP) 使这成为可能! webrtc.googlesource.com/src/+/refs/heads/master/docs/… 在数据包上放置一个全局时间戳,因此您可以同步。我不知道你如何在浏览器中同步。也许您可以将它们发送到音频混合它们的后端服务器?
  • 非常有用的指针 - 谢谢!到目前为止,我已经设法与 RTP 保持了一个抽象级别,但这是一个有用的新方向。还有一个节点服务器已经在促进对等协商,所以如果这是唯一的选择,我可以选择服务器端同步。

标签: audio streaming webrtc web-audio-api live-streaming


【解决方案1】:

对于解决方案B合并音频,延迟来自延迟浏览器=>环境和环境=>浏览器:由于B在环境中监听和播放,所以两个流会在环境,所以B的浏览器中的上述两个延迟的总和。这种影响的大小取决于 B 的硬件、操作系统和浏览器;没有办法衡量这一点。有一些工具可用于此测量,例如 jack-delay (https://sources.debian.org/src/jack-delay/0.4.2-1/README/),但这些工具在浏览器中不起作用。由于您处于 WebRTC 设置中,我认为类似于 https://github.com/ntgiwsvp/looper 中的 frontend/crosscorrelation.js 是您的选择。

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

  • 向音轨添加额外的通道 1。
  • A 将其性能提交给通道 0,并将周期性同步信号提交给通道 1
  • B 通过她的往返延迟浏览器 环境延迟通道 1,如上所述。 B 的输出流包括她在通道 0 中的记录和通道 1 中的延迟同步信号。
  • 一旦有人(例如 C)同时接收到 A 和 B 的流,他们可以使用通道 A1 和 B1 通过适当的延迟来同步流,然后播放通道 A0 和 B0。

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

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2020-10-25
    • 2015-07-18
    • 2018-06-07
    • 2022-07-30
    • 2021-12-29
    • 2019-03-16
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多