webrtc RTP 数据传输协议

webrtc版本m79

RTP header rfc3550

//  0                   1                   2                   3
//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |V=2|P|X|  CC   |M|     PT      |       sequence number         |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |                           timestamp                           |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |           synchronization source (SSRC) identifier            |
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// |            Contributing source (CSRC) identifiers             |
// |                             ....                              |
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// |  header eXtension profile id  |       length in 32bits        |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |                          Extensions                           |
// |                             ....                              |
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// |                           Payload                             |
// |             ....              :  padding...                   |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |               padding         | Padding size  |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

struct rtpHeader
{
  uint8_t version : 2;
  uint8_t padding : 1;
  uint8_t extension : 1;
  uint8_t csrcCount : 4;
  uint8_t marker : 1;
  uint8_t payloadType : 7;
  uint16_t sequenceNumber;
  
  uint32_t timestamp;
  uint32_t ssrc;

/* 变长,根据csrcCount决定csrc个数 */
  uint32_t csrc[csrcCount];
};


  • version: 版本号2。
  • padding: 置为1表示RTP数据有填充。数据的最后一个字节表示填充了几个字节,包含这个字节本身
  • extension: 扩展标志,置为1则在RTP有RTP header extension
  • csrcCount: csrc的个数
  • marker: 标记。对于视频,标记一帧的结束;对于音频,标记会话的开始。
  • payloadType: payload type,在sdp中描述
  • sequenceNumber: 序列号的初始值是随机的,同时音频包和视频包的sequence是分别记数的,每次递增1。可以用来检查丢包;网络抖动用来排序。
  • timestamp: 时间戳,同一帧的时间戳是一样的
  • ssrc: 与sdp中的ssrc一致
  • csrc: 用音频来说:ssrc1、ssrc2、ssrc3经过混音后,ssrc填充的是混音器的ssrc,而csrc填充的分别是ssrc1、ssrc2、ssrc3

RTP header extension rfc3550

    /* RTP header extension, RFC 3550.
     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |      defined by profile       |           length              |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                        header extension                       |
    |                             ....                              |
    */
    
struct HeaderExtension
{
  uint16_t id;
  uint16_t length; // Size of value in multiples of 4 bytes.
};

/* Struct for One-Byte extension. */
struct OneByteExtension
{
  uint8_t id : 4;
  uint8_t len : 4;
  uint8_t value[len];
};

/* Struct for Two-Bytes extension. */
struct TwoBytesExtension
{
  uint8_t id : 8;
  uint8_t len : 8;
  uint8_t value[len];
};
  • HeaderExtension.id: profile id。当HeaderExtension.id==0xBEDE扩展头长度为1个字节,即结构体类型为OneByteExtension;否则(HeaderExtension.id & 0xfff0)==0x1000扩展头长度为2个字节,即结构体类型为TwoBytesExtension
  • HeaderExtension.length: HeaderExtension.length*4扩展头长度,不包含HeaderExtension.idHeaderExtension.length
  • OneByteExtension.id: 消息id,在sdp中描述
  • OneByteExtension.len: OneByteExtension.value的长度
  • OneByteExtension.value:
  • TwoBytesExtension:OneByteExtension意思一致

rtx rfc4588

/*
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         RTP Header                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            OSN                |                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
   |                  Original RTP Packet Payload                  |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
  • payloadType: payload type,在sdp中描述
  • sequenceNumber: 每次递增1。可以用来检查丢包;网络抖动用来排序。
  • ssrc: 与sdp中的ssrc一致
  • OSN: original sequence number,原始序列号

你可能感兴趣的:(webrtc RTP 数据传输协议)