它遵循我试图以正确方式实现的设计:我有一个 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.h
,VideoFrame::ntp_time_ms()
已弃用,实际上总是返回-1
。我应该怎么做才能在两个对等点之间完成这种同步?