RTP包的结构:
RTP头在 “RTP载荷H264(实战细节)”讲的很清楚了,不了解的可以从上面链接进入查看,H265中RTP头的使用方法和H264一样,下面直接说下RTP载荷H265的载荷结构,及与载荷H264的区别:
RTP载荷H265
载荷和H264的载荷方式是一样的,根据帧数据的大小分为:单包,分片包,聚合包。具体的解释请参考“RTP载荷H264(实战细节)”。
载荷H265和载荷H264的单包,聚合包都是一样的,但是分片包有所区别,下面说一下载荷H265的分片包数据结构:
其中payloadhdr的结构如下:
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
|F| Type | LayerId | TID |
H265封装为RTP包的时候Type=49, F layerid TID都和H265 NAL head的F layerid TID相同,H265 NAL head结构如下具体的H264 H265协议参考上面的链接博客:
nal_unit_head{
forbidden_zero_bit(1bit): 禁止位 == F
nal_unit_type(6bit): NALU类型
nuh_reserved_zero_6bits(6bit): == layerid
nuh_temporal_id_plis1(3bit): == TID
};
可以看出NAL head的结构和RTP载荷的payloadhdr是一样的,除了Type。
FU header结构如下:
|0 |1|2|3|4|5|6|7|
|S|E| FuType |
S:第一个RTP分片包该位置1,其他置0;
E:最后一个RTP分片该位置1,其他置0;
FuType:与NAL head的6bitNALU 类型是一样的。
有此可知,H265的NAL head信息已经分别保存在了RTP的payloadhdr和 FU header中所以在封装RTP包时去除掉H265的起始码和NAL head信息:
H265数据:
00 00 00 01 0c 64 XX XX XX XX........
封装RTP包后:
RTP头 payloadhdr FU header XX XX XX XX......(去掉了起始码(00 00 00 01)和NAL head( 0c 64))
DONL字段平时的用法中可以不进行填充封装。