RTCP中的NTP的时间计算方法

转载 2013年12月02日 14:54:29

原文:http://blog.csdn.net/leesphone/article/details/5572171


记得两年前刚开始做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;
}


live555中的处理

void RTCPInstance::addSR() {
  // ASSERT: fSink != NULL


  enqueueCommonReportPrefix(RTCP_PT_SR, fSink->SSRC(),
   5 /* extra words in a SR */);


  // Now, add the 'sender info' for our sink


  // Insert the NTP and RTP timestamps for the 'wallclock time':
  struct timeval timeNow;
  gettimeofday(&timeNow, NULL);


  printf("mike======>change SR\n"); 
  
  fOutBuf->enqueueWord(timeNow.tv_sec + 0x83AA7E80);
      // NTP timestamp most-significant word (1970 epoch -> 1900 epoch)
  double fractionalPart = (timeNow.tv_usec/15625.0)*0x04000000; // 2^32/10^6
  fOutBuf->enqueueWord((unsigned)(fractionalPart+0.5));
      // NTP timestamp least-significant word
  unsigned rtpTimestamp = fSink->convertToRTPTimestamp(timeNow);
  fOutBuf->enqueueWord(rtpTimestamp); // RTP ts


  // Insert the packet and byte counts:
  fOutBuf->enqueueWord(fSink->packetCount());
  fOutBuf->enqueueWord(fSink->octetCount());


  enqueueCommonReportSuffix();
}


RTCP包中的NTP Time 计算

在RTCP中ntp time存放在8个字节中,分为:MSW和LSW,分别占用4个字节 MSW: 单位是,不过是从1900年1月1日算起,所以使用gettimeofday后需要加上:1900-1970...
  • chinabinlang
  • chinabinlang
  • 2014年10月15日 13:58
  • 3948

RTP 与RTCP 解释. 含同步时间戳

RTP 与RTCP 解释. 含同步时间戳 RTP协议是real-time transport protocol的缩写,被设计来传输流媒体数据,有着广泛的应用,其它相关介绍自己去看RFC,我不...
  • wudebao5220150
  • wudebao5220150
  • 2013年10月31日 20:08
  • 5597

RTCP中的NTP的时间计算方法

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

RTCP中的NTP的时间计算方法

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

RTCP中的NTP的时间计算方法

http://blog.csdn.net/leesphone/article/details/5572171 记得两年前刚开始做RTP/RTCP的时候碰到一个问题,是关于如何计算RTCP...
  • fanbird2008
  • fanbird2008
  • 2012年04月12日 18:20
  • 424

RTCP包中的NTP Time 计算

转载:http://blog.csdn.net/chinabinlang/article/details/40110037     谢谢 关于 RTCP中的NTP Time计算有很多人不清楚,...
  • xiaojun111111
  • xiaojun111111
  • 2016年11月28日 15:11
  • 351

UPS放电时间计算方法

  • 2014年10月18日 08:14
  • 34KB
  • 下载

考虑时间(Thinking Time)的计算方法

来至:gotesting软件测试联盟论坛   http://www.78test.com 在上一篇《为什么要在性能测试中设置考虑时间》中,我们讲了设置考虑时间是为了保证测试环...
  • qingyi0711
  • qingyi0711
  • 2012年01月31日 11:57
  • 232

单缓冲 vs 双缓冲 处理数据时间计算方法

对于单缓冲:假定从磁盘把一块数据输入到缓冲区的时间为T,操作系统将该缓冲区中的数据传送到用户区的时间为M,而CPU对这一块数据处理的时间为 C。由于T和C是可以并行的,当T>C时,系统对每一块数据的处...
  • hyqsong
  • hyqsong
  • 2016年06月28日 07:07
  • 2351

js javascript 获取各种时间计算方法

setDate: { /*** * 获得当前时间 */ getCurrentDate: function () { var CurrentDate ...
  • huxianguan1
  • huxianguan1
  • 2017年11月17日 17:32
  • 68
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RTCP中的NTP的时间计算方法
举报原因:
原因补充:

(最多只允许输入30个字)