RTP 部分
图1 RTP报文头部格式
1) V:RTP协议的版本号
2) P:填充标志
3) X:扩展标志,占1位,如果X=1,则在RTP报头后跟有一个扩展报头
4) CC:CSRC计数器
5) M: mark位置。
6) PT: 有效荷载类型
7) 序列号:占16位
8) 时戳(Timestamp):占32位,必须使用90 kHz 时钟频率。
9) 同步信源(SSRC)标识符:占32位
10) 特约信源(CSRC)标识符:每个CSRC标识符占32位
注:基本的RTP说明并不定义任何头扩展本身,如果遇到X=1,需要特殊处理
取一段码流如下:
80 e0 00 1e 00 00 d2 f0 00 00 00 00 41 9b 6b 49 €?....??....A?kI
e1 0f 26 53 02 1a ff06 59 97 1d d2 2e 8c 50 01 ?.&S....Y?.?.?P.
cc 13 ec 52 77 4e e50e 7b fd 16 11 66 27 7c b4 ?.?RwN?.{?..f'|?
f6 e1 29 d5 d6 a4 ef3e 12 d8 fd 6c 97 51 e7 e9 ??)????>.??l?Q??
cfc7 5e c8 a9 51 f6 82 65 d6 48 5a 86 b0 e0 8c ??^??Q??e?HZ????
其中,
80 |
是V_P_X_CC |
e0 |
是M_PT |
00 1e |
是SequenceNum |
00 00 d2 f0 |
是Timestamp |
00 00 00 00 |
是SSRC |
把前两字节换成二进制如下
1000 0000 1110 0000
按顺序解释如下:
10 |
是V |
0 |
是P |
0 |
是X |
0000 |
是CC |
1 |
是M |
110 0000 |
是PT |
notes: 没有扩展位,rtp header packet[size] = 0x80.如果有,rtp header packet[size] = 0x90.x位为1.
Rtp 扩展头
RTPFB: rtp 扩展x.
RTP报头扩展:1字节,2字节,3字节扩展。单字节扩展beme.最常见的应用是TransportSequenceNumber
RTP Header Extension
janus的head extension实现 ----to add
int janus_rtp_header_extension_set_abs_sned_time(char *buf, int len, int id, int64_t time_ms){
uint32_t time_24bits = janus_ms_to_24bits(time_ms);
char *ref = NULL;
if(janus_rtp_header_extension_find(buf, len, id, NULL, NULL, &ref) == 0) {
ref[1] = time_24bits >> 16;
ref[2] = time_24bits >> 8;
ref[3] = time_24bits;
time_24bits = (ref[1] << 16) & 0x00FF0000| (ref[2] << 8) & 0x0000FF00 | (ref[3]) & 0x000000FF;
return 0;
} else if(janus_rtp_header_extension_find(buf, len, JANUS_RTP_TYPE_EXTMAP_TRANSPORT_WIDE_CC, NULL, NULL, &ref) == 0){
ref[0] = ((uint8_t)id << 4 ) | 0x2;
ref[1] = time_24bits >> 16;
ref[2] = time_24bits >> 8;
ref[3] = time_24bits;
return 0;
}
return -1;
}
int janus_rtp_header_extension_parse_abs_sned_time(char *buf, int len, int id, double *time_ms) {
char *ref = NULL;
if(janus_rtp_header_extension_find(buf, len, id, NULL, NULL, &ref) < 0)
return -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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ID | L=2 | 24bit Timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
uint32_t time_24bits = (ref[1] << 16) & 0x00FF0000 | (ref[2] << 8) & 0x0000FF00 | (ref[3]) & 0x000000FF;
*time_ms = (double)(time_24bits) * 1000 / (1 << 18);
WebRTC研究:RTP报头扩展 - 剑痴乎