RTP协议深度解析:10个头部字段与三种分组方案
RTP协议深度解析:10个头部字段与三种分组方案
RTP(Real-time Transport Protocol,实时传输协议)是用于在互联网上传输实时数据(如音频、视频)的协议。它定义了数据包的格式和传输规则,广泛应用于视频会议、网络电话、直播等场景。本文将深入解析RTP协议的头部结构、Nalu Header的组成以及各种分组方式。
RTP协议
Real-time Transport Protocol(实时传输协议)通常分为三种组合分包:
- 单Nallu分组
- 聚合分组
- 切片分组
【字母解释 F:代表禁止位,表示NALU是否有效】
【字母解释:NRI:代表优先级,对解码器有作用】
RTP头部结构
RTP(Real-time Transport Protocol)头部由多个字段组成,每个字段都有其特定的功能和长度。以下是RTP头部的典型组成:
- 版本(V):占2位,表示RTP协议的版本号。当前的版本号通常为2。
- 填充(P):占1位,是一个标志位,用于指示是否在该RTP报文的尾部填充了一个或多个额外的八位组。如果P=1,则表示存在填充数据,这些填充数据不是有效载荷的一部分。
- 扩展(X):占1位,是一个标志位,用于指示是否在该RTP报头之后存在一个扩展报头。如果X=1,则表示存在扩展报头。
- CSRC计数器(CC):占4位,用于指示CSRC(Contributing Source)标识符的个数。CSRC是参与源,即对RTP流做出贡献的源的数量。
- 标记(M):占1位,其含义取决于有效载荷的类型。对于视频数据,M通常用于标记一帧的结束;对于音频数据,M可能用于标记会话的开始或结束。
- 有效载荷类型(PT):占7位,用于说明RTP报文中有效载荷的类型。例如,它可以指示载荷是GSM音频、JPEG图像等。在流媒体传输中,PT字段用于区分音频流和视频流,从而便于客户端进行解析和处理。
- 序列号(SN):占16位,用于标识发送者所发送的RTP报文的序列号。每发送一个报文,序列号就会增加1。序列号的主要作用是帮助接收者检测和恢复丢失的数据包。
- 时间戳(Timestamp):占32位,表示RTP报文中第一个八位组的采样时刻。时间戳的单位是RTP时间单位(RTP Timestamp Unit),其值以90kHz的时钟频率进行计数。时间戳用于同步和排序RTP报文。
- 同步源标识符(SSRC):标明同步源,同步源是一个负责发送 RTP 分组并在 RTP 分组中设置序号和时间戳的实体,标识符是会话中全局惟一的,若 RTP 分组来自混合器则同步源标识符给出的是混合器的标识符
10.提供源标识符列表(CSRC):最多允许存在16个提供源标识符,若 RTP 分组来自混合器则提供源标识符列表给出进入混合器的各个信号的信号源标识符
Tpye | 解释 |
---|---|
1-23 | H264编码规定类型 比如I,P,B |
24-27 | 聚合分组类型 STAP-A,STAP-B,MTAP-16,MTAP-24 |
28-29 | 分片分组类型FU-A:28 FU-B:29 |
30-31 | 保留 |
Nalu Header
F: (1Bit) 禁止位 表明该Nalu单元是否禁止使用
NRI: (2Bit) 优先级 解码器使用
Type:(5Bit) RTP载荷类型
0:保留
1-23:H264编码规定的数据类型,单NALU分组直接使用此值
24-27:聚合分组类型(聚合分组一般使用24 STAP-A)
28-29:分片分组类型(分片分组一般使用28FU-A)
30-31:保留
单Nalu分组
将去掉起始码的H264码流加上RTP_header
RTP_Packet=Rtp_header+H264 【no start code】
聚合分组
单时聚合分组
STAP-A
当需要在一个 RTP 包中聚合多个具有相同时间戳的 NALU 时,就会使用 STAP-A
Type=24
如何组包:
rtp_packet = rtp_header + stap_a_nalu_header +
(nalu_size + nalu_header + nalu_data) +
(nalu_size + nalu_header + nalu_data)
STAP-A NALU Header
组成: F|NUT|NHEF
- Forbidden Zero Bit (F): 1 位,通常为 0。如果为 1,则表示该 NALU 是无效的。
- NAL Unit Type (NUT): 6 位,对于 STAP-A,这个值应该是 0x24(十进制中的 36)。这个值标识了这是一个 STAP-A NALU。
- NALU Header Extension Flag (NHEF): 1 位,如果为 1,则表示 NALU Header 后面跟着一个或多个 NALU Header Extension。对于 STAP-A,这个标志通常为 0,因为 STAP-A 不使用 NALU Header Extension。
STAP-B
用于聚合具有不同NALU类型但相同时间戳的NALU
Type: 25
rtp_packet = rtp_header + stap_b_nalu_header + DON
(nalu_size + nalu_header + nalu_data) +
(nalu_size + nalu_header + nalu_data)
多时聚合分组
MTAP-16
MTAP-16的设计目的是在单个RTP包中传输多个NALU,这些NALU具有不同的时间戳,但属于相近的时间点。通过使用16位位移字段,可以减少传输开销,因为不需要为每个NALU都完整地传输时间戳信息。
MTAP-24
MTAP-24的设计目的是在单个RTP包中传输多个NALU,这些NALU具有不同的时间戳,但属于相近的时间点。通过使用24位位移字段,MTAP-24可以支持更大的时间戳差异,适用于需要更高精度时间戳的场景
分片分组
FU-A
Type = 28(FU-A)
组成:
RTP_Packet =Rtp_header + fu_a_nalu_header + fu_Header + fu_payload
fu_a_nalu_header
fu_header
此结构中Type采用原始码流NALU中的 Type 字段(1~23)
S=1 表示这个RTP包为分片分组第一个分片
E=1 表示为分片分组最后一个分片
除了首尾分片,中间的分片S&E都设为0,R为保留位,设为0;
FU-B
Type = 29
音频AAC封装
如果使用 RTP 包荷载视频帧数据,由于视频帧数据较大,可能需要多个 RTP 包承载一个视频帧,而音频帧一般较小,一般只用一个 RTP 包也可以承载。RTP 承载 AAC 码流的 ADTS 帧数据示意图如下。
注意 ADTS Frame Header 无需