如何使用 RTCP 的 RTP 时间和 NTP 时间计算 RTP 数据包的延迟

how to calculate Delay in RTP packets using RTP time and NTP time from RTCP

我正在使用 webrtc 将视频流从浏览器发送到 gstreamer。我可以从 gstreamer 中的 RTCP SR 数据包中获取数据包的 RTP 时间和 NTP 时间。在接收方 在接收方我想计算自发送方创建该数据包以来经过的时间。

我目前正在计算延迟为

delay = 包发送时间-包接收时间

(所有客户端的 NTP 时间不同)

时差=(接收方NTP - 发送方NTP)

我正在将每个 RTP 数据包的 RTP 时间转换为 NTP 值

90000 是时钟频率

数据包的发送时间=(RTP数据包中的RTP时间)-RTCP数据包中的RTP时间))/90000)*1000000000+RTCP中的NTP(将值转换为ns)

延迟=(以ns为单位的接收方NTP-时间差)-以ns为单位的数据包发送时间(以NTP值为单位)

延迟在本地网络中显示大约 12046392 纳秒我不认为它是正确的我在计算中做错了什么。

RTCP SR 可以帮助将 RTP(相对于采样时钟)时间戳映射到 NTP(全局绝对 - 挂钟)时间戳。

不确定“在发件人处...计算自该数据包在发件人处创建以来经过的时间”的确切含义。

如果您有兴趣计算其中两个 RTP 时间戳之间的时间差(以秒为单位),您需要知道生成它们的 media/sample 时钟速率。您可以通过与 RTCP SR NTP 时间戳相关联来导出此时钟速率,但您至少需要其中两个。

如果您想知道自发送方创建 RTCP SR 以来经过了多少时间,只需计算当前时间与接收到的 NTP 时间戳之间的差异。 RTCP SR NTP 时间戳实际上是创建数据包的当前时间。

附加到 RTCP SR 数据包内的 NTP 的 RTP 时间戳是插入的当前 media/sample 时钟时间。通过这种关系,我们可以计算每个 RTP 时间戳的绝对墙时间,但至少不知道媒体时钟速率(e.b。通过从 RTCP SR 数据包导出它,或者作为播放器从一些媒体头中读取它显然需要知道媒体时钟速率才能获得正确的播放速度。

长话短说: 无法计算,因为缺少关键信息。

编辑: 你的计算对我来说很好。我假设一个 RTP 数据包包含多个媒体样本。 RTP 时间戳引用数据包中第一个样本的第一个字节的时间。所以数据包离开发送方的时间应该接近RTP_to_NTP_timestamp_in_seconds + ( number_of_samples_in_packet / clock )。我猜一个数据包中的媒体数据加起来可能长达几毫秒。也许 number_of_samples_in_packet / clock 大约是 12 毫秒?我猜两个 RTP 数据包之间的时间也接近 12 毫秒。

编辑2: 来自 RFC4587:If a video image occupies more than one packet, the timestamp SHALL be the same on all of those packets. 这也可能影响您的计算。但我想应该是次要的。