zoukankan      html  css  js  c++  java
  • 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,用来加密和认证。

  • 相关阅读:
    剑指offer---尾到头打印链表
    剑指offer---链表中环的入口结点
    剑指offer---删除链表中重复的结点2
    剑指offer---删除链表中重复的结点
    6.shap以及selector的使用
    7.进度条(ProgressBar)
    5.toogleButton以及Switch
    4.基础控件
    3.触摸事件
    2.点击事件和页面切换
  • 原文地址:https://www.cnblogs.com/awiki/p/4340917.html
Copyright © 2011-2022 走看看