RTP时间戳

本文深入解析RTP(实时传输协议)和RTCP(实时传输控制协议),重点阐述RTP头中的时间戳、序列号和SSRC字段在数据同步和流控制中的作用。时间戳用于表示数据产生的时间,序列号指示包的顺序,SSRC是会话标识。RTCP则提供传输反馈,帮助调整同步和质量。时间戳增量根据采样频率计算,确保数据按正确节奏播放。此外,文章探讨了不同媒体流间的同步策略以及时间戳在流间同步中的应用。

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

 typedef struct _rtp_header_t
{
    uint32_t v:2;   /* protocol version */
    uint32_t p:1;   /* padding flag */
    uint32_t x:1;   /* header extension flag */
    uint32_t cc:4;   /* CSRC count */
    uint32_t m:1;   /* marker bit */
    uint32_t pt:7;   /* payload type */
    uint32_t seq:16; /* sequence number */
    uint32_t timestamp; /* timestamp */
    uint32_t ssrc; /* synchronization source */
} rtp_header_t;


      这是一个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的快两倍,请记住这个区别。
RTCP
       RTCP协议是real-time transport control protocol的缩写,被设计来做RTP的控制,这个相对来说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值