【发布时间】:2020-07-19 04:49:33
【问题描述】:
我正在开发一个 WebRTC 应用程序,其中正好有 2 位音乐家协作进行现场表演,并将组合的音频流式传输给第三方。由于不可能让两个音乐家以完美的同步听到对方,我的方法是:
- 音乐家 A 是主持人,并按照他们认为合适的方式表演
- 音乐家 B 是嘉宾,他会听到主持人的音频,然后根据他们从远程流中听到的内容及时演奏
- 使用 Web Audio API,A 和 B 的音频流被合并,并且这个合并的音频被共享到一个新的流上给听众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