一、协议头
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)
这个长度 4-bit比较有意思,0表示1, 1表示2个字节有效位,绕吧!“程序员计量体系从0开始么”。
(2)Two-Byte Header
二、一些概念
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发送大小相同。
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 包即可
如图:
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
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