RTCP中的NTP的时间计算方法

记得两年前刚开始做RTP/RTCP的时候碰到一个问题,是关于如何计算RTCP中的NTP时间戳,最近又有人问这个问题,于是就想把它贴出来,让大家参考,提提建议,交流促进进步。

 

记得当时有个客户说用openRTSP(open source ,you can get it from www.live555.com)无法录制我们送出去的RTP流,于是我也去下了一个,试了发现果然不行,于是就把openRTSP的source code捞出来看看,最后发现它必须要收到RTCP包后才开始录制视频,于是我就加了RTCP,结果发现视频录制是没问题,但用VLC播放的时候老是抖动,于是回后去找原因,一个排下来,最后focus到NTP时间戳上来了。

 

NTP的时间戳有MSW和LSW组成, MSW好算,以秒为单位,LSW就头痛了,查了RTP的文档,讲得很模糊,NTP(RFC1305)中只讲单位大约是200 picoseconds,但我试了用200 picoseconds为单位不行,还是闪。

 

没办法了,之后去研究Darwin Streaming Server,看看人家是怎么做了,抓了包,找了好几个RTCP的点,画了个数轴,因为抓包工具wireshark会显示NTP时间(如下图),于是我就倒过去算,最后算出来单位大约是232 picoseconds, 把这个值代入到我的source code中,果然不闪了。

 

 

 

问题虽然解决了,但心里一直有个结,就是一直不知道232这个值是怎么来的,纠结啊。 只好回去再看RFC1305, 它只说单位大约是200 picoseconds, 而1 second = 1,000,000,000,000 picoseconds, 这个值貌似有点大啊,而232=4294967296,很明显用32bits无法精确到1 picoseconds, 于是我就想到不能精确到1 picoseconds, 那也应该尽力而为之吧,于是自然就有了把1,000,000,000,000 picoseconds劈成232份:

1,000,000,000,000/4294967296 = 232.83064365386962890625

That's it!!

 

现在想想其实有更快捷的方法,直接看VLC的source code就可以了:


/**
 * @return NTP 64-bits timestamp in host byte order.
 */
uint64_t NTPtime64 (void)
{
    struct timespec ts;
#if defined (CLOCK_REALTIME)
    clock_gettime (CLOCK_REALTIME, &ts);
#else
    {
        struct timeval tv;
        gettimeofday (&tv, NULL);
        ts.tv_sec = tv.tv_sec;
        ts.tv_nsec = tv.tv_usec * 1000;
    }
#endif

    /* Convert nanoseconds to 32-bits fraction (232 picosecond units) */
    uint64_t t = (uint64_t)(ts.tv_nsec) << 32;
    t /= 1000000000;


    /* There is 70 years (incl. 17 leap ones) offset to the Unix Epoch.
     * No leap seconds during that period since they were not invented yet.
     */
    assert (t < 0x100000000);
    t |= ((70LL * 365 + 17) * 24 * 60 * 60 + ts.tv_sec) << 32;
    return t;
}

### 回答1: RTCP(Real-time Transport Control Protocol)是一种实时传输控制协议,它用于控制多媒体会话的质量和带宽。抖动(Jitter)是指信号传输时由于网络延迟、拥塞等原因造成的数据包时序偏移的现象,使得信号的失真度增加。 在RTCP,抖动的计算方法如下:首先,接收端收到的每个数据包的时间计算与前一个数据包接收的时间戳之差,得到每个数据包的延迟。然后,将所有数据包的延迟相加,并将其除以数据包数量,得到平均延迟。接下来,计算每个数据包与平均延迟之间的差值,得出每个数据包的抖动。最后,将所有数据包的抖动值相加,并将其除以数据包数量,得到平均抖动值。 RTCP所计算的抖动值可以用来评估网络的稳定性和网络资源的利用情况,以及改善多媒体传输的质量。在应用层面,可以利用抖动值来动态调整各种参数,如带宽、编码率、视频分辨率等,以优化多媒体传输的效果。 ### 回答2: RTCP是一种控制协议,主要用于实时音视频传输的流量控制和质量监测。在RTCP抖动指的是连续 RTP 包之间在接收端播放时间的差异,如果间隔时间不同,可能会引起播放的章节变化、音频或视频的卡顿,影响用户体验。 计算抖动的方法是,对于每个 RTP 包,接收端都会记录其到达时间(Timestamp),并根据前后两个 RTP 包到达时间的差异计算出每个 RTP 包的抖动值。抖动计算公式如下: J(i) = J(i-1)+( |D(i-1,i)| - J(i-1)/16) 其,i表示当前 RTP 包的序号,D(i-1,i)表示前一个RTP包和当前RTP包的时间差值,J(i)表示前i个RTP包的抖动值。 需要注意的是,抖动值的单位与 RTP包的时间戳 (Timestamp)的单位保持一致,一般为毫秒(ms)。抖动值的大小越小,说明 RTP 包之间的时间间隔越稳定,对于实时音视频的传输来说越好。抖动值的阈值通常设置为 30 ms 左右,当抖动值超过该阈值时,接收端通常会采取一些措施,如重新协商带宽,调整编码参数等,以更好地适应当前的网络传输环境。 ### 回答3: RTCP (Real-time Transport Control Protocol) 是一种用于协调和管理实时多媒体会话的协议。它提供了流量控制、网络质量反馈等重要功能。其,抖动(jitter)是一项重要的网络质量指标,衡量了包到达时间的变化。 RTCP 使用一种叫做 RTP 原始时间戳进行抖动的计算。抖动可以通过以下步骤计算: 1. 在接收者端,通过接收到的 RTP 报头时间戳,计算出间隔时间。每次接收到新的 RTP 报文,就记录下这个报文的接收时间和 RTP 报头时间戳。 2. 根据所记录的相邻两个 RTP 报文的间隔时间(相对时间戳)计算出相邻两个报文的抖动值。这个抖动值可以通过下列公式来计算: ``` jitter = jitter + (difference - jitter) / 16 ``` 其,difference 是两个 RTP 报文的间隔时间,jitter 表示一段时间内的累计抖动值。 3. 对于抖动值,需要进行限制和平滑处理。这个过程首先将抖动值限制在最小值和最大值之间。然后,通过加权平均的方法,对抖动值进行平滑处理,以使其更加稳定。 通过 RTCP 对抖动进行计算和反馈,可以帮助实时多媒体应用实现更好的网络质量控制和优化。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值