RTP时间映射及同步

RTP包中的时间戳字段是说明数据包时间的同步信息,是数据能以正确的时间顺序恢复的关键。时间戳的值给出了分组中数据的第一个字节的采样时间。为了计算各个数据流的播放时间以及同步处理,仅有RTP包中的时间戳信息是不够的。
在整个播放过程中,包括这样几种时间:

  1. RTP包中的rtptime
  2. PLAY请求的Response中的rtp timenpt
  3. RTCPSR(Sender Report)中的rtpntp时间戳对

一、时间戳映射关系

首先介绍PLAY请求的Response里的两个域:
(1)npt
npt顾名思义Normal PLay Time,正常播放时间,指出了流相对与播放开始时的绝对位置。播放开始时的之间定义为0.0s。这个特殊的常量now被定义为现场事件的当前时刻。"now"常数允许客户端请求接收实时反馈而不是存储或者延时的版本。因为对于这种情况而言,既没有绝对时间,也没有0时间,所以需要该参数。
(2)rtptime
rtptime是发送PLAY请求后将收到的第一个RTP包的时间戳值。
nptrtptime的区别在于npt是影片开始的相对时间,而rtptime是会话开始的相对时间。因此在client端,需要对这两者进行map处理。
client端计算播放时间戳的公式如下:

nptUs = (current_rtpTime - start_rtptime) / scale + srart_npt

其中:
start_rtptimestart_npt分别是PLAY请求的Response中的rtptimenpt
current_rtpTime是当前收到的RTP包头中的rtptime
scalePLAY请求的Response中的scale值。在正常播放的情况下为1,快速播放时大于1,当处于反向扫描模式时小于-1.

二、媒体间同步方法(不同设备的同步)

上面的处理仅仅实现了媒体内的同步,在实现媒体间同步时,还需要进行其他的处理工作。这就需要用到RTCPSR(Sender Report)。在SR中包含一个<rtpntp>时间戳对,通过这个时间戳对可以将音频和视频准确的定位到一个绝对时间轴上。
<rtpntp>时间戳对的必要性在于不同流的RTP时间戳有不同的随机偏移量,因此无法直接进行同步。
<rtpntp>中的ntp是网络时间协议格式表示的绝对时间值。
<rtpntp>中的RTP与数据包中的RTP时间戳具有相同的单位和偏移量,但在大多数情况下此时间戳不等于任何临近的RTP包中的时间戳。
根据不同stream中的<rtpntp>时间戳对,可以将一个stream中的时间戳值映射为另一个stream的时间戳值,从而实现媒体间的同步。

参考链接


RTP时间映射及同步