详解RTP协议之H264封包细节(1)( 二 )
文章插图
上图序号中的28、29、30数据包是SPS、PPS、SEI这三种NALU , 在接收端 , 采用的?个NALU拆分到?个RTP包 , 在发送端 , 这是单?打包?式 。
上图序号中的31、32三个RTP包分别传输了IDR帧的NALU单元 , 由于?较? , 发送?采?了FU-A的打包?式 。
上图还显示了SPS、PPS、SEI的RTP包固定头 , Seq初始值不为0 , 为随机值 , 并且?个RTP包就顺序+1 , 这跟上?分析的?致 。
上?SPS、PPS、SEI本身不涉及时间戳 , 但是它们与第一个RTP包的时间戳是一致 。 同样IDR的NALU切分的不同RTP包时间戳也是?样的 。
2.5 WireShark抓包分析
(1)Single NAL Unit
?个RTP包打包?个单独的NALU?式 , 其实最好理解 , 就是在RTP固定头后?直接填充NALU数据 。 RTP打完包就是如下结构 , RTP Header+NALU Header+NALU Data 。
注意:这里的NALU Data一般是不包括startcode 。
进?了抓包和写?件 , 我们发现写?件的SPS和抓包RTP包固定头后?的负载完全是?致的 , 写?件中的SPS 。
文章插图
抓包中的RTP固定头后?的SPS:
文章插图
(2)FU-A
这种打包?式也不复杂 , 为了解释清楚 , 要了解下?两个数据包头即FU indicator和Fu header 。
FU indicator如下图所示:
文章插图
上图的的F和NRI已经在NALU的Header解释清楚了 , 就是NALU头的前?三个bit位 , 后面的Type值就是28 , 表示为FU-A , 这样在RTP固定头后?第?字节的后?5bit提取出来就确认了该RTP包承载的不是?个完整的NALU , 是其?部分 。
有个问题就是 , ?个NALU切分成多个RTP包传输 , 那么到底从哪?开始哪?结束呢?可能有?说RTP包固定头不是有mark标记么 , 注意区分 , 那个是帧图像的结束标记 , 这?要确定是NALU结束的标记 , 其次NALU的类型呢?就需要RTP固定12字节后?的Fu Header来进?区分 。
2.6 FU header字段说明
FU header如下图所示:
文章插图
(1)S:1 bit 当设置成1 , 开始位指示分?NAL单元的开始 。 当跟随的FU荷载不是分?NAL单元荷载的开始 , 开始位设为0 。
(2)E:1 bit 当设置成1 , 结束位指示分?NAL单元的结束 , 荷载的最后字节也是分?NAL单元的最后?个字节 , 当跟随的FU荷载不是分?NAL单元的最后分?,结束位设置为0 。
(3)R:1 bit, 保留位必须设置为0 , 接收者必须忽略该位 。
(4)Type:5 bits , 此处的Type就是NALU Header中的Type , 取前面表中的1-23的那个值 , 表示 NAL单元荷载类型定义 。
综上所述 , 对于?较?的NLAU进?FU-A切?时 , 其中NALU的Header字段在RTP打包时划分为两个字节 , 记住以下2点 。
第一 , NALU header的前3bit为RTP固定头后?第?个字节是FU-indication的前3bit , 后?5bit后?跟了FU-A打包这种类型28 。
第二 , NALU header的第2个字节后?5bit变成了RTP固定头第?字节的后?5bit,其中前3bit标识了分?的开始和结束 。
2.7 举例说明
为了验证这种打包?式 , 我们同样进?了写?件和抓包 , 对第?个IDR帧的NLAU采取的这种分?进?了研究 。
这里的FU indication的十六进制是0x7C , ?进制就是0111 1100 。 FU header的?六进制是0x85 , ?进制就是0111 1100 , 表示S和E是1 和0 , 则说明该RTP包承载的NALU的第?个切? 。
这样提取FU indication字节的前3bit位和Fu header字节后5bit位则为0110 0101 , 即0x65这刚好符合IDR帧的NALU Header定义 , 后?的b8 00 00 03等?进制就是NALU的DATA字段 。
文章插图
建议:对这个图和上面的文字 , 就可以理解当数据帧比较大时 , 切成多个RTP包时 , 怎样标记开始和结束 。
第?个IDR帧的NALU , 第?个切? , 如下:
文章插图
这里的FU indication的十六进制是0x7C , ?进制就是0111 1100 。 FU header的?六进制是0x05 , ?进制就是0000 0101 , 表示S和E是0 和0 , 则说明该RTP包承载的NALU的中间切? 。 按照上述同样的方法提取 , 则NALU Header的?进制为0110 0101即0x65 , 同样说明是IDR帧类型 , 类似这种的中间切?有很多 , 从31-56RTP包都是中间切? , 直到最后?个NALU的切? 。
第?个IDR帧的NALU最后?个切?:
文章插图
- 协议|喜讯丨热烈祝贺众科联与顺笑拍、喜到家签订合作协议
- 中国|中国软件国际与深圳市政府达成战略合作协议 助力打造“创新之都“
- 美通社|Semiconlight与华灿光电签署倒装芯片专利授权协议 | 倒装
- 芯片|韩国Semiconlight与华灿光电签署倒装芯片专利授权协议
- 编程猫领衔,9家编程app测评一览详解
- 详解m3u8协议
- “5G+智慧文旅”来啦!青岛市文化和旅游局与青岛移动签署“5G+智慧文旅”战略合作协议
- Django实战016:django中使用redis详解
- 简单介绍Protobuf协议
- redis 数据类型详解 以及 redis适用场景场合