我目前正在开展WebRTC项目。我们使用Janus Gateway进行WebRTC服务器端录制/收发等。
对于与画布相关的同步,我需要访问接收到的视频轨道的RTP时间戳。我一直在寻找一种广泛的方法。
我尝试过对等连接的getStats函数,但统计信息的时间戳是获取时间。不是数据包时间戳。
此外,在W3的标准中,它具体说明:
DOMHighResTimeStamp [HIGHRES-TIME]类型的时间戳,表示 播放包含该RTP数据包的RTP数据包的最近时间 资源。时间戳在[HIGHRES-TIME]中定义,对应于 当地时钟。
可以通过getContributingSources()
对象的RTCRtpReceiver
函数访问。但我注意到,该函数返回一个空数组。
重现:
https://webrtc.github.io/samples/src/content/peerconnection/pc1/
按开始和呼叫后,您的相机Feed将显示对等连接。 之后打开控制台并写下:
const receivers = pc2.getReceivers();
receivers.forEach(receiver => {
console.log(receiver.getContributingSources());
});
我的问题是,如何访问收到的RTP数据包的时间戳?或者最后收到的视频RTP时间戳?
提前致谢。
答案 0 :(得分:1)
您无法访问各个帧的时间戳(至少不是在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);
}
});