RTP扩展头

   RTP的固定头部,结构如下:

在这里插入图片描述

V:版本号位,必须等于2
P:填充位
X:扩展位,标志是否存在扩展头
CC :CSRC个数
M: Mark标志位,标志是否是一帧的结束,音频帧几乎每个包都是一个完整的帧,所以M一般情况都等于1,视频包因为一帧比较大,会被分为几个包发送,最后一个包标志需要Mark一下
PT:负载类型,不同的负载类型对应不同的编解码类型(音频根据采样率和通道不同都要对应不同的负载类型),FEC类型等。
sequence number:包序号,发送端指定一个起始序号(如果不指定则随机一个),然后每个包的序号依次递增;如果存在RTX,重发是此序号是rtx的序号,详情请看RTPSender::SendPadData的实现
timestamp:包的时间戳,如果一个视频帧被分为几个包,则这个帧对应的几个包的时间戳是一样的;发送端可以指定一个起始时间戳 timestamp_offset_(如果不指定则随机一个),然后每个帧的时间戳等于起始时间戳加上采集时间戳timestamp_offset_ + capture_timestamp,详情可以看RTPSender::SendOutgoingData的实现
SSRC:同步源的唯一标识,每一个源(音频或者视频,文件)都必须要有一个唯一的标识码,用于区分不同的流
CSRC:贡献源,列举此SSRC的资源是由多少个其他的资源(其他资源的SSRC)混合而来的。例如MCU混音之后就需要修改这个;最多只能表示15源
   现有的RTP数据包头格式可能支持大多数应用程序类所需的公共函数集的完整集,但是还需要满足其他一些需求,有些特定的场合,RTP固定包头的字段内容无法满足,这就需要额外附加信息表征特性,从而RTP定义了扩展头,位于固定头最后。在RFC3550中定义的扩展头格式如下:
在这里插入图片描述
   头扩展包含一个16位的defined by profile字段和16位长度的字段表征扩展头长度,此处的长度是扩展头32位的个数,比如,扩展头长度是8字节,则length=2。但这个扩展头方法最多存在两个缺陷:首先,在每个rtp包中最多只允许一个扩展头;其次,该规范没有提供关于如何分配16位头扩展标识符defined by profile以避免冲突的方案。
   在RFC5285中针对以上两个缺陷做出了修改,针对第一个,新协议在单个RTP包中可以有多个扩展头,通过定义URI命名的扩展元素;定义在IETF规范中定义的扩展元素的IANA注册表,以及用于在命名URI和RTP数据包中携带的标识符值之间映射的会话描述协议(SDP)方法,从而消除了第二个缺陷。数据包中的每个扩展元素都具有一个本地标识符(ID)和一个长度。流中存在的本地标识符必须在带外进行协商或定义,每个不同的扩展都必须有一个唯一的ID。值0保留用于填充,不能用作本地标识符。
   有两种类型的扩展头:one-bytetwo-byte扩展头。
one-byte
单字节扩展头例子的格式如下:
在这里插入图片描述
固定头之后的16bit defined by profile标识固定设置0xBEDE,包含三个扩展头,表示紧跟着3*32位的扩展头元素,每个扩展元素结构如下:
在这里插入图片描述
每个扩展头首先以一个 byte 开始,前 4 位是这个扩展头的 ID, 后四位是 data 的长度 减1。如 len=0 表示后面有1个 byte 的 data,同理len=1 表示后面还有 2 个 byte 的 data,但是注意,其后没有紧跟第三个扩展头,而是添加了 2 个byte大小的全 0 的 data,这是为了作填充对齐,因为扩展头是以为 32bit 作填充对齐的。
two-byte
   在两字节扩展头结构中,16位的defined by profile字段如下定义:
在这里插入图片描述
4位appbits字段是依赖于应用程序的,可以被定义为任何值或意义,并且超出了本规范的范围, 可以用来填充应用层级别的数据。每个扩展元素结构如下:
在这里插入图片描述
包含一个字节的ID和一个字节的length字段。length表示除ID和length本身长度外扩展头data的长度,length=0表示后面没有data。如下一个两字节例子:
在这里插入图片描述可以看到开头为 0x100 + 0x0, 接下来的为 length=3 表示接下来有 3 个 32bit 长度,接下来的就是扩展头和数据,扩展头除了 ID 和 L 相对于 one-byte header 从 4bits 变成了 8bits 。
扩展头在SDP信息中的表示
   每个扩展头由URI来标识,这个URI必须能够准确明了的表示这个扩展头含义,在 SDP 信息中 ‘a=extmap’ 用来描述 RTP header extension。格式如下:
a=extmap:["/"]

其中:为 header extension 的 ID 信息,在 one-byte header 中,0保留作为 padding 数据,15保留作为停止标识;
为 “sendonly”, “recvonly”, “sendrecv”, “inactive”,表示传输方向
为 header extension 的描述 URI。
在 IANA 注册的 URI 格式为: urn:ietf:params:rtp-hdrext:avt-example-metadata
没有在 IANA 注册的 URI 格式为: http://example.com/082005/ext.htm#example-metadata
如:

a=extmap:1 http://example.com/082005/ext.htm#ttime 
a=extmap:2/sendrecv http://example.com/082005/ext.htm#xmeta
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱钻研技术的小羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值