自我认知中的RTP(3)

当rtp头和h264头看完之后,然后将nalu打包到rtp中。


前言

编码数据字节对齐后,然后将连续的两个0x00中间插上0x03,加上一字节的nal头,在最前面加上起始码0x00000001
RTP封装h264,结合webrtc抓包分析


一、RTP的负载格式

一般情况下,RTP的头是12字节的大小。

对于每一个NALU,根据其包含的数据量的不同,其大小也有差异。
在IP网络中,当要传输的IP 报文大小超过最大传输单元MTU(Maximum Transmission Unit )时就会产生IP分片情况。在以太网环境中可传输的最大 IP 报文(MTU)的大小为 1500 字节。如果发送的IP数据包大于MTU,数据包就会被拆开来传送,这样就会产生很多数据包碎片,增加丢包率,降低网络速度。
对于视频传输而言,若RTP 包大于MTU 而由底层协议任意拆包,可能会导致接收端播放器的延时播放甚至无法正常播放。因此对于大于MTU 的NALU 单元,必须进行拆包处理。

有关 H.264作为Payload 格式定义了三种不同的基本的结构,接收端可能通过RTP Payload的第一个字节来识别它们。这一个字节不能不说和NALU 头不一样,简直一摸一样,这个头结构的NAL 单元类型字段则指出了代表的是哪一种结构。如下图所示:

在这里插入图片描述

1.单一NALU的RTP包

对于 NALU 的长度小于 MTU 大小的包, 一般采用单一 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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |F|NRI|  type   |                                               |
      +-+-+-+-+-+-+-+-+                                               |
      |                                                               |
      |               Bytes 2..n of a Single NAL unit                 |
      |                                                               |
      |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                               :...OPTIONAL RTP padding        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

对于一个原始的 H.264 NALU 单元常由 [Start Code] [NALU Header] [NALU Payload] 三部分组成, 其中 Start Code 用于标示这是一个NALU 单元的开始, 必须是 “00 00 00 01” 或 “00 00 01”, NALU 头仅一个字节, 其后都是 NALU 单元内容. 打包时去除 “00 00 01” 或 “00 00 00 01” 的开始码, 把其他数据封包的 RTP 包即可.

也就是说 RTP 负载中只包含一个 NAL 单元,NAL 头部兼作 RTP 负载头部。RTP 头部类型即 NAL 单元类型 1-23。

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.@.@..l......
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  

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

0100 0001

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

2.组合NALU的RTP包

当 NALU 的长度特别小时, 可以把几个 NALU 单元封在一个 RTP 包中,这种又可以分为好几种样子的打包,
常见的在常见的场景是sps和pps两个小包被合并封装。

       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的长度。

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   ...@...7...}....
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...,

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

0111 1000

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

如有一个 H.264 的 NALU 是这样的:

  1. [00 00 00 01 67 42 A0 1E 23 56 0E 2F … ]
  2. [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 … ]

2.分片NALU的RTP包

当NALU的长度超过MTU时,就必须对NALU单元进行分片封包.也称为Fragmentation Units(FUs).
有FU-A和FU-B两种,大多还是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 indicator: type 可取值为28(FU-A),这个是负载的第一字节。

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

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。


起始包:

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.@.@..R......
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   ......

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分片的开始包。


中间包:

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.@.@..Q......
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的中间一部分。


结束包:

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   ...@.....l......
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的最后一部分。


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值