1. 简介
实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务, RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。
2. RTP码流格式
以NALU为单位打包视频流,若NALU的长度大于MTU(一次网传能够传输的最大字节数),则这个NALU需要拆分为多个RTP包。
如表1所示为RTP包的格式,RTP包由tpkt头部、rtp头部、扩展信息以及媒体流载荷组成,tpkt头部不是标准RTP协议中定义的,rtp头部是必须有的,扩展信息和媒体流载荷是可选的,可以只有扩展信息或媒体流载荷中的一个。
tpkt头部 | rtp头部 | 扩展信息 | 媒体流载荷 |
如表2所示为基本信息RTP包,基本信息属于RTP包格式中的扩展信息。I帧的第一个NALU RTP包前需要加上基本信息RTP包。基本信息包括:公司标记、当前时间(年月日时分秒毫秒)、加密类型、相机标记、视频流类型、音频流类型、视频帧号。
tpkt头部 | rtp头部 | 基本信息 |
如表3所示为媒体流描述信息RTP包,媒体流描述信息属于RTP包格式中的扩展信息。I帧的第一个NALU RTP包前需要加媒体流描述信息RTP包。媒体流描述信息包括:编码版本号、编码年月日、原始图片宽高、是否隔行扫描、b帧数目、是否为SVC码流、是否使用e帧、最大参考帧数目、水印类型,显示时是否需要反隔行、JPEG的Q值、以1/90000s为单位的两帧间时间间隔,是否使用固定帧率、裁剪起始x坐标、裁剪起始y坐标、裁剪宽度、裁剪高度、音频帧长度、音频声道数、音频采样率、音频比特率。
tpkt头部 | rtp头部 | 媒体流描述信息 |
如表4所示为媒体流RTP包,若媒体流加密则需有加密信息,否则无需加密信息。加密信息包括:打包方式、加密算法、加密轮数、秘钥长度、加密类型。
tpkt头部 | rtp头部 | 加密信息 | 媒体流载荷 |
3. Tpkt头部
下表为DSP产生的RTP包格式,其中tpkt头部不是RTP协议中的,网传时需要去掉tpkt头部。
Tpkt头部(4字节) | |
序号 | 含义 |
0 | 固定为24 |
1 | 帧类型(I帧/P帧/音频帧),是否为最后一个NALU |
2,3 | RTP包的长度,包括tpkt头部长度 |
Rtp头部(12字节) | |
4 | RTP版本,是否包含填充信息,是否包含扩展信息,CSRC计数器 |
5 | M标记,负载类型(音频/视频/私有数据) |
6,7 | 负载序列号,表示该负载类型的第几个RTP包 |
8,9,10,11 | 时间戳 |
12,13,14,15 | Ssrc,同步源标识 |
扩展信息 | |
16,17 | 扩展信息类型 |
18,19 | 扩展信息长度 |
20 | 扩展信息 |
媒体载荷 |
4. RTP头部
V:RTP协议的版本号,占2位,当前协议版本号为2
P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。
X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展信息。
CC:CSRC计数器,占4位,指示CSRC 标识符的个数。
M: 标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。
PT(payload type): 有效荷载类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流的,这样便于客户端进行解析。
序列号:占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。这个字段当下层的承载协议用UDP的时候,网络状况不好的时候可以用来检查丢包。当出现网络抖动的情况可以用来对数据进行重新排序。序列号的初始值是随机的,同时音频包和视频包的sequence 是分别记数的。
时戳(Timestamp):占32位,必须使用90 kHz 时钟频率(程序中的90000)。时戳反映了该RTP报文的第一个八位组的采样时刻。接收者使用时戳来计算延迟和延迟抖动,并进行同步控制。可以根据RTP包的时间戳来获得数据包的时序。
同步信源(SSRC)标识符:占32位,用于标识同步信源。同步信源是指产生媒体流的信源,它通过RTP报头中的一个32位数字SSRC标识符来标识,而不依赖于网络地址,接收者将根据SSRC标识符来区分不同的信源,进行RTP报文的分组。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的SSRC。
特约信源(CSRC)标识符:每个CSRC标识符占32位,可以有0~15个CSRC。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源。
5. 媒体流载荷
5.1 H264媒体流载荷
若媒体流为未加密的H264码流,且NALU长度小于MTU(一次网传能够传输的最大字节数),则媒体流载荷为:H264码流。
若媒体流为未加密的H264码流,且NALU长度大于MTU(一次网传能够传输的最大字节数),则一个NALU需分为多个RTP包,媒体流载荷为:FU indicator+FU header+去除第一个字节后的H264码流的一部分。
5.1.1 FU indicator
F:禁止位,编码中默认为0,当网络识别此单元中存在比特错误时可将其设置为1,以便接受方丢弃该单元。
NRI:优先级,取值范围为0~3,值越高表示当前NAL越重要,需要优先受到保护。
Type:NALU是NAL Header中的Type。
5.1.2 header
S:当设置成1,指示分片NAL单元的开始。当跟随的FU荷载不是分片NAL单元荷载的开始,开始位设为0。
E:当设置成1,指示分片NAL单元的结束,即荷载的最后字节也是分片NAL单元的最后一个字节。当跟随的 FU荷载不是分片NAL单元的最后分片,结束位设置为0。
R:保留位必须设置为0,接收者必须忽略该位。
Type:NALU是NAL Header中的Type。
5.2 H265媒体载荷
若媒体流为未加密的H265,且NALU长度小于MTU(一次网传能够传输的最大字节数),无论是否加密,媒体载荷为:H265码流。
若媒体流为未加密的H265,且NALU长度大于MTU(一次网传能够传输的最大字节数),媒体载荷为:PayloadHdr+FU header+去除前两个字节后的H265码流的一部分。
5.2.1 PayloadHdr
PayloadHdr共两个字节,PayloadHdr的第一个字节中间6位固定为49,第一个字节的最高位和最低位为NALU第一个字节的最高位和最低位。PayloadHdr的第二个字节为NALU的第二个字节。
5.2.2 FU header
S:当设置成1,指示分片NAL单元的开始。当跟随的FU荷载不是分片NAL单元荷载的开始,开始位设为0。
E:当设置成1,指示分片NAL单元的结束,即荷载的最后字节也是分片NAL单元的最后一个字节。当跟随的 FU荷载不是分片NAL单元的最后分片,结束位设置为0。
Type:为NALU第一个字节的第1~6位,为NALU类型。
参考文献
1、https://blog.csdn.net/yangguoyu8023/article/details/97613726