3

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

  • 一旦对等点连接,跟踪RTCPeerConnection.iceConnectionState,我就在 JS 对等点上启动秒表;
  • 一旦第一个webrtc::VideoFrame到达本地对等点,我就存储帧时间垃圾;
  • 在 Native peer 上,我使用第一帧时间戳来计算相对时间,类似于秒表允许我在 JS peer 上使用的方式。

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

4

1 回答 1

1

该设计可以通过在 NTP发送方时间向接收方发送同步事件时间戳来正确实现。然后,接收方必须能够估计帧上的发送方 NTP 时间戳,并将其与同步事件的时间戳进行比较。存在启用此方法的概念验证补丁,并已在此跟踪问题中推送到本机 WebRTC 项目。更多细节将在稍后公布。

于 2019-02-16T17:31:22.950 回答