html5 购物网站,cms网站制作,公司网站建设好,昆明网站开发报价H.264视频流的RTP封装类型分析#xff1a;
前言#xff1a;
1.RTP打包原则#xff1a; RTP的包长度必须要小于MTU(最大传输单元)#xff0c;IP协议中MTU的最大长度为1500字节。除去IP报头#xff08;20字节#xff09;、UDP报头#xff08;8字节#xff09;、RTP头
前言
1.RTP打包原则 RTP的包长度必须要小于MTU(最大传输单元)IP协议中MTU的最大长度为1500字节。除去IP报头20字节、UDP报头8字节、RTP头12字节所有RTP有效载荷即NALU内容的长度不得超过1460字节。 NULL Hearder简介(结构如下) ---------------|0|1|2|3|4|5|6|7|--------|F|NRI| Type |---------------
Fforbidden_zero_bit 占1位在 H.264 规范中规定了这一位必须为 0NRInal_ref_idc 占2位取值从0到3指示这个 NALU 的重要性取值越大约重要Typenalu是指包含在 NAL 单元中的 RBSP 数据结构的类型其中0未指1-19在264协议中有定义20-23为264协议指定的保留位。24-29在RFC3984中进行了指定。其中STAP-A为24FU-A为28。
其中Type详细介绍前文以叙述RFC3984: RTP Payload Format for H.264 Video(中英文版)官方文献RTP协议头格式分析详解RTP载荷H264码流 其中我们看到1-11就是NALU的单个包类型但是一个NALU的大小是不一样的如果是非视频数据的SPS PPS才十几个字节对于IDR帧则有可能几十KB。这样把NALU打包到RTP方式就很多分为一个RTP包承载一个NALU多个NALU合并到一个RTP一个大的NALU切分成多个RTP。同时由于时间戳的问题就有了24-29几种类型。 但是对于发送端组RTP包的一方来说尽可能找简单的打包方式。对于接受端则需要适配各种发送端的打包方式因为无法决定输入源的打包方式。这里先分享下我们的打包方式比较简单
我们对于NALU的长度1400的则采用的是单一NALU打包到单一的RTP包中我们对于NALU的长度1400的则采用了FU-A的方式进行了打包这种就是把一个大的NALU进行了切分最后接收方则进行了合并把多个RTP包合并成一个完整的NALU即可至于为什么NALU的长度大于1400字节就要进行FU-A切片是因为底层MTU大小值固定为1500从传输效率讲这里用1400作为切分条件。
2.RTP打包模式
主要分为三种模式单一NALU模式、分片模式、组合模式实际中前两种用的比较多。
一、单一NALU模式分析
1.单一NALU模式结构如下 0 1 2 30 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 |--------------------------------
2.抓包对照分析 二、分片包模式分析
1.FU-A和FU-B的结构如下
// 5.8. Fragmentation Units (FUs) (p29)
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 |
-------------------------------- 注意STAP-A和FU-A的RTP荷载结构不包含DON(解码顺序号). STAP-BFU-B结构包含DON。
与单一封包不一样的是|F|NRI|type|变成了|FU indicator|FU header|。其实|FU indicator|就是|F|NRI|type|但是额外增加了|FU header|用于标识当前分片的状态如下所示 // FU header 结构如下---------------|0|1|2|3|4|5|6|7|--------|S|E|R| Type |---------------
S: 1 bit 当设置成1,开始位指示分片NAL单元的开始。当跟随的FU荷载不是分片NAL单元荷载的开始开始位设为0E: 1 bit 当设置成1, 结束位指示分片NAL单元的结束即, 荷载的最后字节也是分片NAL单元的最后一个字节。当跟随的FU荷载不是分片NAL单元的最后分片,结束位设置为0R: 1 bit 保留位必须设置为0接收者必须忽略该位Type: 5 bits NAL单元荷载类型定义在[1]的表7-1(与前文中的type一致不做展开)。
2.抓包对照分析以FU-A为例 三、组合包封装模式分析
1.STAP-A结构如下(type 24)
当NALU的长度特别小时可以把几个NALU封在一个RTP包中。下面的是STAP-A模式如果是STAP-B的话会多加入一个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 -------------------------------- | 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 |--------------------------------图 STAP-A RTP包包含一个STAP-A. STAP包含两个单时刻聚合单元2.STAP-B结构如下(type 25) 0 1 2 30 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 |--------------------------------图STAP-B 一个RTP包包含一个STAP-B. STAP包含两个单时刻聚合单元例子
RTP Header(1 byte)RTP协议头前文有叙述不做展开STAP-(A/B) NAL HDR()STAP-(A/B)帧头与前文的|F|NRI|type|结构一致DON解码顺序号STAP-A帧不包含DONSTAP-B帧的话则会多加入一个DON域
例如有一个 H.264 的 NALU 是这样的:
[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]
[00 00 00 01 68 42 B0 12 58 6A D4 FF ... ]
封装成 RTP 包将如下:
[ RTP Header ] [78 (STAP-A头占用1个字节)] [第一个NALU长度 (占用两个字节)] [ 67 42 A0 1E 23 56 0E 2F ... ] [第二个NALU长度 (占用两个字节)] [68 42 B0 12 58 6A D4 FF ... ]