RTP Payload Format:
1、rtp header usage::
根据本 RTP 载荷格式,应设置的 RTP 头部信息如下:
-
标记位(M bit):1 位
设置为由 RTP 时间戳所指示的访问单元(access unit)的最后一个数据包,以便与视频格式中对标记位的通常用法一致,便于高效地进行播放缓冲区处理。 对于聚合包(Aggregation packets,如 STAP 和 MTAP),RTP 头部中的标记位必须设定为:如果聚合包中最后一个 NAL 单元单独传输时所应具有的标记位的值。解码器可以将该标记位作为访问单元最后一个数据包的早期提示,但不得完全依赖此属性。
说明性备注: 一个聚合包携带多个 NAL 单元,但仅与一个标记位(M位)相关。因此,如果网关将一个聚合包重新分为多个包进行传输,那么无法可靠地设置这些包的标记位。
-
负载类型(Payload Type,PT):7 位
本文件不涉及为新定义的载荷格式指定 RTP 载荷类型(Payload Type),这里不作规定。负载类型的具体指定应通过所使用的 Profile 或动态方式完成。
-
序列号(Sequence Number,SN):16 位
根据 RFC 3550 中的规定进行设置和使用。 对于单个 NAL 单元模式(Single NALU)和非交织(non-interleaved)打包模式,序列号用于确定 NAL 单元的解码顺序。
-
时间戳(Timestamp):32 位
RTP 时间戳设置为内容的采样时间戳。必须使用 90 kHz 的时钟频率。
-
如果 NAL 单元自身不具备时间信息(例如参数集(Parameter Set) 和 SEI 单元),那么 RTP 时间戳应设置为包含此 NAL 单元的访问单元的主要编码图像的 RTP 时间戳。
-
对于 MTAP 类型的数据包,RTP 时间戳的具体设置方式在后面讲解。接收端应忽略仅包含一个显示时间戳的访问单元内的任何图像时序 SEI 消息(picture timing SEI)。接收端应使用 RTP 时间戳来同步显示过程。
-
如果一个访问单元中携带了多个显示时间戳(在图像时序SEI消息中),则 SEI 消息中的时间戳应被视为相对于 RTP 时间戳的偏移。其中最早发生的事件对应 RTP 时间戳,其后的事件则基于图像时序SEI消息中携带的图像时间差值进行相对计算。
具体计算方式为:
假设一个访问单元的 SEI 消息中包含显示时间戳 tSEI1, tSEI2, ..., tSEIn,其中 tSEI1 为最早的显示时间戳。定义函数 tmadjst() 用于将 SEI 消息的时间尺度调整为 90 kHz 的时间尺度,TS 表示 RTP 时间戳。那么:
-
对于与 tSEI1 关联的显示事件,显示时间为 TS。
-
对于与 tSEIx(x范围为 2 到 n)关联的显示事件,显示时间为:
TS + tmadjst(tSEIx - tSEI1)
说明性备注: 当视频内容由逐行编码帧(coded frames)以场(fields)方式显示时,例如常见的 3:2 pulldown 处理过程,需要在隔行扫描显示设备上显示逐行扫描编码的电影内容时,图像时序 SEI 消息机制允许一个编码图像携带多个显示时间戳,从而精确控制显示过程。
这是必要的,因为 RTP 时间戳每个编码帧只能携带一个,而无法传递多个显示时序信息。
2、Payload Structures:
载荷格式定义了三种基本的载荷结构。接收端可通过 RTP 包载荷的第一个字节识别具体的载荷结构。该字节同时作为 RTP 载荷头部,有时也作为载荷数据的第一个字节。这个字节始终采用 NAL 单元头的结构,其中 NAL 单元类型字段指明了具体使用了哪种结构。可能的结构包括:
-
1、单一 NAL 单元包(Single NAL Unit Packet):载荷中仅包含一个单独的 NAL 单元。NAL 头部类型字段与原始的 NAL 单元类型相同,即数值范围为1至23。
-
2、聚合包(Aggregation Packet):用于将多个 NAL 单元聚合到单个 RTP 载荷中。此类型包包含四个版本:
● 单一时间聚合包 A 型 (STAP-A)
● 单一时间聚合包 B 型 (STAP-B)
● 多时间聚合包(MTAP)16位偏移版本(MTAP16)
● 多时间聚合包(MTAP)24位偏移版本(MTAP24)
以上聚合包分别对应的 NAL 单元类型编号如下:
● STAP-A:24
● STAP-B:25
● MTAP16:26
● MTAP24:27
-
3、分片单元(Fragmentation Unit):用于将单个 NAL 单元分片到多个 RTP 包中传输。存在两种版本:
● 分片单元 A 型(FU-A),对应 NAL 单元类型 28
● 分片单元 B 型(FU-B),对应 NAL 单元类型 29
说明性备注:
本规范未限制单一 NAL 单元包和分片单元中封装的 NAL 单元的大小。然而,在任何聚合包(Aggregation Packet)中封装的单个 NAL 单元最大尺寸为 65535 字节。
下表(表1)总结了 NAL 单元类型及其对应的 RTP 包类型(直接用作包载荷时):
3、Nal unit header usage:
NAL单元头部的结构和语义在前面已有介绍。为方便起见,NAL单元头部格式在此再次列出:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
本节依据本规范,详细说明字段 F 和 NRI 的语义:
F 字段:1 位
● forbidden_zero_bit(禁止位):
○ 值为 0 表明 NAL 单元类型字节及其载荷不应包含比特错误或其他语法错误。
○ 值为 1 表明 NAL 单元类型字节及其载荷可能包含比特错误或其他语法错误。
媒体感知网络单元(MANEs)应在检测到 NAL 单元中存在比特错误时,将 F 位设为 1。H.264 标准要求 F 位必须为 0。当 F 位被设置为 1 时,解码器应意识到载荷或 NAL 单元类型字节可能含有比特错误或其他语法错误。此时解码器最简单的反应是丢弃该 NAL 单元,并对丢弃的数据进行错误掩盖处理。
NRI 字段:2 位
● nal_ref_idc(NAL 单元参考标识符):
其值为 00 或非零时的语义与 H.264 规范中保持一致。
○ 值为 00 表示该 NAL 单元内容不用于重建用于帧间预测的参考图像,丢弃这些 NAL 单元不会影响参考图像的完整性。
○ 非零值表示必须解码该 NAL 单元,以保持参考图像的完整性。 根据本 RTP 载荷规范,NRI 值还额外表示由编码器确定的相对传输优先级。MANEs 可以利用该信息对较重要的 NAL 单元提供更好的保护。优先级由高到低为:
● 最高:11
● 次高:10
● 较低:01
● 最低:00
说明性备注:
在 H.264 解码器中,所有非零的 NRI 值处理方式相同,因此接收端不需要在向解码器传递NAL单元时修改NRI值。
H.264 编码器在 NAL 单元类型(nal_unit_type)为 1 至 12 时,必须依据 H.264 标准(见7.4.1节)来设置 NRI 值。具体而言:
● 当 nal_unit_type 为 6, 9, 10, 11, 或 12 时,H.264标准要求 NRI 必须为 0。
● 当 nal_unit_type 为 7 或 8(即序列参数集SPS或图像参数集PPS)时,编码器建议将 NRI 设置为 11。
● 当 nal_unit_type 为 5(属于IDR图像的编码片段)时,编码器建议将 NRI 设置为 11。
其他 nal_unit_type 与 NRI 的映射关系,可参考下表提供的示例(根据某些环境实践证明有效),但也可依据具体应用和使用的H.264配置文件进行其他映射:
说明性备注:
某些配置文件(如 Main 或 Baseline)不支持数据分区,因此类型 2、3 和 4 的NAL单元仅可能出现在允许数据分区的配置文件中,而不会出现在Main或Baseline配置文件的码流中。
表2:主编码参考图像的编码片段与编码片段数据分区的 NRI 示例值
说明性备注:
正如前述,非参考图像的NAL单元(NRI)值根据H.264标准要求必须为00。
H.264 编码器应当将冗余编码参考图像的编码片段和编码片段数据分区NAL单元的 NRI 值设置为 01。
NAL单元类型 24 到 29 对应的 NRI 值定义在本备忘录的第 5.7 和 5.8 节给出。
对于 NAL 单元类型 13 到 23,本备忘录不提供 NRI 值的建议,因为这些值预留给 ITU-T 和 ISO/IEC 使用。
对于 NAL 单元类型为 0 或 30 到 31,本备忘录也不提供 NRI 值的建议,因为此类值的语义本备忘录未定义。
4、packetization modes(分包模式):
本备忘录定义了三种分包模式(packetization modes):
● 单一NAL单元模式(Single NAL unit mode)
● 非交织模式(Non-interleaved mode)
● 交织模式(Interleaved mode)
● 单一NAL单元模式
针对符合ITU-T建议H.241[3] 的实时会话系统。
● 非交织模式
针对可能不符合ITU-T建议H.241的实时会话系统。在该模式下,NAL单元按照NAL单元解码顺序传输。
● 交织模式
针对不要求极低端到端延迟的系统。在该模式下允许NAL单元不按照NAL单元解码顺序传输。
当前使用的分包模式可以通过可选的媒体类型参数 packetization-mode 来指定。所选择的分包模式决定了哪些NAL单元类型允许出现在RTP载荷中。表3总结了每种分包模式下允许使用的载荷包类型。具体的分包模式将在第6节详细说明。
表3:各分包模式下允许使用的NAL单元类型(yes=允许,no=不允许,ig=忽略)
某些NAL单元或载荷类型值(表3中标记为“保留”)被保留用于未来的扩展用途。发送端不应发送这些类型的NAL单元(无论是直接作为载荷,还是作为聚合包中的聚合单元,亦或是FU分片包中的分片单元),接收端必须忽略这些类型的NAL单元。
例如:
● 载荷类型1到23(对应包类型为“NAL单元”),允许用于“单一NAL单元模式”和“非交织模式”,但不允许直接用于“交织模式”。然而,类型1到23的NAL单元在“交织模式”下可以被用作聚合单元(如STAP-B、MTAP16、MTAP24)或分片单元(如FU-A、FU-B)。
● 同样,类型1到23的NAL单元在“非交织模式”下,除了直接作为载荷外,也可作为STAP-A聚合包或FU-A分片包中的聚合单元或分片单元进行使用。
5、Decoding Order Number (DON):
在交织分包模式(interleaved packetization mode)中,NAL 单元的传输顺序允许与其解码顺序不同。“解码顺序号”(Decoding Order Number,DON)是载荷结构中的一个字段或是一个导出变量,用于指示 NAL 单元的实际解码顺序。有关允许传输顺序与解码顺序不同的原因及 DON 使用案例的示例和解释,后面会讲解。
传输顺序与解码顺序之间的关系由可选的媒体类型参数 sprop-interleaving-depth 控制:
● 如果该参数值等于 0(显式设置或默认),则 NAL 单元的传输顺序必须与其解码顺序完全一致。
● 如果该参数值大于 0:
○ MTAP16 和 MTAP24 中的 NAL 单元顺序,不必与 NAL 单元解码顺序相同。
○ 从连续的两个数据包中解包得到的 STAP-B、MTAP 及 FU 类型的 NAL 单元顺序,也不要求与解码顺序一致。
单一 NAL 单元包(Single NAL unit packet)、STAP-A 和 FU-A 的 RTP 载荷结构中并不包含 DON 字段。
而 STAP-B 和 FU-B 的结构包含 DON 字段,MTAP 的结构则允许导出 DON 值。
说明性备注:
当在交织模式下出现 FU-A 时,它总是紧随一个 FU-B 而来,且 FU-B 为其设定了 DON 值。
说明性备注:
如果发送端想要实现每个包仅封装一个 NAL 单元并以非解码顺序进行传输,那么可以使用 STAP-B 包类型。
在单一 NAL 单元分包模式下,NAL 单元的传输顺序(由 RTP 序列号决定)必须与 NAL 单元解码顺序完全相同。
在非交织分包模式下,单一 NAL 单元包、STAP-A 和 FU-A 中的 NAL 单元传输顺序也必须与其解码顺序完全一致。在 STAP 包内,NAL 单元也必须以解码顺序排列。因此,在 STAP 包内部的顺序隐式表示了解码顺序,而 STAP 包、FU 包与单一 NAL 单元包之间的顺序则通过 RTP 序列号表示。
对 STAP-B、MTAP 以及以 FU-B 开始的一系列分片单元中所携带的 NAL 单元,其 DON 值的信令方式分别在第 5.7.1、5.7.2 和 5.8 节详细定义。传输顺序中的第一个 NAL 单元的 DON 值可以设为任意值。DON 值的范围为 0 至 65535。达到最大值后,DON 值重新回绕到 0。
在任何 STAP-B、MTAP 或以 FU-B 开头的一系列分片单元中所包含的两个 NAL 单元的解码顺序,定义如下:
设 DON(i) 为传输顺序索引为 i 的 NAL 单元的解码顺序号。定义函数 don_diff(m,n) 如下:
若 DON(m) == DON(n),则 don_diff(m,n) = 0
若 (DON(m) < DON(n) 且 DON(n)-DON(m)<32768):
don_diff(m,n) = DON(n)-DON(m)
若 (DON(m) > DON(n) 且 DON(m)-DON(n)≥32768):
don_diff(m,n) = 65536 - DON(m) + DON(n)
若 (DON(m) < DON(n) 且 DON(n)-DON(m)≥32768):
don_diff(m,n) = -(DON(m) + 65536 - DON(n))
若 (DON(m) > DON(n) 且 DON(m)-DON(n)<32768):
don_diff(m,n) = -(DON(m)-DON(n))
● 如果 don_diff(m,n) 为正数,则表示传输顺序索引为 n 的 NAL 单元在解码顺序上位于索引为 m 的 NAL 单元之后。
● 如果 don_diff(m,n) 为 0,这两个 NAL 单元的解码顺序可以任意。
● 如果 don_diff(m,n) 为负数,则表示传输顺序索引为 n 的 NAL 单元在解码顺序上位于索引为 m 的 NAL 单元之前。
与 DON 相关字段(DON、DONB 和 DOND,后面有讲解)的取值必须保证按照上述方式确定的解码顺序与实际的 NAL 单元解码顺序相符。
若两个 NAL 单元的顺序发生交换,且新顺序不符合 NAL 单元解码顺序,则这两个 NAL 单元的 DON 值必须不同。
若两个连续的 NAL 单元的顺序发生交换,但新顺序仍符合 NAL 单元解码顺序,则它们的 DON 值可以相同。例如,在视频编码 profile 允许任意片段顺序(arbitrary slice order)的情况下,同一编码图像的所有编码片段的 NAL 单元可以使用相同的 DON 值。因此具有相同 DON 值的 NAL 单元可以任意顺序解码,而具有不同 DON 值的 NAL 单元必须按上述确定的顺序交付给解码器。
当解码顺序连续的两个 NAL 单元 DON 值不同时,建议第二个 NAL 单元的 DON 值等于第一个 NAL 单元的 DON 值加 1。
有关如何解包(de-packetization)恢复 NAL 单元解码顺序的示例,后面讲解。
说明性备注:
即使在无差错传输情况下,接收端也不应期望解码顺序连续的两个 NAL 单元的 DON 值差值绝对值一定等于 1。这是因为在分配 DON 值时,可能无法确定所有 NAL 单元是否能成功到达接收端。
例如,当网络带宽不足时,网关可能不转发非参考图像的编码片段 NAL 单元或 SEI NAL 单元。另一个例子是,在直播过程中可能会插入预编码内容(如广告),预编码片段的第一个帧内图像可能提前传输,以确保接收端能及时获得。在这种情况下,发送端在发送第一个帧内图像时,无法提前准确知道在预编码内容出现之前还有多少NAL单元,因此只能估计其 DON 值,从而可能导致 DON 值出现间隙。
6、Single NAL Unit Packet:
这里定义的单一NAL单元包(Single NAL unit packet) 必须只包含一个在 [1] 中定义的类型的NAL单元。这意味着单一NAL单元包中不能使用聚合包(aggregation packet)或分片单元(fragmentation unit)。通过解包单一NAL单元包(按照RTP序列号顺序),所得到的NAL单元流必须与NAL单元解码顺序完全一致。单一NAL单元包的结构如图2所示。
说明性备注:
NAL单元的第一个字节同时也用作RTP载荷头(payload header)。

7、Aggregation Packets(聚合数据包):
聚合包(Aggregation packets) 是本载荷规范中定义的NAL单元聚合方案。这种方案的引入,是为了适应两种典型目标网络环境中明显不同的 MTU(最大传输单元)尺寸需求:
● 有线 IP 网络:其MTU通常受限于以太网的MTU,大约为1500字节。
● 基于 IP 或非IP的无线通信系统(如ITU-T H.324/M):通常推荐的传输单元尺寸在254字节或更小。
为了避免这两种网络环境之间的媒体转码需求,并减少不必要的分组开销,定义了一种NAL单元聚合方案。
本规范定义了以下两种类型的聚合包:
● 单一时间聚合包 (STAP):
用于聚合具有相同NAL单元时间(NALU-times)的NAL单元。
STAP有两种类型:
○ 不带解码顺序号(DON)的 STAP(STAP-A)
○ 带解码顺序号(DON)的 STAP(STAP-B)
● 多时间聚合包 (MTAP):
用于聚合具有不同NAL单元时间的NAL单元。
MTAP定义了两种不同的类型,其差别在于NAL单元时间戳偏移量(timestamp offset)的长度不同。
每个需要被携带到聚合包中的NAL单元都封装在一个聚合单元(Aggregation Unit) 中。以下将说明四种不同聚合单元的具体特征。 聚合包的RTP载荷格式结构如图3所示:
聚合包的RTP载荷格式结构如图3所示:
MTAP 和 STAP 聚合包共享以下分包规则:
● RTP 时间戳必须设置为聚合包中所有NAL单元时间戳中的最早时间戳。
● NAL单元类型字节的type字段必须根据下表4给定的值进行设置。
● 如果所有被聚合的NAL单元的F位均为0,则聚合包中的F位必须设置为0,否则设置为1。
● 聚合包中的NRI值必须设为聚合包所携带的所有NAL单元中最大的那个NRI值。 表4:STAP与MTAP的Type字段取值:
RTP头部的标记位(marker bit)应设置为:如果聚合包中最后一个NAL单元单独传输在一个RTP包时所应具有的标记位的值。
聚合包的载荷由一个或多个聚合单元(Aggregation units)组成。具体见7.1节和7.2节,这两节定义了四种不同的聚合单元类型。一个聚合包中可以携带任意多个聚合单元,但聚合包中数据的总量必须适合IP数据包的尺寸,其大小应选择为使得最终的IP数据包小于MTU尺寸。
聚合包中不能包含分片单元(fragmentation units,参见后面讲解)。聚合包也不允许嵌套,即聚合包中不能再包含另一个聚合包。
7、1、Single-Time Aggregation Packet (STAP):
当需要聚合多个具有相同NAL单元时间(NALU-time)的NAL单元时,建议使用单一时间聚合包(STAP)。STAP 有两种形式:
● STAP-A:其载荷不包含DON(解码顺序号),至少包含一个单一时间聚合单元,其载荷格式如图4所示。
● STAP-B:其载荷包含一个16位无符号DON(以网络字节序表示),后跟至少一个单一时间聚合单元,其载荷格式如图5所示。
图4. STAP-A 的载荷格式



● STAP-B 中的 DON 字段表示在传输顺序中 STAP-B 内第一个NAL单元的 DON 值。
● STAP-B 中后续的每个NAL单元的 DON 值,依次为前一个NAL单元的DON值加1后再模 65536(即 (前一个 DON + 1) % 65536)。
单一时间聚合单元的结构
每个单一时间聚合单元包括:
● 一个 16位无符号整数,表示该单元中NAL单元的大小(以字节为单位,不包括该2个字节本身,但包括NAL单元的NAL头部字节)。
● 随后的 NAL 单元自身(包含其NAL单元头部字节)。
单一时间聚合单元在RTP载荷中是字节对齐的,但不一定与32位字对齐。其具体结构如图6所示:
图6. 单一时间聚合单元的结构
图7. 一个包含 STAP-A 的 RTP 包示例(包含两个单一时间聚合单元)
图8. 一个包含 STAP-B 的 RTP 包示例(包含两个单一时间聚合单元)

7、2、Multi-Time Aggregation Packets (MTAPs):
MTAP 的 NAL 单元载荷由一个 16 位的无符号解码顺序号基值(DONB)(网络字节序)和一个或多个多时间聚合单元(multi-time aggregation units)组成,如图 9 所示。
DONB 必须包含该 MTAP 中解码顺序最先的 NAL 单元的 DON 值。
说明性注释:
在解码顺序中排在最前的 NAL 单元,不一定是 MTAP 中实际封装顺序的第一个 NAL 单元。
图 9:MTAP 的 NAL 单元载荷格式
本规范定义了两种不同的多时间聚合单元。两者都包含:
● 一个 16 位无符号整数,表示后续 NAL 单元的大小(不包括这两个字节,但包括 NAL 单元类型字节),采用网络字节序;
● 一个 8 位无符号的解码顺序号差值(DOND);
● 一个 n 位的时间戳偏移(TS offset,网络字节序),n 可为 16 或 24 位。
使用 MTAP16 或 MTAP24 的选择取决于具体应用:
时间戳偏移越大,灵活性越强,但开销也更高。
MTAP16 和 MTAP24 的聚合单元结构分别如图 10 和图 11 所示。
聚合单元在 RTP 包中的起始或结束位置不要求按 32 位对齐。
每个聚合单元中所含 NAL 单元的 DON 值由以下公式计算:
DON = (DONB + DOND) % 65536
此规范未规定 MTAP 中 NAL 单元的具体封装顺序,但在大多数情况下应使用解码顺序。
时间戳偏移(TS offset)字段的设定:
● 如果 NALU 时间 ≥ RTP 时间戳,则:
TS offset = NALU 时间 - RTP 时间戳
-
如果 NALU 时间 < RTP 时间戳,则:
TS offset = NALU 时间 + (2^32 - RTP 时间戳)
图 10:MTAP16 的多时间聚合单元结构
图 11:MTAP24 的多时间聚合单元结构
对于 MTAP 中最早的多时间聚合单元,其时间戳偏移值必须为 0,因此 MTAP 自身的 RTP 时间戳与最早的 NALU 时间相同。
说明性注释:
所谓“最早”的多时间聚合单元,是指在 MTAP 中的所有 NAL 单元若分别使用单 NAL 单元包封装时,拥有最小扩展 RTP 时间戳(extended RTP timestamp)的聚合单元。
扩展时间戳指超过 32 位、可处理时间戳回绕(wraparound)的时间戳。 该最早单元可能并不是 MTAP 封装顺序中的第一个,也不一定是 NAL 解码顺序中的第一个。
图 12:一个包含两个 MTAP16 聚合单元的 RTP 包示例
图 13:一个包含两个 MTAP24 聚合单元的 RTP 包示例

8、Fragmentation Units (FUs):
该载荷类型允许将一个 NAL 单元分片成多个 RTP 包进行传输。相比于依赖底层(如 IP 层)进行分片,在应用层进行分片具有以下优点:
● 可将大于 64 KB 的 NAL 单元通过 IPv4 网络传输,这种情况在高清视频(尤其是预录制视频)中很常见。例如由于每张图像的 slice 数有限,限制了每帧图像可用的 NAL 单元数量,从而导致单个 NAL 单元可能会非常大。
● 分片机制允许对单个 NAL 单元进行分片,并应用如第 12.5 节所述的通用前向纠错(FEC)机制。
分片仅定义用于 单个 NAL 单元,不适用于任何聚合包(如 STAP、MTAP)。 一个 NAL 单元的分片应由该单元的连续字节组成,每个字节必须 只属于一个分片。
同一个 NAL 单元的分片必须 按顺序、连续的 RTP 序列号 发送,并且中间不能插入其他 RTP 包。
NAL 单元的重组必须也按照 RTP 序列号顺序进行。
当一个 NAL 单元被分片为多个 FU 载荷时,称为 被分片的 NAL 单元。 STAP 和 MTAP 禁止被分片。FU 不允许嵌套,即一个 FU 包不能包含另一个 FU 包。
携带 FU 的 RTP 包,其 RTP 时间戳应设置为该被分片 NAL 单元的 NALU 时间。
图 14:FU-A 的 RTP 载荷格式

图 15:FU-B 的 RTP 载荷格式(相比 FU-A 多一个 DON 字段)
● FU-B 只能用于交织分包模式(interleaved packetization mode)中,且仅限于某个被分片 NAL 单元的第一个分片。在其他任何情况下 不得使用 FU-B。
换句话说,在交织模式中,每个被分片的 NAL 单元必须由一个 FU-B 开始,后跟一个或多个 FU-A。
FU 指示符(FU indicator)字节结构如下:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
● Type 值为 28 表示 FU-A,29 表示 FU-B
● F 位的含义前面有说
● NRI 值应与被分片的原始 NAL 单元一致
FU 头(FU header)结构如下:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
● S(Start,1位):为 1 表示该分片为该 NAL 单元的起始片,否则为 0
● E(End,1位):为 1 表示该分片为该 NAL 单元的结束片,否则为 0
● R(Reserved,1位):保留位,必须为 0,接收端也必须忽略它
● Type(5 位):表示原始 NAL 单元的 type 类型(参见 H.264 规范 Table 7-1)
● FU-B 中的 DON 字段应根据第 5.5 节的规定设定
说明: FU-B 中的 DON 字段使得中继设备可以对 NAL 单元进行分片,而不需要将其按照解码顺序重新组织。
一个被分片的 NAL 单元 不能只用一个 FU 来传输,即:S 和 E 位不能同时为 1。必须至少分两个片。
FU Payload(FU 载荷):
● 是原始 NAL 单元去除 NALU 头部后的分片数据。
● 原始 NAL 单元的 NALU 头部信息通过 FU indicator 的 F 和 NRI 字段,以及 FU header 中的 Type 字段传达。
● FU Payload 可以包含任意数量的字节,甚至可以为空。
说明性备注:
空的 FU(即 FU 载荷长度为 0)是被允许的,这是为了降低某类发送端在几乎无丢包环境下的延迟。这类发送端的特点是:在 NALU 还未完全生成,甚至还不知道完整大小时就开始分片发送。
如果不允许零长度片段,则发送端必须至少生成后续片段的一位数据,才能发送当前片段。由于 H.264 中某些宏块可能占用 0 位,这种机制可能带来不必要的延迟。
然而,是否使用空片段应权衡考虑,因为发送更多分片将增加因丢包而导致整个 NALU 丢失的风险。
丢包处理:
● 如果某个 FU 丢失,则接收端应丢弃 该 NAL 单元的所有后续分片。
● 接收端(终端或 MANE)也可以在未接收到最后一个分片的情况下,将前 n-1 个分片组合为不完整的 NAL 单元。
在这种情况下,forbidden_zero_bit(F 位)必须设置为 1,以表明该 NAL 单元存在语法错误。
文章参考学习:
https://www.rfc-editor.org/rfc/rfc6184
795

被折叠的 条评论
为什么被折叠?



