(VLC中)RTCP中的NTP的时间计算方法
来源:互联网 发布:gta5驾驶优化mod 编辑:程序博客网 时间:2024/04/30 15:22
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;
}
- (VLC中)RTCP中的NTP的时间计算方法
- RTCP中的NTP的时间计算方法
- RTCP中的NTP的时间计算方法
- RTCP中的NTP的时间计算方法
- RTCP中的NTP的时间计算方法
- RTCP中的NTP的时间计算方法
- RTCP中的NTP的时间计算方法
- RTCP中的NTP的时间计算方法
- RTCP中的NTP的时间计算方法
- RTCP包中的NTP Time
- RTCP包中的NTP Time 计算
- RTCP包中的NTP Time 计算
- RTP/RTCP协议的补充(RTCP发送时间间隔)
- RTP/RTCP协议的补充(RTCP发送时间间隔)
- 性能测试中考虑时间(Thinking Time)的计算方法
- MATLAB中程序运行时间的计算方法
- Android中时间、日期的计算方法
- 计算机NTP时钟同步(NTP服务器-NTP时间服务器)的重要性及其配置方法
- C/C++开发语言系列之25---不能声明为虚函数的函数
- C++中typename关键字的使用方法和注意事项
- xcode : could not load inserted library: /usr/lib/libgmalloc.dylib
- iOS 6.0开发框架及功能更新小结
- 前端常见面试题【JS】
- (VLC中)RTCP中的NTP的时间计算方法
- Python安装天文应用包
- 求四个数的最大公约数
- RakNet linux编译
- 按键精灵高级脚本
- Poi 操作excel样式
- EABI和OABI
- 改善6410 触摸屏驱动(作者gooogleman) 改善641
- Keil C 与 汇编 联用 一些记录与注意事项