RTP
包中的时间戳字段是说明数据包时间的同步信息,是数据能以正确的时间顺序恢复的关键。时间戳的值给出了分组中数据的第一个字节的采样时间。为了计算各个数据流的播放时间以及同步处理,仅有RTP
包中的时间戳信息是不够的。
在整个播放过程中,包括这样几种时间:
RTP
包中的rtptime
PLAY
请求的Response
中的rtp time
和npt
RTCP
的SR
(Sender Report
)中的rtp
和ntp
时间戳对
一、时间戳映射关系
首先介绍PLAY
请求的Response
里的两个域:
(1)npt
npt
顾名思义Normal PLay Time
,正常播放时间,指出了流相对与播放开始时的绝对位置。播放开始时的之间定义为0.0s
。这个特殊的常量now
被定义为现场事件的当前时刻。"now
"常数允许客户端请求接收实时反馈而不是存储或者延时的版本。因为对于这种情况而言,既没有绝对时间,也没有0
时间,所以需要该参数。
(2)rtptime
rtptime
是发送PLAY
请求后将收到的第一个RTP
包的时间戳值。
npt
和rtptime
的区别在于npt
是影片开始的相对时间,而rtptime
是会话开始的相对时间。因此在client
端,需要对这两者进行map
处理。
在client
端计算播放时间戳的公式如下:
1 |
nptUs = (current_rtpTime - start_rtptime) / scale + srart_npt |
其中:
start_rtptime
与start_npt
分别是PLAY
请求的Response
中的rtptime
和npt
。
current_rtpTime
是当前收到的RTP
包头中的rtptime
。
scale
为PLAY
请求的Response
中的scale
值。在正常播放的情况下为1
,快速播放时大于1
,当处于反向扫描模式时小于-1
.
二、媒体间同步方法(不同设备的同步)
上面的处理仅仅实现了媒体内的同步,在实现媒体间同步时,还需要进行其他的处理工作。这就需要用到RTCP
的SR
(Sender Report
)。在SR
中包含一个<rtp
,ntp
>时间戳对,通过这个时间戳对可以将音频和视频准确的定位到一个绝对时间轴上。
<rtp
,ntp
>时间戳对的必要性在于不同流的RTP
时间戳有不同的随机偏移量,因此无法直接进行同步。
<rtp
,ntp
>中的ntp
是网络时间协议格式表示的绝对时间值。
<rtp
,ntp
>中的RTP
与数据包中的RTP
时间戳具有相同的单位和偏移量,但在大多数情况下此时间戳不等于任何临近的RTP
包中的时间戳。
根据不同stream
中的<rtp
,ntp
>时间戳对,可以将一个stream
中的时间戳值映射为另一个stream
的时间戳值,从而实现媒体间的同步。