一、NTP详解
NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。在Webrtc中可以理解为绝对时间。NTP时间戳是从1900年1月1日经历的秒数,一般用64位表示,高32位是从1900 年1 月1 日0 时开始到现在的以秒为单位的整数部分,低32 位是此时间的小数部分。
NTP时间在webrtc中是rtt计算的基础。在前期文章实时传输控制协议RTCP-SR(三)和实时传输控制协议RTCP-RR(四)中last SR (LSR)是压缩过的NTP时间戳。last SR (LSR): 32 bits。64位NTP时间戳中间的32bit(一般为了紧凑,取中间32bits表示即可,这时整数与小数分别16bits表示)。64位ntp时间戳转为32位的ntp时间戳:
图1 - 64位ntp时间戳转为32位的ntp时间戳
二、RTP时间戳详解
时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了使时间戳单位更为精准。时间戳增加一并不是我们通常意义上地过了一个秒/微秒,而是增加了一个采样间隔那么长的时间。举个例子来说。不同的采集有不同的采样频率,比如一般的音频是8K的采样频率,也就是一秒采集8000次数据,也就是每次采样间隔是1/8MS,而timestamp增加1也就意味着增加了一个采样间隔。也就是过了1/8MS。换个例子,如果另一种编码的采样频率是16K,那么timestamp增加1也就意味着系统过了1/16MS。也就是说,在同一个系统中,对不同编码,虽然使用同一个时钟,但timestamp的增长速度是不同的,在这个例子中,采样频率是16K的编码要比8K的快两倍。
RTP包头的第2个32Bit即为RTP包的时间戳,TimeStamp ,占32位;时间戳反映了RTP分组中的数据的第一个字节的采样时刻。在一次会话开始时的时间戳初值也是随机选择的。即使是没有信号发送时,时间戳的数值也要随着时间变化不断地增加。 在RTP协议中并没有规定时间戳的粒度,这取决于有效载荷的类型。例如,对于8kHz采样的音频数据,若每隔20ms构成一个数据块,则一个数据块中包含有160个样本(0.02×8000=160)。因此每发送一个RTP分 组,其时间戳的值就增加160。作用如下:
①时间戳就是一个值,用来反映某个数据块的产生(采集)时间点的,后采集的数据块的时间戳肯定是大于先采集的数据块的。有了这样一个时间戳,就可以标记数据块的先后顺序。
②接收端使用时间戳可准确知道应当在什么时间还原哪一个数据块,从而消除传输中的抖动。
③时间戳还可用来使视频应用中声音和图像同步。
举例说明:如果采样频率为90000Hz,则由上面讨论可知,时间戳单位为1/90000,我们就假设1s钟被划分了90000个时间块,那么,如果每秒发送25 帧,那么,每一个帧的发送占多少个时间块呢?当然是 90000/25 = 3600。因此,我们根据定义“时间戳增量是发送第二个RTP包相距发送第一个RTP包时的时间间隔”,故时间戳增量应该为3600。(在后期文章介绍H264三种封包格式中时间戳的应用)
请继续本人的系列作品!欢迎讨论!!!