RTP extension草稿

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 extension草稿

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报头扩展 - 剑痴乎 

上一篇:postgis,navicat导入shp数据


下一篇:Messya, a super simple yet powerful Microsoft Edge Extension