H.264视频的RTP负载格式
1介绍-----------------------------------------------------------
一个nal单元由一字节的头和负载字节组成
h.264的一个主要特性是传输时间,解码时间,图像有片断采样时间完全解耦合
参数集概念-------------------------------------------------------
h.264规范包含两类参数集:
顺序参数集
图像参数集
参数集结构包含 :图像大小,采用的可选的编码模式,宏块到片断组映射等信息
网络抽象层单元类型-------------------------------------------------
nal的设计信息?????????????
所有nal单元有一个单个nal单元类型字节,也作为rtp负载格式的负载头,后加nal单元的负载
nal单元字节的结构语义
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
f: 1bit forbidden_zero_bit H.264规范声明设置为1,指示语法违例
nri: 2bit 值为00时指示nal单元的内容不用于重建引用图像的帧
大于00时要求维护引用图像的完整性
type: 5bit nal_unit_type 本部件指定nal单元负载类型定义
定义和缩写
don(decoding order number):解码顺序号
donb:
dond:解码顺序号差
fec:向前纠错
fu:分片单元
idr:舜间解码刷新
mane:美提感知网络元素
mtap:多时刻聚合包
mtap16:16位时戳位移
mtap24:24位时戳位移
nal网络抽象层
nalu:nal单元
sei:被充增强信息
stap:单时刻聚合包
stap-a:stab类型a
stap-b:stab类型b
ts:时间戳
vcl:视频解码层
RTP 负载格式
RTP头的使用(再看一看rtp头吧)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 1. RTP 头。
对RTP头作如下设置:
maker_bit(M): 1bit
对RTP时间戳指示的访问单元的最后一个包位进行设置
允许有效缓冲处理布局
对于聚合包(stap,mtap) m位必须设置成最后一个NAL单元
如果传送在单个RTP包中
注:运送多个nal单元的聚合包只有一个M位相关联, 如果一个网关重新打包一个聚合包为几个包,M位的设置就会显得不可靠
playload type(pt): 7bit
sequece number(sn):16bit
对于单个nalu与非交错打包方式,序号用于nalu解码顺序
timestamp:32bit
设置为内容的采样时戳,必须使用90khz的时钟频率
如果nal单元没有自已的时间戳设置成访问单元主编码图象的时间戳
接收者应该忽略包含在访问单元的任何图像时间SEI消息,通过rtp时戳同步显示过程
注:因为h.264允许解码顺序可以和显示顺序不同,RTP时戳的值对于RTP的序号可以不是单调非减的
RTP负载格式的公共结构-------------------------------------------
可以通过rtp负载的第一个字节来识别负载结构
单个nal单元包 (h264需要的rbsp)
聚合包:
stap-a聚合包a (nal单元的大小为65535)
stap-b聚合包b
mtap16
mtap24
分片单元:
FU-A分片单元fu-a
FU-B分片单元fu-b
Table 1. 单元类型以及负载结构总结
单元类型号
Type Packet Type name Section
---------------------------------------------------------
0 undefined -
1-23 NAL unit Single NAL unit packet per H.264 5.6
24 STAP-A Single-time aggregation packet 5.7.1
25 STAP-B Single-time aggregation packet 5.7.1
26 MTAP16 Multi-time aggregation packet 5.7.2
27 MTAP24 Multi-time aggregation packet 5.7.2
28 FU-A Fragmentation unit 5.8
29 FU-B Fragmentation unit 5.8
30-31 undefined -
注:没有限制单封装在单个nal单元包和分片单元的大小
封装在聚合包nal单无的大小为(65535)
nal单元字节的使用-------------------------------------------------
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
f:1bit forbidden_zero_bit
nri: 2bit nal_ref_idc
0值和非0值与h264规范一样
大于00的nri值指示相对传输优先级
最高优先级是11,依次为10-01 ,00最低
注:任何非零的nri在h.264解码器的处理是相同的,接收者在传送nal单元给解码器时不必操作nri的值
nal单元类型的值:
h.264编码器必须要据h264的规范设置nri值
当nal_unit_type范围是1到12
在h.264规范要求对于nal_unit_type为6,9,10,11,12的nal单元的nri值为0
nal_unit_type为7,8的nal单元的nri值为11,nal单元里封装有是(序列参数集和图像参数集)
nal_unit_type为5的nal单元的nri值为11
注:在某些profile中数据分区不可用,在main或baseline profiles
如果nal 单元类型2,3,4出现在视频流符合数据分区被允许的profile情况下
不会出现在符合main/baseline profile
Table 2. 编码片和主编码参考图像数据分区的编码片的NRI值的例子
NAL Unit Type Content of NAL unit NRI (binary)
----------------------------------------------------------------
1 non-IDR coded slice 10
2 Coded slice data partition A 10
3 Coded slice data partition B 01
4 Coded slice data partition C 01
注释: 像以前提起的, 非参考图像NRI值是00.
h.264编码器应该设置冗余编码参考图像的编码片和编码片分区nal单元的nri值为01
nal单元类型(nal_unit_type)24-29的nri的定义??????????????
nal单元类型(nal_unit_type)13-23的nri的值,这些值保留给itu-t,iso/iec
nal单元类型(nal_unit_type)0,30,31的nri的值,没有指定
打包方式------------------------------------------------------------------
1 单个NAL单元方式 常规系统,兼容itu-t h.261
2 非交错方式 可以不符合ITU-T H.241建议.在非交错方式, NAL单元按照NAL单元解码顺序传送
3 交错方式 不要求非常低端到端延迟的系统,允许传送NAL单元不按照NAL单元解码顺序
设置打包方式:通过optional packetization-mode mime的值指定
每个打包方式允许的NAL单元类型总结(yes = 允许, no = 不允许, ig = 忽略)
单个nal方式 非交错方式 交错方式
Type Packet Single NAL Non-Interleaved Interleaved
Unit Mode Mode Mode
-------------------------------------------------------------
0 undefined ig ig ig
1-23 NAL unit yes yes no
24 STAP-A no yes no
25 STAP-B no no yes
26 MTAP16 no no yes
27 MTAP24 no no yes
28 FU-A no yes yes
29 FU-B no no yes
30-31 undefined ig ig ig
解码顺序号don-------------------------------------------------------------
在交错打包方式,nal单元的传输顺序允许和nal单元的解码顺序不同
解码顺序号是负载结构中的一个域或一个获得变量指示nal单元的解码顺序
(按解码顺序传输)
传输和解码顺序的耦合由optional sprop-interleaving-depth mime参数控制
如果optional sprop-interleaving-depth mime该值等于0,或者外部手段不允许nal单元顺序和解码顺序不同,此时传输顺序和解码顺序必需一致
如果允许不一致:
mtap16/mtap24中的nal单元顺序不要求是
两个连续包中的stap-b,mtap,fu解嵌套产生的nal单元序号不要求是nal单元解码序号
stap-a和fu-a的负载结构中不含don
stap-b和fu-b的负载结构包含 don
注:当fu-a出现在交错方式,后面总跟一个fu-b,设置自已的don
想封装单个nal单元,且每个包都不按照他们的解码顺序 可以使用stap-b包
单个nal单元打包:传输顺序由rtp序号确定,必须要nal单元解码顺序一致
非交错打包方式:在单nal单元包 stap-a fu-a中nal单元的传输顺序必须和解码一致
解码顺序首先由stap隐含顺序提供,再次由rtp序号提供
在传送STAP-B MTAP和FU-B开始的一些列分片单元中的nal单元的don值?????????????
传输顺序中的nal单元,可以设置成任何值,0-65535 循环
在传送STAP-B MTAP和FU-B开始的一些列分片单元中的nal单元的don值按如下:
DON(i)是索引为i传输顺序的解码顺序号. 函数don_diff(m,n)定义如下:
If DON(m) == DON(n), don_diff(m,n) = 0
If (DON(m) < DON(n) and DON(n) - DON(m) < 32768),
don_diff(m,n) = DON(n) - DON(m)
If (DON(m) > DON(n) and DON(m) - DON(n) >= 32768),
don_diff(m,n) = 65536 - DON(m) + DON(n)
If (DON(m) < DON(n) and DON(n) - DON(m) >= 32768),
don_diff(m,n) = - (DON(m) + 65536 - DON(n))
If (DON(m) > DON(n) and DON(m) - DON(n) < 32768),
don_diff(m,n) = - (DON(m) - DON(n))
don相关的值:
don
donb
dond
如果两个nal解码单元顺序的nal单元交换,新序号不符合nal单元解码顺序,nal单元不能有相同的don值,反之可以相同
例如: 当使用的视频编码profile允许任意分片顺序,一个编码图像的所有编码片的nal单元可以有相同的don值,可以按照任何顺序解码,如果有不同的don值的nal单元应该按照指定的顺序传递给解码器
连接的nal单元如果有不同的don值,don的值应该是递增的,但不决对是加1
解包过程恢复NAL单元解码的例子??????????????????????????????
单个NAL单元包----------------------------------------------------------
单个nal单元包必须只包含一个类型定义在nal单元
一个封装单个nal单元包到rtp的nal单元流的rtp序号必须符合nal单元的解码顺序
注: NAL单元的第一字节和RTP负载头第一个字节重合。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F|NRI| type | |
+-+-+-+-+-+-+-+-+ |
| |
| Bytes 2..n of a Single NAL unit |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Figure 2. 单个NAL单元包的RTP负载格式。
聚合包--------------------------------------------------------------
nal单元聚合安排
本规范定义的两类聚合包:
单时间聚合包STAP: 聚合相同nalu时间的nal单元,
stap-a 包含don
stap-b 不包含don
多时间聚合包MTAP:聚合具有差异nalu时间的nal单元
MTAP16 nal单元时戳位移长度为:16位
MTAP24 同上,24位
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F|NRI| type | |
+-+-+-+-+-+-+-+-+ |
| |
| one or more aggregation units |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 3. 聚合包的RTP负载格式。
mtaps和staps公用以下打包规则:
rtp时戳必须设置为被聚合nal单元中最早nalu时间,具体类型域的设置如下表
表 4. STAPs和MTAPs的类型域
Type Packet 时戳位移域长度(位)DON相关的域(DON, DONB, DOND)是否存在
--------------------------------------------------------
24 STAP-A 0 no
25 STAP-B 0 yes
26 MTAP16 16 yes
27 MTAP24 24 yes
如果聚合单元的F位为0,f位必须清除,否则必须设置,nri的值必须是运送在聚合包中nal单元的最大值
RTP头的maker位置为聚合包中最后nal单元
聚合包的负载由一个或多个聚合单元组成(单时间(stap-a/stap-b),多时间(mtap-a/mtap-b)),一个聚合包可以传送多个聚合单元
一个聚合包不可以包含指定的分片单元,聚合包不可以嵌套
单时间聚合包------------------------------------------------------
应用场景:
当聚合在一起的nal单元使用相同的nalu时刻
stap-a负载不包括don,至少要包含一个单时刻聚合单元
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: |
+-+-+-+-+-+-+-+-+ |
| |
| single-time aggregation units |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 4. STAP-A负载格式
stap-b负载包含一个16位的无符号解码顺序号(don),(网络字节序),至少要一个单时刻聚合单元
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: decoding order number (DON) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| single-time aggregation units |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 5. STAP-B 负载格式
don域:指定STAP-B传输顺序中第一个nal单元的don值,对于后续出现的stap-b中的nal单元,don的值等于(stap-b的前一个nal的don值—+1)%65535
单时刻聚合单元有一个16位无符号大小信息(网络字节序),用于指示紧跟其后的nal单元的大小,(不包含这两个字节,但包含单元类型字节)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: NAL unit size | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| NAL unit |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 6. 单时刻聚合单元的结构
一个RTP包包含一个STAP-A,STAP包含两个单时刻聚合单元
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAP-A NAL HDR | NALU 1 Size | NALU 1 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Data |
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 Size | NALU 2 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 Data |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 7. RTP包包含一个STAP-A. STAP包含两个单时刻聚合单元
一个rtp包包含一个stap-b,stap包含两个单时刻聚合单元
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|STAP-B NAL HDR | DON | NALU 1 Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Size | NALU 1 HDR | NALU 1 Data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 Size | NALU 2 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 Data |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 8. 一个RTP包包含一个STAP-B. STAP包含两个单时刻聚合单元例子
多时刻聚合包----------------------------------------------------
多时刻聚合包的nal单元负载有:
1 16位的无符号解码顺序号基址(donb),donb必须包含mtap时的nal单元的 第一个nal的don值
2 (网络字节序)
3 一个或多个时刻聚合单元
注:nal解码顺序中的第一个nal单元不必是封装在mtap中的第一个nal单元
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: decoding order number base | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| multi-time aggregation units |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 9. MTAP的NAL单元负载格式
本规范定义了两个多时刻聚合单元,
mtap16
mtap24
两类单元都包含以下内容:
16位的无符号大小信息
一个8位无符号解码序号差值(dond)
n位时戳位移(可以是16/24),时戳位移越大,mtap灵活性越大
一个包中的聚人合单元开始到结束不要求位于32位的边界
don的值等于(donb+dond)%65535
大多数情况下使用nal单元解码顺序
时戳位移域
如果nalu-time大于包的rtp时戳,则时戳位移=(nalu-time-包的rtp时戳)
如果malu-time小于包的rtp时戳,时戳位移=nalu-time+(2~32-包的rtp时戳)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: NAL unit size | DOND | TS offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TS offset | |
+-+-+-+-+-+-+-+-+ NAL unit |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 10. MTAP16多时刻聚合单元
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: NALU unit size | DOND | TS offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TS offset | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| NAL unit |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 11. MTAP24多时刻聚合单元
一个mtap中最早的聚合单元时戳位移必须为0,mtap的rtp时戳和最早的nalu-time相同
一个rtp包包含一个多时刻mtap16类型的聚合包, 聚合包包括两个多时刻聚合单元
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|MTAP16 NAL HDR | decoding order number base | NALU 1 Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Size | NALU 1 DOND | NALU 1 TS offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 HDR | NALU 1 DATA |
+-+-+-+-+-+-+-+-+ +
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 SIZE | NALU 2 DOND |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 TS offset | NALU 2 HDR | NALU 2 DATA |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 12. 一个RTP包包含一个多时刻MTAP16类型的聚合包,包括两个多时刻聚合单元
一个rtp包包含一个多时刻mtap24类型的聚合包,聚合包括两个多时刻聚合单元
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|MTAP24 NAL HDR | decoding order number base | NALU 1 Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 1 Size | NALU 1 DOND | NALU 1 TS offs |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|NALU 1 TS offs | NALU 1 HDR | NALU 1 DATA |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
: :
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | NALU 2 SIZE | NALU 2 DOND |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 TS offset | NALU 2 HDR |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NALU 2 DATA |
: :
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 13. RTP包包含一个多时刻MTAP24类型的聚合包,包括两个多时刻聚合单元
分片单元fus----------------------------------------------------------
本负载类型允许分片一个nal单元到几个rtp包中,在应用层分片的好处在于:
1 负载中nal单元大于64k字节,可以在ipv4网络中进行传输
2 分派机制允许分片单个图像,采用一般向前的纠错
分片只定义于单个nal不用于任何聚合包
nal单元的一个分片由整数个连续nal单元字节组成
相同的nal单元的分片必须递增的RTP序号连序发送
nal单元必须按照RTP序号顺序装配
fus不可以嵌套
运送fu的RTP时戳被设置成人片nal单元的nalu时刻
fu-a的RTP负载格式------------------------------------------------
由1个字节的分片单元指示
一字节的分片单元头
分片单元负载
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FU indicator | FU header | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| |
| FU payload |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 14. FU-A的RTP负载格式
fu-b的RTP负载格式------------------------------------------------
一字节的分片单元指示
一字节的分片单元头
解码顺序号
分片单元负载
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FU indicator | FU header | DON |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
| |
| FU payload |
| |
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| :...OPTIONAL RTP padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 15. FU-B的RTP负载格式
对于分片nal单元的第一个分片:
如果是交错打包方式,必须使用fu-b(即它作为第一个分片)后面跟的是一个或多个fu-a 分片
FU指示字节有以下格式(FU indicator):
+---------------+
|0|1|2|3|4|5|6|7|
+:-+-+-+-+-+-+-+-+
|F|NRI| Type |
+---------------+
fu指示字节的类型域:
fu-a 28
fu-b 29
NRI的值必须跟据分片nal单元NRI的值设置
fu头格式( FU header):
FU头的格式如下:
+---------------+
|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+
|S|E|R| Type |
+---------------+
s: 1bit 当设置成1,开始位指示分片nal单元的开始
如果跟随的fu负载不是分片单元的开始,则设置为0
e: 1bit 当设置成1,结束位指示分片单元的结束,
即负载的最后字节也是分片nal单元的最后字节
反之,则设为0
r: 1bit 保留位必须设置为0,接收者必须忽略该位
type: 5bit nal单元的负载类型
注: fu-b中的don域允许网关分片nal单元到fu-b而不用组织进来的nal单元到nal单元解码顺序
一个分片单元不可以传输在一个fu中,即开始位和结束位不可以被同时设置在同一个fu中
一个fu负载可以有任意字节也可为空
如果一个分片单元丢失,接收者应该丢弃后续的所有分片单元,即相同分片nal单元的传输顺序的分片
接收者可以聚合前一个nal单元的n-1分片到一个不完全的nal单元,这时forbidden_zero_bit必须设置为0
打包规则-----------------------------------------------------------
所有的打包方式,发送者必须遵守的打包规则:
1 属于同一编码图象(相同的rtp时戳)的编码nal单元,可以任何顺序发送
2 参数集
3 manes不可以重复任何nal单元,除了顺序和图像参数集nal单元
使用非交错方式和交错方式:
manes可以转换单个nal单元包到一个聚合包,转换一个聚合包到几个单个nal单元包
单个nal单元模式:
应用在optional打包方式mime参数等于0,不包含打包方式,
主要应用低延迟应用,只有单个nal单元可以用, staps mtaps fus不可以使用
传输顺序必须和nal解码顺序一致
非交错方式
在optional打包方式mime参数值等于1,主要应用于低延迟应用
本方式只允许单个nal单元包,stap-as fu-as,
stap-bs,mtaps,fu-bs不可以使用
传输顺序必须和nal解码顺序一致
交错方式:
本方式应用在optional打包方式mine参数值等于2
stap-bs mtaps fu-as fu-bs可以使用
stap-as和单个nal单元包不可以使用
打包过程--------------------------------------
单个nal和非交错方式
接收者存储起来的包按照接收顺序存储在接收缓冲区中
包被解封装,按照rtp序号的顺序,如果是单个nal单元包,nal单元直接传递给解码器
如果是一个stap-a,包含在包中的nal单无按照在包中的顺序传递给解码器
如果是一个fu-a,所有的分片nal单元的单元分片连接在一起传递给解码器
交错方式:
重新排序nal单元从传输顺序到nal单元解码顺序
接收者有一个接收缓冲区来补尝传输延迟抖动
还有个解交错缓冲
如何计算交错缓冲区的大小 (解交错缓冲区的大小)
在sdp offer/answer模型中,
接收者可以分配一个解交错缓冲区,使用deintbuf-cap mime参数
发送者指示解交错缓冲区大小的要求,使sprop-deint-buf-req mime参数
因此设置解交错缓冲区大小>=sprop-deint-buf-req mime参数指定的值
(解交错过程)
指定接收过程如何组织接收到nal单元到nal解码顺序
在接收者中有两种缓存状态:
初始缓冲 发生成rtp会话初始化时,
正在播放缓冲
常用函数:
absDON
don_diff
常数n 是optional sprop-interleaving-depth mime类型参数的值
初始缓冲持续直到以下条件完成:
1 在解交错缓冲区中有 n vcl(视频编 码层) nal单元
2 如果sprop-max-don-diff存在,don_diff(m,n)大于sprop-max-don-diff的值
n对应所有接收到的nal单元中最大absDON值的nal单元
m对应最小
3 初始缓冲区持续时间>= optional sprop-init-buf-time mime参数指定的值
要从解交错缓中区删除的nal单元的确定:
1 如果解交错缓冲区包含至少n个vcl nal单元,nal单元从解交错缓冲区移到解码器
按下面的次序,直到中包含n-1 vcl nal单元
2 如果sprop-max-don-diff存在,他们的don-diff(m,n)大于sprop-max-don-diff大 于sprop-max-don-diff的从解交错缓冲区移出传送给解码器
nal单元传递给解码器的顺序:
1 rtp会话开始时 初始化pdon为0
2 计算每个关联don的nal单元的don距离
如果nal单元的don大于pdon的值,don=don-pdon
否则,don=65535-pdon+don+1
3 nal单元分发给解码器按照don距离递增的顺序,如果don相同,可按任意顺序传送
4 当一定数目的nal单元传递给解码器,pdon的值设置为传给解码器最后一个nal单元的don值
附加打包规则
实现一个可操作的h.264打包器:
1 智能rtp接收者 可以识别丢失的编码片断数据分区a(dpas),如果发现丢失dpa
网关可以决定不发送对应的编码片断数据分区b和c,
2 智能rtp接收者 可以识别丢失的fu,如果发现丢失一个fu.网关可以决定不发送同 同一个分片nal的后续fu
3 不得不丢弃包或nalu的智能接收者应该首先丢弃所有nal单元中所有nal单元类型 中nri的值等于0的包