链接:https://pan.baidu.com/s/1lwwwfJH2bKCoG2AHOcf1rQ?pwd=3yta
提取码:3yta
我做的一个音视频相关的学习笔记,欢迎一起学习
1.2,RTP扩展头(RFC5285)
扩展头由三部分组成,分别为profile、length、header extension。RFC5285规定两种格式的profile,分别以{0xBE, 0xDE}和{0x10, 0x0X}开头。
1.2.1,One-Byte Header:
以0xBEDE
开头,后面用两个字节标识扩展头的个数(注:扩展头最后以4字节对齐)。后续每个扩展头都有一个起始字节,格式如下:
0 0 1 2 3 4 5 6 7 +-+-+-+-+-+-+-+-+ | ID | len | +-+-+-+-+-+-+-+-+
4位ID
是该元素的本地标识符,取值范围为1-14。在信令部分,这被称为有效范围。本地标识符值15是为将来的扩展保留的,绝对不能用作标识符。如果遇到ID值15,则应该忽略其长度字段,整个扩展的处理应该在该点终止,并且只考虑ID为15的元素之前出现的扩展元素。len
代表该扩展头后续字节的长度,所以len为0时,后面会有 1 个字节,为15时,后面会有16个字节。即:至少带 1 个字节至多带16个字节。
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 0xBE | 0xDE | length=3 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID | L=0 | data | ID | L=1 | data... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ...data | ID | L=3 | data... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ...data | 0(pad) | 0(pad) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
需要注意的是,在RFC5285文档中,onebyte-header示例填充位的位置有误,关于这一点,读者可以阅读WebRTC中的RtpPacket.c或RtpPacket.h代码---《WebRTC音视频实时互动技术(原理、实战与源码分析) 李超》
1.2.2,Two-Byte Header
0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 0x100 |appbits| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
这种格式和One-Byte Header开头不一样,开头以0x100X(X为appbit,占4bit)。RFC5285并未规定appbits的意义。后面同样跟两个字节标识扩展头的个数。
扩展头的起始字节和One-Byte Header也不一样,ID和L分别用了一个字节来表示,且L表示的就是扩展头的长度(One-Byte Header中的L表示扩展头长度减1)。例子如下:
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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 0x10 | 0x00 | length=3 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID | L=0 | ID | L=1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | ID | L=4 | data... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ...data | 0(pad) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在这两种形式中,填充字节的值都是0(零)。如果需要对齐,它们可以放在扩展元素之间;如果需要填充,它们可以放在最后一个扩展元素之后。填充字节不提供元素的ID,也不提供长度字段。当找到填充字节时,它将被忽略,解析器继续解释下一个字节。