webrtc版本m79
// 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.id和HeaderExtension.length
-
OneByteExtension.id: 消息id,在sdp中描述
-
OneByteExtension.len: OneByteExtension.value的长度
- OneByteExtension.value:
-
TwoBytesExtension: 同OneByteExtension意思一致
/*
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,原始序列号