WebRTC:在 JavaScript 和本机代码对等方之间同步视频帧

WebRTC: Synchronize video frames between JavaScript and Native Code peers

它遵循我试图以正确方式实现的设计:我有一个 JavaScript 对等端正在向 Native Code 对等端发送视频轨道。在传输过程中的某个时刻(实际上是在连接建立后立即,但它可能在任何时候)我想在 JS 对等端启动一个秒表并执行一些临时操作,实际上是在 canvas 上进行一些渲染覆盖视频播放。在本机对等方,我希望能够在秒表在 JS 对等方启动的那一刻同步,并只考虑在该时刻之后记录的接收帧,执行其他类型的处理。我现在在做什么(脆弱且有限的解决方案):

这种设计是有局限性的,因为我可能想在任何时刻同步,而不仅仅是建立对等连接,而且还很脆弱,因为我认为 WebRTC 协议可以出于任何原因丢弃最先收到的帧(延迟或传输错误)。理想情况下,我想在 JS 对等点中选择的同步点获取时间戳,将其发送到本机对等点并能够比较 webrtc::VideoFrame 时间戳。我无法天真地做到这一点,因为 VideoFrame::timestamp_us() 显然有一些我不知道的偏差。我也无法解释 VideoFrame::timestamp()api/video/video_frame.h 中的文档很少,VideoFrame::ntp_time_ms() 已弃用,实际上总是 return -1。我应该怎么做才能在两个对等点之间完成这种同步?

通过将 NTP 发送方 时间的同步事件时间戳发送给接收方,可以正确实现该设计。然后接收方必须能够估计帧上的发送方 NTP 时间戳,并将其与同步事件的时间戳进行比较。存在启用此方法的概念验证补丁,并已推送到此跟踪中的 Native WebRTC 项目 issue。稍后会提供更多详细信息。