首页 > 其他分享 >RTP分包模式(H264/H265)

RTP分包模式(H264/H265)

时间:2023-02-14 10:58:38浏览次数:53  
标签:FU nal H264 H265 uint8 NAL RTP bit 单元

     在rfc6184-h264文档5.4章节有详细说明、以及rfc7798-h265文档4.2章节中也有部分介绍。

一、NALU Header

● H264 NALU Header(1 byte)结构图如下:

F:     1 bit

        forbidden_zero_bit,禁止位,大多数情况为0,表示NAL单元类型和有效载荷不应该包含误码或其它语

        法错误。值为1,表示该NAL单元类型和有效载荷可能包含误码或者其它语法错误。

NRI:  2 bit

        nal_ref_idc,nal 参考级别,该值一般为00、01、10、11(二进制),表示该NAL单元重要级别,如果

        为0,可能解码器丢弃,不会导致花屏现象。该值必须遵循H264编码规范。比如:sps、pps、idr等NAL

        单元时,该值必须为11(二进制)

Type:5 bit

        nal_unit_type,代表nal单元类型,常见的该值为7(sps)、8(pps)、5(idr)等。

● H265 NALU Header(2 byte)结构图如下:

 F:    1 bit

        forbidden_zero_bit,禁止位,大多数情况为0,表示NAL单元类型和有效载荷不应该包含误码或其它语法

        错误。值为1,表示该NAL单元类型和有效载荷可能包含误码或者其它语法错误。

Type:  6 bit

        nal_uint_type,代表nal单元类型,允许NAL单元的类型编码数比 h264/AVC多一倍,达到64类,其中32类

        作用在VCL NAL单元,32类用作non-VCL NAL单元。

LayerId:6 bit

        nal_layer_id,hevc中等于0,扩展标识符。该语法未来用于标识CVS中可能出现的层,其中层包括空间可

        伸缩层、质量可伸缩层、纹理视图或深度视图。

TID:       3 bit

        nal_temporal_id_plus1,层识别信息。表示当前NAL单元属于哪个时域子层,时域标识符的值为0~6。

二、RTP有效载荷结构(Payload Structures)

       有效载荷格式定义了三种不同的基本有效载荷结构。接收器可以通过RTP包有效载荷的第一个字节识别有效 载荷结构,该RTP包有效载荷的第一个字节共同充当RTP包有效载荷报头,并且在某些情况下,作为有效载荷的 第一个字节。这个字节总是被构造为一个NAL单元头。NAL单元类型字段(nalu_unit_type)表示存在哪种结构。可 能的结构如下: ● Single NAL Uint Packet(单个NAL单元包):在有效载荷中只包含一个NAL单元。NAL报头类型字段等于原 始NAL单元类型,即在1到23的范围内。单个NAL单元包必须包含一个NAL单元。这意味着即不能再聚合包中使 用,也不能在碎片单元中使用单个NAL单元包。由按RTP序列号顺序解包的单个NAL单元包组成的NAL单元流必 须符合NAL单元解码顺序。单个NAL单元包的结构如图所示: ● Aggregation Packets(聚合包):聚合包是此负载规范的NAL单元聚合方案。引入该方案时为了反映两个关键 目标网络的显著不同的MTU大小,有线IP网络(其MTU大小通常受以太网MTU大小的限制,大约为1500字节) 和基于IP或非基于IP(例如ITU-T H.234/M)的无线通信系统,其首选传输单元大小为254字节或更小。为了防止 两个世界之间的媒体转码,并避免不必要的分组开销,引入了NAL单元聚合方案。 主要有两种聚合包类型: ① Single-time aggregation packet(STAP):对具有相同NALU-times的NAL单元进行聚合。定义了两种类型 的STAP,一种没有DON(STAP-A),另一种包括DON(STAP-B)。DON(Decoding Order Number) ② Multi-time aggregation packet(MTAP):聚合具有不同NALU-times的NAL单元。定义了两种不同的MTAP, 不同的是NAL单元时间戳偏移量的长度。聚合报文中所携带的每个NAL单元封装在一个聚合单元中。聚合包的RTP 负载如图所示:

● Fragmentation Units(FUs):这种有效载荷类型允许将一个NAL单元分割成几个RTP包。这样做在应用层, 而不是依赖于下层的分片(IP网络层即网络协议进行分片)。FUs主要包含两种分片类型:FU-A和FU-B,FU-A 和FU-B的结构类似,只是FU-B比FU-A多了一个DON域。

 1)H264 FUs结构

H264 FU-A的RTP负载如图所示:

H264 FU-B的RTP负载如图所示:

       FU-B必须用于一个分片NAL单元的第一个分片单元的交错分组模式。NAL单元类型FU-B绝对不能在其它 任何情况下使用。换句话说,在交错分组模式下,每个被分片的NALU都有一个FU-B作为第一个片段,然后 是一个或多个FU-A片段。

H264 FU indicator定义如下:

1 //FU Indicator定义实际就是H264的NAL Header,H264
2 typedef struct _tagFUIndicator
3 {
4     uint8_t F : 1;       /*1 bit,forbidden_zero_bit(禁止位),一般为0*/
5     uint8_t NRI : 2;     /*2 bit,nal_ref_idc(nal参考级别),代表这一个NAL的重要级别,比如sps、pps、idr该值一般为11(二进制),由*/
6     uint8_t TYPE : 5;    /* set to 28 or 29 */
7 } FUIndicator;

       FU-A和FU-B的type字段分别为28和29,FUIndicator结构和NALU单元头定义类似,只是FU-A和FU-B中

的TYPE字段表示分片类型,而NALU单元中的TYPE为nalu_unit_type。

H264 FU header结构如下: 

1 //FU Header定义,H264
2 typedef struct _tagH264FUHeader
3 {
4     uint8_t S : 1;       /*1 bit,Start位,当设置为1时,Start位表示一个分片NAL单元的开始。当FU有效载荷不是分片NAL单元有效载荷起始时,该值被设置为0*/
5     uint8_t E : 1;       /*1 bit,End位,当设置为1时,表示分片NAL单元的结束,即当该NAL单元分片最后一个分片时,该值为1,否则End位被设置为0*/
6     uint8_t R : 1;       /*1 bit,预留位,一般为0*/
7     uint8_t Type : 5;    /*5 bit,nalu_unit_type, set to nal type */
8 } H264FUHeader;

2)H265 Fus结构

H265 PayloadHdr定义(即H265的NAL Header)如下:

1 typedef struct tagH265NalHeader
2 {
3     uint8_t F       : 1;       /* start flag */
4     uint8_t Type    : 6;       /* end flag */
5     uint8_t LayerId : 6;       /* end flag */
6     uint8_t Tid     : 3;       /* set to nal type */
7 } H265NalHeader;

H265 FU header结构如图:

 

1 typedef struct tagH265FUHeader
2 {
3     uint8_t S : 1;       /* start flag */
4     uint8_t E : 1;       /* end flag */
5     uint8_t Type : 6;    /* set to nal type */
6 } H265FUHeader;

三、三种分包模式和适用场景

● Single NAL unit mode(单个NALU单元模式):适用于复合ITU-T建议H.241的会话系统。 ● Non-interleaved mode(非交错模式):非交错模式是针对可能不符合ITU-T建议H.241的会话系    统。在非交错模式下,NAL单元按NAL单元解码顺序传输。 ● Interleaved mode(交错模式):交错模式适用于不需要非常低的端到端延时的系统。交错模式    允许在NAL单元解码顺序之外传输的NAL单元。

标签:FU,nal,H264,H265,uint8,NAL,RTP,bit,单元
From: https://www.cnblogs.com/shu-jie/p/17118869.html

相关文章

  • 一个简单的RTMP服务器实现 --- RTMP与H264
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 毕设系列之Libx264实时视频流(YUV 420P转H264视频编码篇)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 毕设系列之JrtpLib H264(裸视频数据) 实时视频传输(发送与接受)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • jrtplib linux编译使用
    简介 JRTPLIB是一个用C++编写的面向对象的库,旨在帮助开发人员使用RFC3550中描述的实时传输协议(RTP),该库可以提供接口给开发者实现RTP发送和接收数据,而无需担心SSRC冲突、调......
  • jrtplib can't retrieve login name解决方案
    ​场景     armlinux版本程序启动调用jrtplib报错如上,导致建立rtpsession失败原因分析​RTPSession::CreateCNAME这个函数会从系统调用里获取登陆名称,然后填充R......
  • JRTPLIB The specified port base is not an even number解决方案
    说明   RTP/RTCP是一对组合的协议,RTP负责视音频数据的收发,RTCP负责收发双方数据包速率控制协议,一般情况下,需要分配两个端口,负责上面两种数据的传输。   JRTPLIB......
  • RTP及H264相关知识网站
    ​​http://makaidong.com/lidabo/188198_7929775.html​​​​https://www.jianshu.com/p/a19f3e63b433​​​​https://www.jianshu.com/p/5e4199838b43​​​​​​​......
  • RTP封装h264,结合webrtc抓包分析
    作者:拔萝卜的大灰狼链接:https://zhuanlan.zhihu.com/p/402346767来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。一简介h264是目前使用......
  • 为什么发出去的2833 RTP流不能收号
    对前段时间解决的收号问题做个复盘。我开发的媒体服务器部署在某省,为电话用户提供媒体服务。前段时间我们现场交付同事联系我,有某总机电话,无法进行收号。于是先请现场的......
  • 关于SmartPlant
    SmartPlant是鹰图公司(Intergraph)的化工•电力•海事部门(PP&M)下的一系列工程设计软件,包括:文档管理平台兼数据存储转化平台SmartplantFoundation绘制智能PID的Smartpl......