RTP载荷H265(实战细节)

201 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

RTP包的结构:

图片.png RTP头在 “RTP载荷H264(实战细节)”讲的很清楚了,不了解的可以从上面链接进入查看,H265中RTP头的使用方法和H264一样,下面直接说下RTP载荷H265的载荷结构,及与载荷H264的区别:

RTP载荷H265

载荷和H264的载荷方式是一样的,根据帧数据的大小分为:单包,分片包,聚合包。具体的解释请参考“RTP载荷H264(实战细节)”。

载荷H265和载荷H264的单包,聚合包都是一样的,但是分片包有所区别,下面说一下载荷H265的分片包数据结构:

图片.png

其中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协议参考上面的链接博客:

    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字段平时的用法中可以不进行填充封装。