一、简介
Real-time Transport Protocol(实时传输协议) 具体参考rfc3350介绍
可负载H264、H265、G711A、AAC、PS、私有流等各种数据。
二、格式
RTP 固定头部格式如下
version (V): 2bits RTP协议版本号 目前协议版本为2
padding (P): 1bit 填充位 设置成1,表示尾部有填充数据。最后一个字节表示 填充数据长度
extension (X): 1bit 扩展位,设置成1,表示固定头部后面有扩展头
CSRC count (CC): 4bits CSRC个数, 每个CSRC占4字节
marker (M): 1bit 不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。
payload type (PT): 7bits 负载类型 可参考rfc35511 目前视频主要用96后表示
sequence number: 16bits 包序号 用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。接收者通过序列号来检测报文丢失情况,重新排序报文,恢复数据。
timestamp: 32bits 时间戳 同一帧数据时间戳相同
SSRC: 32bits 同步信源标识符
CSRC list: 32bits 0-15个, 每个占32bits 由CC决定个数
RTP 扩展头部格式如下
第3~4字节表示扩展数据长度,后面跟扩展数据。
三、负载数据
RTP负载H264
参考rfc6184 rtp负载h264
packetization-mode(打包模式) 该字段在sdp中体现。其中RTSP是在 DESCRIBE响应中携带。
0或不存在 Single NAL unit mode 单一nalu单元模式
1-Non-interleaved mode 非交织模式 目前最常见
2-Interleaved mode 交织模式
目前RTP库支持0和1模式
Nal Unit 如下
F : 1bit 禁止位
NRI: 2bits nal_ref_idc nal 用于指示该 nalu 的重要性
Type: 5bits nal_unit_type
不同打包模式支持的打包方式如下:
Single NAL unit mode 支持NAL unit
Non-interleaved mode 支持NAL unit、STAP-A、FU-A(最常见)
Single NAL unit Packet(单一打包)
当一帧数据小于MTU时候,可采用该方式打包, 去掉起始头(000001)
FU-A分片模式
当一帧长度过长时候,可选择FU-A分片模式打包, RTP负载格式如下
H264 Nalu头和RTP FU indicator FU header关系如下
FU-A头部由2个字节组成, FU indicator和FU header各占一个字节
FU indicator如下
type=28
FU header如下
S: 1bit 分片开始描述符 1-表示开始 0-不是开始
E: 1bit 分片结束描述符 1-表示结束 0-不是结束
R: 1bit 保留位
Type: 5bits NAL Unit type 对应H264中的nalu type。
RTP负载H265
参考rfc7798 rtp负载h265
NAL Unit Header如下
F: 1bit 禁止位
Tyep: 6bits nal unit type
LayerId: 6bits 表示NAL所在的Access unit所属的层,该字段是为了HEVC的继续扩展设置。也就是目前都是0
TID: 3bits 指定nal单元加1的时间标识符。时间id的值等于tid-1,tid的值为0是非法的,
Single NAL unit Packet(单一打包)
PayloadHer: 负载头 从H265 NAL unit复制过来 Type值为1~47
DONL(Decoding Order Number): 解码序列号
Fragmentation Units(分片包)
H265 Nalu头和RTP FU indicator FU header关系如下
PayloadHer 中Type=49
FU header如下
S : 1bit 分片开始描述符 1-表示开始 0-不是开始
E: 1bit 分片结束描述符 1-表示结束 0-不是结束
FuType: 6bits 表示Nal Unit的类型 和h265中的nal_unit_type取值相同
RTP负载通用数据
包括负载G711A, G711U, PS等数据 可直接负载
RTP负载AAC
参考rfc3640rtp负载aac
需剥掉adts头。