首页 > 其他分享 >RTP封装h264,结合webrtc抓包分析

RTP封装h264,结合webrtc抓包分析

时间:2023-01-21 10:23:00浏览次数:55  
标签:00 nalu .. h264 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

作者:拔萝卜的大灰狼
链接:https://zhuanlan.zhihu.com/p/402346767
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一 简介

h264是目前使用较为广泛视频编码格式,由于其低码率,高质量,网络适应强等特点,包括监控,会议,教育等场景。而常见的媒体传输中不会直接传输h264数据,需要经过一系列封装后,再进行传输。比如webrtc中是将h264封装为rtp,国标28181是先将h264进行ps封装,再将ps流进行封装成rtp,rtmp协议则需要将h264封装为视频tag进行传输。本文简介rtp直接封装h264,其详细定义在rfc3984

二 封装头的扩展

rtp封装h264既对h264中nalu进行封装。封装过程中,rtp包头和nalu头中的type字段附加了一定的扩展含义。

各字段原始定义描述点击链接查看,RTP协议封装抓包分析,下面简述rtp在封装h264时的字段特定含义。

2.1 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             |
      |                             ....                              |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

其中额外扩展含义字段

Marker bit (M): 1 bit

为0表示当前rtp包中数据为nalu的一个片段,且该包非最后一个片段,当该值为1时表示一个nalu的最后片段,或表示该包包含一个完整的nalu。

Payload type (PT): 7 bits

表示数据类型。该值的定义需要通过外部信令模块定义,无法从原有的定义文档中查找。比如webrtc中就通过sdp来定义。

Sequence number (SN): 16 bits

表示该rtp的封装和解封装顺序,当一个nalu被分成多个rtp包时,需要使用该值进行排序后,再进行封装和解封装。

Timestamp: 32 bits

必须使用90hz的采样率来表示时间戳。既h264中的数据都为90hz的采样率。如果NAL单元没没有自己的时间戳(例如,参数集和SEI-NAL单元),设置为关键帧时间戳。

2.2 nalu头部

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+

F: 1 bit

forbidden_zero_bit,h264语法规定值为0。rtp封包中,当检测到值为1时,则表示该nalu中已出现错误。

NRI: 2 bits
nal_ref_idc, 当值为00时,表示后面的负载可以丢弃,并不会影响正常解码,当大于00时后面的该包丢弃会影响解码,不可丢弃。rtp封包中,该值也表示该数据包的重要性,11为重要性最高。

Type: 5 bits

nal_unit_type,nalu的类型,h264文档中定义为

nal_unit_type含义
0 未定义
1 非IDR图像中不采用数据划分的片段
2 非IDR图像中A类数据划分片段
3 非IDR图像中B类数据划分片段
4 非IDR图像中C类数据划分片段
5 IDR图像的片段
6 补充增强信息 (SEI)
7 序列参数集/SPS
8 图像参数集/PPS
9 分割符
10 序列结束符
11 流结束符
12 填充数据
13 – 23 保留
24 – 31 未定义

在rtp封包中nal_unit_type 附加的扩展含义:

      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

1-23为原h264中规定的类型,而24及以后的为rtp扩展含义。

上述大致可分为4类

1-23 单一时间数据包,一个rtp包中只包含一个nalu。

24-25 单一时间组合包,一个rtp包含多个同一时间nalu。

26-27 多时间组合包,一个rtp包含多个时间片的多个nalu。

28-29 分片组合,多个rtp包才能组合成一个完整的nalu。

 

三 rtp封装nalu

3.1 单一时间数据包

当nalu较小,一个rtp包即可传输时,可在单个rtp包中只包含一个nalu,进行发送。

一个rtp中只包含一个nalu,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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          RTP Header                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |F|NRI|  type   |                                               |
      +-+-+-+-+-+-+-+-+                                               |
      |                                                               |
      |               Bytes 2..n of a Single NAL unit                 |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

3.2 单一时间组合包

nalu较小的情况下,在同一时刻生成了多个nalu,可以使用该打包方式,将多个nalu封装在一个包中。webrtc中sps和pps通常打包在同一个rtp中。

STAP-A 封装格式

       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 NAL HDR 中 nalu type取值为24。

相对于单一数据包中,多了一个 NALU Size 字段,表示每个nalu的长度。

STAP-B 封装格式

       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        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

STAP-B NAL HDR 中 nalu type取值为25。

相对于STAP-A多了一个DON (decoding order number)字段,既解码顺序,而后续的每个nalu的解码顺序为DON累加1,既nalu 1 解码顺序为DON,而NALU2 为DON+1,NALU3 为(DON +1)+1,以此类推。

3.3 多时间组合包

nalu较小的情况下,在一个rtp包中封装多个不同时间戳的nalu。

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        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 

MTAP16 NAL HDR 中 nalu type取值为26。

DONB(decoding order number base)表示解码顺序的基数值,DOND 表示与DONB的偏移值。

NALU TS offset ,为nalu原始时间戳与 rtp包头中的timestap的偏移值。

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        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

MTAP24 NAL HDR 中 nalu type取值为27。

MATP16与 MTAP24 的区别在于NALU TS offset 值存放空间不同,前者为16bit,而后者为24bit。

3.4 分片组合

当使用udp传输rtp包时,由于一个udp的荷载最大为1480个字节,当一个nalu大于1480时,就需要将一个nalu分割为多个rtp包进行传输,具体的分割方式有以下两种。

FU-A

       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                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | FU indicator  |   FU header   |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
      |                                                               |
      |                         FU payload                            |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

FU-B

       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                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | FU indicator  |   FU header   |               DON             |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|
      |                                                               |
      |                         FU payload                            |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

其中 FU indicator

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+

F: 1 bit

forbidden_zero_bit,h264语法规定值为0。rtp封包中,当检测到值为1时,则表示该nalu中已出现错误。

NRI: 2 bits

nal_ref_idc, 当值为00时,表示后面的负载可以丢弃,并不会影响正常解码,当大于00时后面的该包丢弃会影响解码,不可丢弃。rtp封包中,该值也表示该数据包的重要性,11为重要性最高。

Type: 5bit

rtp包中nalu type,可取值为28(FU-A),29(FU-B)。

FU header

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |S|E|R|  Type   |
      +---------------+

S: 1 bit

值为1表示该rtp包为nalu的开始。

E: 1 bit

值为1表示该rtp包为nalu的结束。

R: 1 bit

保留字段。

Type: 5bit

表示h264中的nalu type 可取值1-23。

3.5 rtp封装nalu结合webrtc抓包分析

下面在去掉了srtp的srs环境下,抓包分析webrtc的视频数据包中h264的封装方式。

webrtc中目前支持了单个数据包封装,STAP-A 以及FU-A的三种封包方式。

3.5.1 STAP-A 包封装抓包分析

其封装格式如下,

       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        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 

payload 数据 :

0000   00 50 56 c0 00 08 00 0c 29 5d a4 db 08 00 45 00   .PV.....)]....E.
0010   00 4b 78 f4 40 00 40 11 b3 da c0 a8 c6 80 c0 a8   .Kx.@.@.........
0020   c6 01 1f 40 ef 96 00 37 d7 06 
 --------------------rtp header------------------------ 
                                     80 7d 00 00 00 00   [email protected]...}....
0030   00 00 05 0e 60 2c 
--------------------rtp payload------------------------ 
                         78 00 19 67 64 00 20 ac d9 40   ....`,x..gd. ..@
0040   c0 29 b0 11 00 00 03 00 01 00 00 03 00 32 0f 18   .)...........2..
0050   31 96 00 05 68 eb ec b2 2c                        1...h...,

 

webrtc中第一个视频包,即seq=0的rtp包通常情况下是STAP-A包,封装了SPS和PPS,上图中RTP负载第一个字节既nalu头为 :

0111 1000

对应于F = 0 ,NRI = 11 ,Type = 1 1000(十进制为24 既STAP-A包类型)

 

3.5.2 单个包封包方式

其封装格式如下,

       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                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |F|NRI|  type   |                                               |
      +-+-+-+-+-+-+-+-+                                               |
      |                                                               |
      |               Bytes 2..n of a Single NAL unit                 |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 

payload

0000   00 50 56 c0 00 08 00 0c 29 5d a4 db 08 00 45 00   .PV.....)]....E.
0010   00 a3 79 0a 40 00 40 11 b3 6c c0 a8 c6 80 c0 a8   ..y.@[email protected]......
0020   c6 01 1f 40 ef 96 00 8f 3a 43 
--------------------rtp header------------------------
                                     80 fd 00 06 00 00   ...@....:C......
0030   0e 10 05 0e 60 2c 
--------------------rtp payload------------------------ 
                         41 9a 21 6c 42 1f 00 00 f1 68   ....`,A.!lB....h
0040   1a 35 84 b3 ee e0 61 ba 4e a8 52 48 50 59 75 42   .5....a.N.RHPYuB
0050   d9 96 4a 51 38 2c 63 5e 41 c9 70 60 9d 13 53 c2   ..JQ8,c^A.p`..S.
0060   a8 f5 45 86 c5 3e 28 1a 69 5f 71 1e 51 74 0e 31   ..E..>(.i_q.Qt.1
0070   47 3c d3 d2 10 25 45 c5 b7 31 ec 7f d8 02 ae a4   G<...%E..1......
0080   77 6d cb c6 1e 2f a2 d1 12 08 34 52 ea e8 0b 4f   wm.../....4R...O
0090   81 21 4f 71 3f f2 ad 02 58 df 9e 31 86 9b 1b 41   .!Oq?...X..1...A
00a0   bf 2a 09 00 43 5c a1 7e 76 59 ef a6 fc 82 b2 72   .*..C\.~vY.....r
00b0   5a                                                Z

上图中rtp第一个负载字节为

0100 0001

对应于F = 0 ,NRI = 10 ,Type = 0 0001(十进制为 1 ,在1-23之间,既为单一的nalu数据包),

3.5.3 ,FU-A封包方式

FU-A的封包方式有三种,分别为起始包,中间包(可以多个),结束包,

起始包

       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                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | FU indicator  |   FU header   |                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
      |                                                               |
      |                         FU payload                            |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

部分payload

0000   00 50 56 c0 00 08 00 0c 29 5d a4 db 08 00 45 00   .PV.....)]....E.
0010   05 3e 79 89 40 00 40 11 ae 52 c0 a8 c6 80 c0 a8   .>y.@[email protected]......
0020   c6 01 1f 40 ef 96 05 2a b9 8e 
--------------------rtp header------------------------
                                     80 7d 00 0b 00 00   ...@...*...}....
0030   d2 f0 05 0e 60 2c 
--------------------rtp payload------------------------ 
                         5c 81 9b 2f 49 e1 0a 52 65 30   ....`,\../I..Re0
0040   23 bf ce 13 e7 4e bf 8c fa 27 9b 54 87 ab aa 90   #....N...'.T....
0050   c2 27 f0 0a ee 54 92 a7 b6 cf b1 b9 ca a4 36 17   .'...T........6.
0060   76 cf a7 0a 77 61 f6 01 4a fc 3a 29 b4 63 1d 1d   v...wa..J.:).c..
0070   5f e4 6f 66 b1 e9 b1 ee 2e 11 6f 88 e6 87 92 54   _.of......o....T
0080   01 1b ab 7c 36 be 22 1b a7 a9 32 a2 6a 32 39 68   ...|6."...2.j29h
0090   af 79 26 b8 21 c6 c7 02 9a bb 82 b9 9e 2f 51 b4   .y&.!......../Q.
00a0   4e 3e 07 b1 ef 34 17 54 f9 4c c3 fa ba 50 d2 e0   N>...4.T.L...P..
00b0   f1 17 cd 6f d8 62 63 da 77 3d 7f 8e e0 6c ea 94   ...o.bc.w=...l..
00c0   69 56 04 b1 3d f5 08 10 28 d7 3f b0 21 9d 09 28   iV..=...(.?.!..(
00d0   11 60 e2 94 3d ef d2 5c 6a 68 7d c5 8e 36 20 3b   .`..=..\jh}..6 ;
00e0   ......

其中rtp负载前两个字节分别为

0101 1100 1000 0001

FU indicator 中 F = 0 ,NRI = 10 ,Type =1 1100 (十进制为 28,既FU-A),

FU header 中 S = 1,E= 0,R = 0 ,Type =0 0101(十进制为 1 )

其中S为1,表示该数据包时FU分片的开始包。

中间包

部分payload

0000   00 50 56 c0 00 08 00 0c 29 5d a4 db 08 00 45 00   .PV.....)]....E.
0010   05 3e 79 8a 40 00 40 11 ae 51 c0 a8 c6 80 c0 a8   .>y.@[email protected]......
0020   c6 01 1f 40 ef 96 05 2a f9 8c 
--------------------rtp header------------------------
                                     80 7d 00 0c 00 00   ...@...*...}....
0030   d2 f0 05 0e 60 2c 
--------------------rtp payload------------------------ 
                         5c 01 8f 20 a5 11 00 3a 4a 49   ....`,\.. ...:JI
0040   af 49 44 ed d9 f3 25 9b 71 c5 bf be 85 d8 87 9c   .ID...%.q.......
0050   1c ef 38 35 d3 22 2e e9 c0 d5 c0 f7 f5 fa 28 ea   ..85."........(.
0060   32 e9 1f 02 72 41 44 dd 19 3f 2e b0 4e 72 e3 ce   2...rAD..?..Nr..
0070   b1 c3 e0 a5 f1 74 23 f0 e8 3a c3 50 8b 07 6a b6   .....t#..:.P..j.
0080   cb d4 a3 24 67 47 fd 29 f9 3a 4e 17 c7 c8 a9 50   ...$gG.).:N....P
0090   b1 2b af e2 b5 76 fb e7 f5 ff b7 fe c0 03 18 d3   .+...v..........
00a0   36 1e d7 7b c0 d9 c9 9a 3d e3 24 3e 2b ae f0 9b   6..{....=.$>+...
00b0   c5 f4 4e af 62 43 22 a6 60 7a 37 8e 9d 88 11 ed   ..N.bC".`z7.....
00c0   d1 bb 10 b2 05 a4 34 d4 00 6b dc ed 4f 13 12 8c   ......4..k..O...
00d0   59 bc 33 38 6e b1 7c a1 47 4d 13 01 bf a7 c8 11   Y.38n.|.GM......
00e0   bb b3 1e 8c 55 1b e9 45 62 ae 0e 42 d5 f8 2d 02   ....U..Eb..B..-.
00f0   .......

 

其中rtp负载前两个字节分别为

0101 1100 0000 0001

FU indicator 中 F = 0 ,NRI = 10 ,Type =1 1100 (十进制为 28,既FU-A),

FU header 中 S = 0,E= 0,R = 0 ,Type =0 0001(十进制为 1 )

该包既非开始也非结束,既nalu的中间一部分。

结束包

部分payload

0000   00 50 56 c0 00 08 00 0c 29 5d a4 db 08 00 45 00   .PV.....)]....E.
0010   01 b8 79 8b 40 00 40 11 b1 d6 c0 a8 c6 80 c0 a8   ..y.@.@.........
0020   c6 01 1f 40 ef 96 01 a4 a5 6c 
--------------------rtp header------------------------
                                     80 fd 00 0d 00 00   [email protected]......
0030   d2 f0 05 0e 60 2c 
--------------------rtp payload------------------------ 
                         5c 41 c0 d6 fb 21 e0 a1 94 59   ....`,\A...!...Y
0040   1f a6 01 44 0e 4e e9 fc 6c b9 a1 7b 02 55 75 79   ...D.N..l..{.Uuy
0050   4c 1f d1 8c 4b 22 33 79 1a e7 22 20 5e 20 98 0e   L...K"3y.." ^ ..
0060   6e 53 b4 b3 a8 76 d8 3b 20 e4 56 d2 90 8e c2 4f   nS...v.; .V....O
0070   cb b8 ac af f9 cf 7f 7e c5 4e 6e 17 ec 60 d4 d5   .......~.Nn..`..
0080   46 31 41 ca 93 01 b2 3d 36 ed 67 f1 cb b6 ee 1a   F1A....=6.g.....
0090   ........

 

其中rtp负载前两个字节分别为

0101 1100 0100 0001

FU indicator 中 F = 0 ,NRI = 10 ,Type =1 1100 (十进制为 28,既FU-A),

FU header 中 S = 0,E= 1,R = 0 ,Type =0 0001(十进制为 1 )

其中E= 1,表示该包为nalu的最后一部分。

 

上面FU-A的三个rtp包,组合后的真实nalu头应为F= 0,NRI = 10, Type =0 0001,

组合方式是取FU indicator 的前4个字节,加FU header的后5个字节。

该nalu的完整负载可以通过将上述三个rtp包去掉所有的FU indicator和FU header,按照rtp头中的sequence number排序后,依次拼接后的得到。

标签:00,nalu,..,h264,+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
From: https://www.cnblogs.com/kn-zheng/p/17063638.html

相关文章