rtp协议整理

一、协议头


20140912153130104.png

V:RTP协议的版本号,占2位,当前协议版本号为2
P:填充标志,占1位,如果P=1,则在该报文的尾部填充一个或多个额外的八位组,它们不是有效载荷的一部分。
X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头
CC:CSRC计数器,占4位,指示CSRC 标识符的个数
M: 标记,占1位,不同的有效载荷有不同的含义,对于视频,标记一帧的结束;对于音频,标记会话的开始。
PT: 有效荷载类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流的,这样便于客户端进行解析。

这里重点聊下X扩展字段,别的字段应用简单
贴一个简单例子:
90 60 1e e2 12 e9 c2 4d 0b a9 e9 05 be de 00 02 21 04 a1 30 31 00...
90 二进制 1001 0000 对应 V=2,P=0,X=1,CC=0
可以得出 M=1,PT=96(264)
1e e2 二进制 00011110 11100010 sequence number=7906
12 e9 c2 4d 二进制 00010010 11101001 11000010 01001101 timestamp=317309517
0b a9 e9 05 SSRC=0x0ba9e905
展开解释:X 扩展位
根据RFC5285的规定,RTP扩展头部有两种格式:one byte header和two byte header。
https://tools.ietf.org/html/rfc5285

(1)one byte header : 
   0 1 2 3 4 5 6 7
  +-+-+-+-+-+-+-+-+
  |  ID  |  len   |
  +-+-+-+-+-+-+-+-+

be de (the first version of this specification was written on the
feast day of the Venerable Bede) 定死的。没啥实际意思,协议写的时候是这个节日子
00 02 extension length 2 个扩展单元
21 04 a1 (Id=2 Len=2 extension data 04a1) 3031 (id =3 ;len =1 extend data 31)

image.png

这个长度 4-bit比较有意思,0表示1, 1表示2个字节有效位,绕吧!“程序员计量体系从0开始么”

image.png

(2)Two-Byte Header

image.png

二、一些概念
VCL NALU Annex B MTU(1500?)=udp_header+rtp_header+data
具体分包大小:分包大小:<= 1500-20(IP头)-8(UDP)-12(rtp) 1460
extend(data) 可能还有拨号ppp协议头8字节
分析webrtc抓包分析:分析策略: 小于1460 基本每个nal发送大小相同。

image.png

NALU类型:
image.png

14、20类型

三、h264的rtp封装详细介绍
1、单一rtp包
单个NAL单元包(1-23)
对于 NALU 的长度小于MTU 大小的包,一般采用单个NAL 单元模式.一个原始的 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 包即可
如图:

image.png

2、分包
h264包在传输的时候,如果包太大,会被分成多个片。NALU头会被如下的2个自己代替。
Type=28 FU-A
+---------------+---------------+---------------
|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+
|F|NRI| Type:28 |S|E|R| Type |
+---------------+---------------+-----------------

例:
0x7C85=01111100 10000101 (开始包)
0x7C05=01111100 00000101 (中间包)
0x7C45=01111100 01000101 (结束包)

3、组合rtp包
Type=24 STAP-A

image.png

STRP-A and FU-A 图解
https://www.jianshu.com/p/5aa012b76951

三、详细例子
详细见gitee分享
https://gitee.com/wuji0447/h264rtpFenBaoZuBaoLiuCheng.git
对264实现拆包和组包,vlc播放数据。

四、扩展
vp8 等协议rtp流程

rfc:https://tools.ietf.org/html/rfc6386#section-9.1

参考这个大牛的blog:https://blog.csdn.net/CrystalShaw/article/details/81289617

你可能感兴趣的:(rtp协议整理)