RTP/RTCP学习笔记 -- RFC 3550

The MTU of RTP package payload is 1500(IP) - 20(UDP) - 8 = 1472  

#define DEFAULT_MAX_PACKET_SIZE 1200 

video: [WME] INFO: CWmeLocalVideoTrack::SetOption(WmeTrackOption_MaxPayloadSize) uMaxPayloadSize = 1184, this=0x7f9efaf18e60

一、RTP

1. RTP包固定头部

    

V:RTP协议的版本号,占2位,当前协议版本号为2。

 

P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。
X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头。
CC:CSRC计数器,占4位,指示CSRC 标识符的个数。
M: 标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。
 
timestamp 时间戳的单位是时钟频率的倒数,
    video是1/90000秒, 90000是H.264定义的采样频率 (SDP中  a=rtpmap:117 H264/90000
    90k是用于视频同步的时间尺度(TimeScale),就是每秒90k个时钟tick。为什么采用90k呢?目前视频的帧速率主要有25fps、29.97fps、30fps等,而90k刚好是它们的倍数,所以就采用了90k。
    时间戳增量,对于每秒30fps,  增量等于 1000ms / 30f *  90000 = 3000,即每个帧的RTP包时间戳会增加3000,单位是1/90000秒。
 

------------------------------------------------------------------------------------

另外要注意几个细节:

1. RTP TS的时钟频率(clock rate)和media的采样频率(sample rate)可以不一致。对video来说,采样频率就是帧率,而时钟频率一般都是90k。对于audio,采样频率和时钟频率基本是一致的,但也有例外。

2. 所谓时钟频率,是指一个时钟在单位时间内的tick值,单位时间一般取一秒。以系统时钟为例,它的频率为1秒,或1000ms,或100k微妙;显而易见频率值依赖于tick的选取。
    而对于video或audio,都存在一个RTP时钟,这个时钟有两个作用:
    a. 指导media在接收端的播放,因此它必须和发送端的采样频率满足确定的关系;
    b.用于media之间的sync,因此不同media的RTP时钟之间存在确定性的mapping,或者都可以映射到同一个基准时钟上。

这个基准时钟一般就是系统时钟。讲RTP时钟映射到系统时钟除了知道这两个时钟的各自频率外,还需要找一个时间对应点。
系统时钟的频率是已知的(比如1000毫秒), RTP时钟的频率由SDP通知,时间对应点有SR通知,SR里面给出了一个RTP时间值对应的系统时间值。


因此我们说video Rtp时间戳的单位是1/90000秒,其实是将RTP时钟单位映射到系统时钟上面,得到的两者之间的关系。我们可以定义RTP时钟的频率为90000R秒,而系统时钟的频率为1000000us。这样子RTP TS在RTP时钟里的单位是R秒,一R秒等于100/9u秒,等于1/90000秒
video的RTP时钟频率取值90000除了是采样频率的倍数外,另外的目的是为了提高时钟精度,所以取了很大的值
另外videoRTP TS的增长是按帧的,同一帧内的RTP包TS是一样的

------------------------------------------------------------------------------------

 

 
 
 

同步信源(SSRC)标识符:占32位,用于标识同步信源。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的SSRC。

特约信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源。

关于这个SSRC和CSRC,在我们的wme里它是这么用的,SSRC是创建一个stream的时候产生的一个32Bit的一个随机数,1个stream对应一个SSRC,但是如果server mix audio or transcoding, RTP会被拆包再重新打包,那么这个SSRC是会被server改掉的,这种情况下,发送端和接收端的SSRC是不同的,其它情况,两端的SSRC应该是一样的。

这个CSRC对应的是一个device的一种code type. 比如,一个麦克风、一个摄象头的一种编码数据。CSI+Audio code type == CSRC.

在wme里,首先有个CSI这东东,是一个32bit的随机数,某字节置0 (TestConfig::i().m_csi = Random_uint & 0xFFFFFF00).  Audio CSI = CSI, Video CSI = CSI + 1. 

 

PT: 有效载荷类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等。

WME中 Video PayloadType = RTP_PT_H264 = 98

 

序列号:占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。接收者通过序列号来检测报文丢失情况,重新排序报文,恢复数据。
时戳(Timestamp):占32位,时戳反映了该RTP报文的第一个八位组的采样时刻。接收者使用时戳来计算延迟和延迟抖动,并进行同步控制。

 

 二、5种RTCP包:

1. RTCP packet types 

 

2. SR header  

 

 3. RR header  

 

4. 其它:

    RTCP包从不单独发送,它们被打包成复合包(Compound Packet)来发送,有几个规则,略。

    RTP 使用偶数端口号接收发送数据,相应的RTCP则使用相邻的下一位奇数端口号。

 

5. Jitter的计算

 

6. RTT的计算

发送端发一个SR,接收端收到SR会回一个RR包

RTT = 收到一个RR包当前Tick - 上次发送SR的tick(RR包中的LSR) - RR包在server上的delay(RR包中的DLSR = 发送RR的tick值-收到上个SR的tick值)

 

7. SRTP

SDP中带用master_key和salt,它们的长度是根据最终协商的 SRTP 的profile来确定的,具体可查 RFC3711 SRTP

master_key生成session_key,用来加密和认证。

 

posted @ 2015-03-16 01:44  AndyHu518  阅读(2516)  评论(0编辑  收藏  举报