您的位置:首页 > 理论基础 > 数据结构算法

RTP、RTCP、FEC包数据结构简介

2018-02-22 11:46 357 查看
1.	数据包格式
1.1.	Interlaced结构
STAE模块采用RTP/RTCP进行指令交互和数据发送,同时对RTP/RTCP进行了2种方式的扩展,一种是添加额外的扩展头Interlaced,一种是在RTP/RTCP协议头中进行了扩展,因此STAE的指令是以下的方式存在(均采用网络序)

channel=0x00       channel=0x01      channel=0x02     channel=0x03
1.1.1.	Interlaced字段含义
字段说明:
1、magic_num:是Interlaced的头标识,固定不变。
2、channel:0x00标识携带的是	RTP包;0x01标识携带的是RTCP包;0x02标识携带的是音频包;0x03标识携带的是FEC包;
3、tag:是否需要SAK回应,0x00不需要,0x01需要。(携带FEC包时tag=0x01标识fec包结构是给整个rtp包编码)。
4、data_length:表示所携带负载的数据长度。
1.2.	RTP标准头
1.2.1.	RTP标准头结构

1.2.2.	字段说明
1.2.2.1.	简要介绍
RTP可以看成三个部分:
1)、RTP head:RTP协议头;
2)、extend:RTP协议头扩展;
3)、payload:ts视频流负载。
1.2.2.2.	RTP head相关字段说明
1)、V:2bit,2固定值,RTP版本;
2)、P:表示填充比特,1bit,为0;
3)、X:1bit,1表示RTP包头有扩展部分;0表示不带扩展。
4)、CC:4bit,CSRC 计数,此处为0,表示没有CSRC字段;
5)、M:1bit,此协议定义的标志 M=0表示非帧结束;M=1表示帧结束;
6)、PT:7bit,此协议定义的负载类型遵循rfc(见附录A)标准,PT=33 表示MP2T;pt=0 表示PCMU;
7)、sequence number :2字节,序列号,每发送一个RTP包序列号加1;
8)、timestamp: 4字节,时间戳,反映了RTP数据包中第一个字节的采样时间。同一帧数据的不同rtp包的时间戳要求保持一致;
9)、同步信源(SSRC)标识符:4字节,同步源,在同一个RTP会话期间没有任何两个同步源具有相同的ssrc。此协议定义SSRC 固定为  	SSRC[3]= 'S'  SSRC[2]= 'K' SSRC[1]= 'L' SSRC[0]= 'T';
10)、特约信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约	信源。只有当插入混合器时才会有该项。
1.3.	RTP扩展头
1.3.1.	RTP扩展头结构

1.3.2.	RTP扩展头字段含义
1.3.2.1.	简要介绍
如果字段X=1,则头部有扩展部分,否则X=0;
1.3.2.2.	RTP扩展头相关字段说明
1)、profile:固定为0x0000;
2)、extend hender length:单位为4字节(不包含本身长度)扩展头长度,网络序表示,取值为扩展所占几个32bit行;
3)、long sequence number:RTP序列号,64bit;
4)、Frame type :帧类型,此协议定义FT=0 表示IDR帧;FT=1 标识I帧;FT=2表示P帧;FT=3表示A帧;FT>=4其他;
5)、Frame state:帧状态,此协议定义FS=0 表示帧开始;FS=1表示帧中继;FS=2表示帧结束;
6)、Frame tag  :帧标记,P、A帧和前面的I帧此标记相同;
7)、iframe packets:数据包的个数;
8)、iframe sequence number:I/IDR帧序列号;
9)、gop marker:I/IDR个数(以I帧/IDR帧开始到下一个I帧/IDR帧结束)。
1.4.	RTCP头结构

1.4.1.	RTCP头字段含义
1)、V=2固定值,版本号;
2)、subtype:RTCP类型,一个PT对应不同的subtype;
3)、PT:RTCP包类型;
4)、length 负载长度4字节为单位,是以整个RTCP包长度(32bit为单位)减1来赋值,即RTCP的固定头为4字节,如果实际发送			的长度不是4的整数倍,自动补齐至4的整数倍;

1.5.	RTCP扩展头
1.5.1.	RTCP头扩展

1.5.2.	RTCP包类型
1.5.2.1.	简要介绍
RTCP包类型根据字段PT的值不同主要分为五种;
1.	PT=200表示Sender Report发送者报告;
2.	PT=201表示Receiver Report接收者报告;
3.	PT=202表示SDES(能力交互使用)源描述;
4.	PT=203表示BYE退出报告;
5.	PT=204表示APP自定义报告(application-defined);
1.5.2.2.	包类型介绍
1.5.2.2.1.	Sender Report类型
当PT=200时,此时为RTCP包类型 Sender Report发送者报告类型。IRTCPExHead格式为:

a)	SR包发送时的绝对时间值。NTP的作用是同步不同的RTP媒体流。
b)	SR包发送时的绝对时间值。NTP的作用是同步不同的RTP媒体流。
c)	从开始发送包到产生这个SR包这段时间里,发送者发送的RTP数据包的总数. SSRC改变时,这个域清零。
d)	从开始发送包到产生这个SR包这段时间里,发送者发送的净荷数据的总字节数(不包括头部和填充)。发送者改变其SSRC时,这个域要清零。
1.5.2.2.2.	Receiver Report类型
当PT=201时,此时为RTCP包类型 Receiver Report接收者报告类型。IRTCPExHead格式为:

a)	接收抖动(Interarrival jitter):RTP数据包接受时间的统计方差估计
b)	上次SR时间戳(Last SR,LSR):取最近从SSRC_n收到的SR包中的NTP时间戳的中间32比特。如果目前还没收到SR包,则该域清零。
c)	上次SR以来的延时(Delay since last SR,DLSR):上次从SSRC_n收到SR包到发送本报告的延时。
1.5.2.2.3.	SDES类型
当PT=202(能力交互)时,此时为RTCP包类型 SDES类型。IRTCPExHead格式为:

SSRC/CSRC_1:SSRC=0x12.0x34,0x56,0x78。
1.5.2.2.4.	BYE类型
当PT=203(能力交互)时,此时为RTCP包类型为BYE。IRTCPExHead格式为:

1.5.2.2.5.	APP用户自定义类型
当PT=204时,此时为RTCP包类型 APP类型,用户自定义类型,无固定格式。IRTCPExHead格式为:

a)	SSRC/CSRC:未定义,字段为0,没有用到自动填充;
b)	name(ASCII):未定义,字段为0,没有用到自动填充;
c)	subtype类型:
COMMAND((byte)0x03) (pt=204),命令,对方需要应答;
RESPONSE((byte)0x04) (pt=204),应答;
NOTIFICATION((byte)0x05)(pt=204),通知,对方不需要应答;
SAK (pt=204)
1.5.3.	RTCP负载类型
1.5.3.1.	简要介绍
RTCP负载,RTCP字段application dependent data的数据格式分为两种,一种为SDES能力交互使用的加头的TLV格式(见1.5.2.2.3 SDES类型),另一种为APP用户自定义类型的TLV格式(TLV---type length value)。
1.5.3.2.	SDES类型加头的TLV格式
SDES能力交互时使用的加头的TLV

RPIV:标识自定义SDES。
SDES length:SDES全部负载的TLV list的数据长度(字节)。
Prefix length:值为1,后填充位。
TLV list:TLV数据列表。

SDES TLV说明:

T_CAPACITY采用一个字节的不能bit来表示不同的信息:

T_VIDEO_MODE:一个字节用来表示视频模式

1.5.3.3.	用户自定义TLV格式
用户自定义的TLV包括以下几种(丢包重传、统计信息、信息配置)
i.	丢包重传(TLV类型 T:RESEND 1字节 L:负载V的长度 2字节 V:序列号 8字节)
ii.	StatisticInfoTLV统计信息(TLV类型  T:STAT 1字节  L:负载V的长度2字节 V:网络信息8字节)
iii.	NetAdaptInfo信息配置(TLV类型 T:NET_ADAPT 1字节L:负载V的长度 2字节 V:适配信息)
注:
1.在新的ctt代码中StatisticInfoTLV统计信息已被替换为:
recv_br_info_t
{
uint_32  gop_num;
uint_32  bit_rate;
uint_32  iframe_time;  //单位ms
}
2.NetAdaptInfo在ctt代码中有数据结构却无该项的响应处理。
1.6.	FEC头结构
1.6.1.	FEC包结构
FEC数据包的结构由一个Interlaced、fec header、冗余数据组合而成如下图。

1.6.2.	FEC头结构

1.6.3.	FEC头结构字段含义
E:1bit,保留位,必须为0;
L:1bit,用来标示FEC Level Header里的MASK 是否为 Long Mask, 普通的MASK 长度为16 bits,一个FEC 数据包 Group 的包个				   数最多为16个, Long MASK 长度为 48 bits,一个FEC 数据包Group的包个数最多为48个.
P:1bits、X:1bits、CC:4bits,M:1bit,用来产生RTP Header里相应字段的保护位。
PT recovery:7bits数据包 payload type 的保护位
TS recovery:32 bits, 数据报Timestamp的保护位
SN base :数据包里的最小sequence.
Length recovery:16 bits, 数据长度的保护位, 数据包的长度是 CSRC List, payload, padding 的总长度
1.6.4.	FEC packet结构

1.7.	语音包结构
这里的语音包设计为APP向IPC发送的语音包格式。

1.7.1.	语音包字段含义
1)、上面的部分为Interlaced,下面为语音包的格式;Interlaced中的payload length在这里被使用sequence num,表示语音的包序号;	2)、data length为语音数据的长度;
3)、data是语音数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: