从 WebRTC 访问 RTP 时间戳

Kar*_*tal 5 javascript rtp webrtc

我目前正在开发一个 WebRTC 项目。我们使用 Janus Gateway 进行 WebRTC 服务器端记录/收发等。

对于与画布相关的同步,我需要访问接收到的视频轨道的 RTP 时间戳。一段时间以来,我一直在广泛寻找一种方法。

我尝试过对等连接的 getStats 函数,但统计数据的时间戳是获取时间。不是数据包时间戳。

另外,W3的标准中明确指出:

DOMHighResTimeStamp [HIGHRES-TIME] 类型的时间戳,指示包含源的 RTP 数据包的最近播放时间。时间戳定义在[HIGHRES-TIME]中,对应于本地时钟。

getContributingSources()可以通过对象的函数访问它RTCRtpReceiver。但我注意到,该函数返回一个空数组。

重现:

https://webrtc.github.io/samples/src/content/peerconnection/pc1/

“开始”“呼叫”后,应显示相机源和对等连接。之后打开控制台并写入:

const receivers = pc2.getReceivers();
receivers.forEach(receiver => {
    console.log(receiver.getContributingSources());
});
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何访问收到的 RTP 数据包的时间戳?或者最后接收到的视频 RTP 时间戳?

提前致谢。

cez*_*tko 4

编辑:Chrome 从版本76开始支持标准化统计数据。

您无法访问单个帧时间戳(至少在 javascript 中不行),但inbound-rtp统计信息似乎绝对是您要搜索的内容。该接口RTCInboundRtpStreamStats定义lastPacketReceivedTimestamp为:

DOMHighResTimeStamp 类型的lastPacketReceivedTimestamp 表示此 SSRC 收到最后一个数据包的时间戳。这与时间戳不同,时间戳表示本地端点生成统计信息的时间。

所有现代浏览器(Chrome、Firefox、safari、Edge)似乎都提供一些inbound-rtp统计支持。验证它们是否已经为 提供了有意义的值lastPacketReceivedTimestamp注意:该规格似乎是最近的,您的里程可能会有所不同。这是一些代码:

    rtcpeer.getReceivers()[0].getStats().then(function(stats)
    {
        for (let stat of stats.values())
        {
          if (stat.type === "inbound-rtp")
            console.log(stat.lastPacketReceivedTimestamp);
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我这样做了。rtp时间戳可以通过RTCRtpReceiver.getSynchronizationSources获取。请参阅https://github.com/w3c/webrtc-stats/issues/229#issuecomment-525223463 (5认同)