在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单元。

RTP分包模式(H264/H265)的更多相关文章

  1. RTP协议解析及H264/H265 音视频RTP打包分析

    一 概述 实时传输协议(Real-time Transport Protocol或简写RTP)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的. RTP协议详 ...

  2. MVPHelper更新日志 --- 新增常规分包模式

    MVPHelper是一款可以自动生成MVP接口以及实现类的android studio插件,彻底解放双手! MVPHelper更新版本啦. 由于之前只支持contract模式,不是很符合大众口味 所以 ...

  3. DirectShow的RTP发包(H264)Filter <转>

    转帖地址:http://blog.csdn.net/fan2273/article/details/77653700 DirectShow的RTP发包(H264)Filter 基于DirectShow ...

  4. RTP中的H264的SVC相关信息

    概览 本文简单的介绍了rtp中的h264的svc相关信息 h264的svc相关格式信息 从RTP Payload Format for H.264 Video可以看见264在rtp的传输过程中,在rt ...

  5. RTP/RTCP(一)-H264关于RTP协议的实现

    H264关于RTP协议的实现2010-07-22 13:35完整的C/S架构的基于RTP/RTCP的H.264视频传输方案.此方案中,在服务器端和客户端分别进行了功能模块设计.服务器端:RTP封装模块 ...

  6. Windows平台真实时毫秒级4K H264/H265直播技术方案

    背景 在刚提出4K视频的时候,大多数人都觉得没有必要,4K的出现,意味着更高的硬件规格和传输要求,1080P看的很爽.很清晰,完全满足了日常的需求.随着电视的尺寸越来越大,原本1080P成像已经无法满 ...

  7. FFMPEG H264/H265 编码延迟问题

    最新使用FFmpeg进行H264的编码时,发现视频编码有延迟,不是实时编码.进过一番研究发现,仅仅要在调用avcodec_open2函数 打开编码器时,设置AVDictionary參数就可以.关键代码 ...

  8. 【知识点】H264, H265硬件编解码基础及码流分析

    前言 音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性,码流的结构,码流中一些重要信息如sps,pps,vps,start code以及基本的工作原理,而大 ...

  9. RTSP服务端开发概述

    一 概述 RTSP(Real Time Streaming Protocol),RFC2326,实时音视频流传输协议,是TCP/IP协议体系中的一个应用层协议.该协议定义了一对多应用程序如何有效地通过 ...

  10. rtp h264注意点(FU-A分包方式说明)

    前写过一篇文章,分析了h264使用rtp进行封包的格式介绍:RTP封装h264.但里面好像没有把拆分以及一些需要注意的情况说清楚,因此这里做补充,也作为自己的备忘(自己记性好像不太好). 关于时间戳, ...

随机推荐

  1. 深入理解Linux系统调用

    1.系统调用号查询 我的学号位数是08,在64位调用表里可以查到对应的系统调用函数是__x64_sys_lseek 2.lseek函数 由于没用过该函数,所以先去了解一下这个函数的作用: 直白的说就是 ...

  2. Spyglass CDC工具使用(五)

    最近一直在搞CDC (clock domain crossing) 方面的事情,现在就CDC的一些知识点进行总结. 做CDC检查使用的是Spyglass工具.以下内容转载自:Spyglass之CDC检 ...

  3. 单向链表&有关类和对象

    // Test515.cpp: 定义控制台应用程序的入口点.// #include "stdafx.h"#include <iostream>using namespa ...

  4. SEGGER_RTT_printf()函数添加打印浮点数功能

    SEGGER 的实时传输 (RTT) 是一种用于嵌入式应用程序中交互式用户 I/O 的技术.它以非常高的性能结合了 SWO 和半主机的优势.但是在笔者使用时(RTT v758版本),其暂时不支持浮点数 ...

  5. 算法学习01—Java底层的正整数与负整数

    算法学习01 - Java 底层的正整数与负整数 本节课学到的知识 编写一个方法,打印出 int 类型数字的二进制长什么样 为什么 int 类型的最大值是 2^32 - 1,最小值是 -2^32 负整 ...

  6. 在 Kubernetes 集群上安装/升级 Rancher

    https://ranchermanager.docs.rancher.com/zh/pages-for-subheaders/install-upgrade-on-a-kubernetes-clus ...

  7. kong数据库postgre centos安装一条龙

    安装版本可以参考kong.conf PostgreSQL版本,这里要求9.5以上 https://www.cnblogs.com/zhi-leaf/p/11432054.html 安装rpm文件 #y ...

  8. PC端,知乎在不想登录的情况下一打开就弹出登录框的无痛解决办法

    基于chrome浏览器 第一步: chrome://settings/content/javascript 第二步:添加禁用项 [*.]zhihu.com

  9. vue3 ThreeJS 引入obj模型过暗的问题

    当我单纯地用MTLLoader引入材质, OBJLoader引入模型并添加到场景中时, 发现模型非常得暗. 需要将环境光的强度设置到3.5左右看起来才比较正常. 但正常情况下环境光的值不应该超出1.  ...

  10. base64压缩

    1 /** * 压缩图片 * base64 : 图片base64字符串 * w : 图片宽高最大值 * callback : 回调函数 * quality : 压缩系数0-1之间, 默认0.92 * ...