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

转自:http://blog.csdn.net/wudebao5220150/article/details/13816225

RTP协议是real-time transport protocol的缩写,被设计来传输流媒体数据,有着广泛的应用,其它相关介绍自己去看RFC,我不打算讨论这些无聊的概念性的东西。

(1)了解RTP

可以说,RTP协议不依赖于底层协议,也就是说,它是独立的协议。而一般的,由于UDP包的快速、时实性高的特点,它通常和UDP结合在一起,作为UDP的上层载体数据的形式传播。

typedef struct { 
        IN OUT  UINT32  timestamp;
        IN OUT  BOOL   marker; 
        IN OUT  BYTE   payload;

OUT    UINT32  sSrc; 
      OUT    UINT16 sequenceNumber; 
      OUT    int   sByte; 
      OUT    int    len;
      } rtpParam;

这是一个RTP头,很简单,并没有你想象的那么复杂,对不对?我们来看几个主要的参数,他们也是RTP的灵魂:

(1)payload。payload表示了此RTP包的数据是那种类型的数据,不同的数值表示不同的类型。如0是PCMU,8是723,24是视频263等等。

(2)SSRC,这个东西并不常用,实际上它是一个随即生成的ID,表示了一个RTP连接。在应用的时候,确保这个ID唯一就可以了。

(3)sequence number。也就是序列号,它表示了当前包是第几个包。发送方每发送一个包,就把这个数值加一。接受放可以根据这个数值来重新组合包顺序,判断包是否丢失等操作。注意:它只是表示了包的先后顺序,它不能表示时间上的任何其它信息。这个请和后面的时间戳比较。

(4)timestamp。时间戳,它的概念稍微有点复杂,我用稍微通俗点的理解去解释它,虽然这样有点不太正确。时间戳顾名思义,它表示了一个数据产生的时间,和我们邮递的邮戳一样,它是个时间标记(至于这个时间干什么用,我后面会详细的说),通常表示RTP数据包中,第一个字节数据产生的时间(至于你是不是这么用就是你写程序的问题了)。

如果你上面理解了,那么我们更进一步:实际上,时间戳增加一并不是我们通常意义上的过了一个微秒,而是增加了一个采样间隔那么长的时间。举个例子来说。不同的采集有不同的采样频率,比如一般的音频是8K的采样频率,也就是一毫秒采集8次数据,也就是每次采样间隔是1/8MS,而timestamp增加1也就意味着增加了一个采样间隔。也就是过了1/8MS。换个例子,如果令一种编码的采样频率是16K,那么timestamp增加1也就意味着系统过了1/16MS。也就是说,再同一个系统中,对不同编码,虽然使用同一个时钟,但timestamp的增长速度是不同的,在这个例子中,采样频率是16K的编码要比8K的快两倍,请记住这个区别。

 

(2)了解RTCP

RTCP协议是real-time transport control protocol的缩写,被设计来做RTP的控制,这个相对来说大家不怎么关心,我只介绍下它基本的东西。

RTCP实际上是RTP传输情况的反馈,通俗的说,它告诉另外一方,在一端时间内(5秒),它发送多少数据包给对方,接收到了多少对方的包。

另外,在RTCP中,还有两个比较重要的东西,一个64位的绝对时间戳和一个32位的相对时间戳。64 位时间戳也叫NTP时间戳,它的前32位是从1900 年1 月1 日0 时开始到现在的以秒为单位的整数部分,后32 位是此时间的小数部,因此,它可以肯定的表示了数据发送出去的绝对时间。32位的时间戳和RTP中的时间戳是一样的,没有任何区别。

(3)大家感兴趣的时间戳的使用和同步的一些话题。

1、SSRC的作用。

SSRC相当于一个RTP传输session的ID,就象每个人都有一个名字一样,每一个RTP传输也都有一个名字。这个数字是随机产生,并且要保证唯一。当RTP session改变(如IP等)时,这个ID也要改变。

2、序列号字段是否可以作为流内的同步标时?

我在上面已经说过,序列号只表示了包发出的先后顺序,它表示不了任何时间上的其它概念,所有严格的说,序列号并不能作为流内的同步标志。但是,由于一般来说,包的发送时间都会有严格限制,比如音频包是每秒种发送30个数据包,也就是说,每个包间隔1000/30MS,而这个时间就可以作为一个同步时间来播放。也就是说,按照序列号,每1000/30MS间隔播放一个数据包,这样也能保证同步,但是这时候请考虑丢包问题。

3、绝对时间戳和相对时间戳在进行同步处理时有什么不同

当我们取得绝对时间后,我们就可以根据这个绝对时间来播放这些数据包。这个绝对时间,加上我们需要的延时(用于数据传输,解码等等的时间)就是我们的播放时间,这样我们可以保证时间的严格同步(相当于把对方的动作延时一段时间后原原本本的再现出来)。目前,在RTP中,能得到这个绝对时间的办法只有RTCP。

对于相对时间戳,我们更关心的是两个时间戳之间的时间间隔,依靠这个时间间隔,来确定两个包的播放时间间隔。

4、单个媒体内的同步和不同媒体流之间的同步在处理方式上有什么不同

应该说,不同媒体之间同步比单媒体同步要复杂得多,除了要保证本身的播放要和时间同步外,还要保证两个或多个媒体间同步(比如音视频的同步)。这种不同更关心的两个时间戳时间的换算统一,前面我已经说过,不同编码有不同的采样频率,那么时间戳的增长速度就不同。另外,两个时间戳也需要有一个标准时间来表示时间戳的同步。最简单的方法是两个媒体的第一个时间戳相同,表示两个流的采集开始时间统一。另外还可以通过RTCP来做不同流之间的同步,这在下个问题中会提到。

5、时间戳字段如何用于作为流间同步标识

在RTP协议中,我们取得时间戳的方法有两个:一个是RTP包中的时间戳,另外一个是RTCP包中的绝对时间戳和相对时间戳。绝对时间戳的概念上面我已经说了,它可以表示系统的绝对时间。而RTCP包中的相对时间就是RTP包中的时间。根据这两个时间,不同流都可以纠正自己播放时间和真正时间的偏差以达到和绝对时间同步的目的。反过来说,如果我们没有办法拿到这个绝对时间,只有RTP包中的相对时间,那怎我们需要确定两个流在某一时间点的时间戳的数值。通俗的说,就是在某个时间点,流A的timestamp是多少,B是多少,然后根据这个时间两个流播放的延时时间,以达到同步的目的。实现这个目的最简单的办法是在两个流开始的时候,使用相同的stamp,拿音视频来说,在某一绝对时刻,采集相应的数据,并打上相同的时间戳,以后的播放,都以这个时间做基准时间,以保证同步。

时间: 2024-10-26 13:53:51

RTP 与RTCP 解释. 含同步时间戳的相关文章

RTP、RTCP及媒体流同步

转自:http://blog.163.com/liu_nongfu/blog/static/19079414220139169225333/ 一.流媒体简介 流媒体是指在internet中使用流媒体技术的连续时基媒体,例如视频.音频或多媒体文件.流式传输方式是将音视频.动画等多媒体文件经过压缩后分成一个个小数据包,当用户端发出请求时,由服务器端向用户端实时.连续传送这些小数据包,动态变化的网络可能使各个包选择不同的路由,故到达用户端的时间延迟也就不同.在用户端用播放器播放时,需要为接收数据开辟缓

RTP与RTCP协议介绍(转载)

RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完成.RTSP可以对流媒体提供诸如播放.暂停.快进等操作,它负责定义具体的控制消息.操作方法.状态码等.以下为转载: 本文主要介绍RTP与RTCP协议. author: ZJ   06-11-17 Blog: [url]http://zhangjunhd.blog.51cto.com/[/url] 1

RTP与RTCP协议介绍

转自:http://zhangjunhd.blog.51cto.com/113473/25481/ 本文主要介绍RTP与RTCP协议. author: ZJ   06-11-17 Blog: [url]http://zhangjunhd.blog.51cto.com/[/url] 1.流媒体( Streaming Media) 1.1流媒体概念 流媒体技术是网络技术和多媒体技术发展到一定阶段的产物.术语流媒体既可以指在网上传输连续时基媒体的流式技术,也可以指使用流式技术的连续时基媒体本身.在网上

RTP与RTCP协议详解

1.流媒体( Streaming Media) 1.1流媒体概念 流媒体技术是网络技术和多媒体技术发展到一定阶段的产物.术语流媒体既可以指在网上传输连续时基媒体的流式技术,也可以指使用流式技术的连续时基媒体本身.在网上传输音频.视频等多媒体信息目前主要有两种方式:下载和流式传输.采用下载方式,用户需要先下载整个媒体文件,然后才能进行播放.由于网络带宽的限制,下载常常要花很长时间,所以这种处理方式延迟很大.而流媒体实现的关键技术是流式传输.传输之前首先对多媒体进行预处理(降低质量和高效压缩) ,然

RTP、RTCP、RTSP 概念

用一句简单的话总结:RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制.同步. 之所以以前对这几个有点分不清,是因为CTC标准里没有对RTCP进行要求,因此在标准RTSP的代码中没有看到相关的部分.而在私有RTSP的代码中,有关控制.同步等,是在RTP Header中做扩展定义实现的. 另外,RFC3550可以看作是RFC1889的升级文档,只看RFC3550即可.  RTP  Real-time Transport Protocol)是用于Internet上针对多媒体数

RTP、RTCP协议学习-2015.04.15

最近做视频编解码部分,传输采用RTP协议.对学习做个记录 1.简介 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的.RTP被定义为传输音频.视频.模拟数据等实时数据的传输协议,与传统的注重的高可靠的数据传输的运输层协议相比,它更加侧重的数据传输的实时性,此协议提供的服务包括数据顺序号.时间标记.传输控制等.RTP通常与辅助控制协议RTCP一起工作,RTP只负责实时数据的

(转)音视频同步-时间戳

媒体内容在播放时,最令人头痛的就是音视频不同步.从技术上来说,解决音视频同步问题的最佳方案就是时间戳:首先选择一个参考时钟(要求参考时钟上的时间是线性递增的):生成数据流时依据参考时钟上的时间给每个数据块都打上时间戳(一般包括开始时间和结束时间):在播放时,读取数据块上的时间戳,同时参考当前参考时钟上的时间来安排播放(如果数据块的开始时间大于当前参考时钟上的时间,则不急于播放该数据块,直到参考时钟达到数据块的开始时间:如果数据块的开始时间小于当前参考时钟上的时间,则“尽快”播放这块数据或者索性将

用一个比喻来解释对 同步 异步 阻塞 非阻塞 轮询 回调 的理解

大二时看<Thinking in java>里NIO时这几个概念就很含混,现在大四快毕业了,看<tomcat权威指南>时又得遇到这些概念,这次决定弄懂它. 如果直接从网上扒它们的定义,那我写这个博客就啥意义都没有了,还不如写一堆链接呢!而且用专门的定义解释对于很多人而言就是用术语解释术语,那他们就得继续谷歌不懂的名词了.所以我觉得还是用孟子的思想:用鱼和熊掌比喻一下生和义吧 打个比方,我在网上买了个东西,然后就等东西送到邮局去取了.就有这4种情况: 你立刻傻站在邮局门口等东西来 你

简单直白解释Ajax 同步,异步

异步AJAX: 主线程:“你好,AJAX线程.请你帮我发个HTTP请求吧,我把请求地址和参数都给你了.” AJAX线程:“好的,主线程.我马上去发,但可能要花点儿时间呢,你可以先去忙别的.” 主线程::“谢谢,你拿到响应后告诉我一声啊.” (接着,主线程做其他事情去了.一顿饭的时间后,它收到了响应到达的通知.) 同步AJAX: 主线程:“你好,AJAX线程.请你帮我发个HTTP请求吧,我把请求地址和参数都给你了.” AJAX线程:“......” 主线程::“喂,AJAX线程,你怎么不说话?”