关于RTP中的时间戳问题

转载 2013年12月05日 10:59:50
 
      在使用JRTPLIB的发送数据的时候需要设置时间戳单位(timestamp)和时间戳增量(timestamp increment)。看了网上一些文章,细细想来现在才想通这个问题。   
         RFC3550对时间戳的描述是:
 

        时间戳(timestamp) 32比特 时间戳反映了RTP数据包中第一个字节的采样时间。(采样时钟必须来源于一个及时的单调、线性递增时钟,以便允许同步和去除网络引起的数据包抖动(见章节6.4.1)。该时钟的分辨率必须满足理想的同步精度和测量数据包到来时的抖动的需要(一种典型的时钟分辨率不满足情况是每个视频帧仅一个时钟周期)时钟频率依赖于负载数据的格式,并在描述文件(profile)中或者是在负载格式描述中(payload format speci_cation)进行静态描述。也可以通过非RTP方法(non-RTP means)对负载格式动态描述。

       如果RTP包是周期性产生的,那么将使用由采样时钟决定的名义上的采样时刻,而不是读取系统时间。例如,对一个固定速率的音频,采样时钟(时间戳时钟)将在每个周期内增加1。如果一个音频从输入设备中读取含有160个采样周期的块,那么对每个块,时间戳的值增加160,而不考虑该块是否用一个包传递或是被丢弃。

        时间戳的初始值应当是随机的,就像序号一样。几个连续的RTP包如果(逻辑上)是同时产生的,如:属于同一个视频帧的RTP包,将有相同的序列号。如果数据并不是以它采样的顺序进行传输,那么连续的RTP包可以包含不是单调递增(或递减)的时间戳(RTP包的序列号仍然是单调变化的)。

  
根据一些文章我自己推敲了一下几个概念如下:   
       时间戳单位:时间戳计算的单位不为秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000HZ,那么我们可以把时间戳单位设为1/8000。
       时间戳增量:相邻两个RTP包之间的时间差(以时间戳单位为基准)。
 
       如何设定时间戳之间的增量呢?
       按照刚才时间戳单位来看,1秒钟按照时间戳单位就是8000,那么一秒钟如果可以播放20帧,也就是发送30帧(帧率),那么可以求出相邻两帧之间的时间差,也就是时间戳增量,那么显而易见是用8000/20,那么这个时间戳增量就为400.
       网上大多数列举的一个例子是: 例如MPEG,每帧20ms,采样频率8000Hz,设定时间戳单位1/8000,而每个包之间就是160的增量
    这里又该如何理解呢?可以轻易地看出增量是直接8000与20ms相乘的结果,我们可以知道这里两帧之间的时间为20ms,也就是0.02s,这个单位是以秒来衡量的,那么我们要用时间戳单位来表示那么就是8000*0.02=160.所以时间戳增量为160.

        还有一点为什么一般都用90000作为视频采样频率呢?
        90k是用于视频同步的时间尺度(TimeScale),就是每秒90k个时钟tick。为什么采用90k呢?目前视频的帧速率主要有25fps、29.97fps、30fps等,而90k刚好是它们的倍数,所以就采用了90k。  

转载自:http://www.cppblog.com/koople/archive/2010/01/25/106396.html 

相关文章推荐

关于RTP时间戳及多媒体通信同步的问题/H264关于RTP协议的实现

http://www.rosoo.net/a/201101/10776.html http://hi.baidu.com/fairygardenjoy/blog/item/e56c5cca95829...

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

RTP协议是real-time transport protocol的缩写,被设计来传输流媒体数据,有着广泛的应用,其它相关介绍自己去看RFC,我不打算讨论这些无聊的概念性的东西。 (1)了解RTP...
  • zwz1984
  • zwz1984
  • 2015年12月23日 14:30
  • 444

rtp 头时间戳单位

时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000...

RTP时间戳

最近被RTP的负载类型和时间戳搞郁闷了,一个问题调试了近一周,终于圆满解决,回头看看,发现其实主要原因还是自己没有真正地搞清楚RTP协议中负载类型和时间戳的含义。虽然做RTP传输,有着Jrtplib和...

RTP传输中的负载类型和时间戳

最近被RTP的负载类型和时间戳搞郁闷了,一个问题调试了近一周,终于圆满解决,回头看看,发现其实主要原因还是自己没有真正地搞清楚RTP协议中负载类型和时间戳的含义。虽然做RTP传输,有着Jrtplib和...
  • dxpqxb
  • dxpqxb
  • 2015年09月11日 08:39
  • 491

live555学习笔记12-h264 rtp包的时间戳

十二 h264 rtp包的时间戳 这次我们一起来分析一下live555中是怎样为rtp包打时间戳的.就以h264为例吧. [cpp] view plaincopyprint? ...

RTP时间戳及相关

http://blog.csdn.net/denny_233/article/details/6733121 根据一些文章我自己推敲了一下几个概念如下: 采样频率是每秒钟抽取声波幅度样...

计算G711语音的打包长度和RTP里timestamp(时间戳)的增长量

如何计算G711语音等的打包长度和RTP里timestamp的增长量 一般对于不同的语音有不同的打包周期,而不同的打包周期又对应着不同的timestamp in RTP 那么是如何计算的呢...

谈谈RTP传输中的负载类型和时间戳

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/350142 ...

rtp头之时间戳的确定!

RTP的头部格式如下: 版本号(V):2比特,用来标志使用的RTP版本。 填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。 扩展位(X):1比特,如果该位...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于RTP中的时间戳问题
举报原因:
原因补充:

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