RTP --- 报文格式介绍

RTP报文格式

12字节头部 + payload

12字节头部

复制代码
struct rtp_hdr {
#ifdef BIGENDIAN
    unsigned char v:2;          /* protocol version */
    unsigned char p:1;             /* padding flag */
    unsigned char x:1;             /* header extension flag */
    unsigned char cc:4;           /* CSRC count */

    unsigned char m:1;             /* marker bit */
    unsigned char pt:7;            /* payload type */
#else
    unsigned char cc:4;
    unsigned char x:1;
    unsigned char p:1;
    unsigned char v:2;

    unsigned char pt:7;
    unsigned char m:1;
#endif
    unsigned short seq;            /* sequence number */
    unsigned int   ts;          /* timestamp */
    unsigned int   ssrc;        /* synchronization source */
#if 0
    unsigned int   csrc[2];        /* optional CSRC list */
#endif
};
复制代码

*版本号(V):2比特,用来标志使用的RTP版本。

*填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。

*扩展位(X):1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。

*CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。

*标记位(M):1比特,当RTP数据包是一个视频帧的最后一个RTP数据包置一。其余情况下M位保持为 0。

*载荷类型(PT):7比特,标识了RTP载荷的类型,96表示视频,97表示音频

*序列号(SN):16比特,发送方在每发送完一个RTP包后就将该域的值增加1,接收方可以由该域检测包的丢失及恢复包序列。序列号的初始值是随机的。

*时间戳:32比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间在流逝嘛)。时间戳是去除抖动和实现同步不可缺少的。

*同步源标识符(SSRC):32比特,同步源就是指RTP包流的来源。在同一个RTP会话中不能有两个相同的SSRC值。该标识符是随机选取的 RFC1889推荐了MD5随机算法。

*贡献源列表(CSRC List):0~15项,每项32比特,用来标志对一个RTP混合器产生的新包有贡献的所有RTP包的源。由混合器将这些有贡献的SSRC标识符插入表中。SSRC标识符都被列出来,以便接收端能正确指出交谈双方的身份。

payload

payload 的组成和封包模式有关

单一封包模式

对于 NALU 的长度小于 MTU 大小的包, 一般采用单一 NAL 单元模式。对于一个原始的 H.264 NALU 单元打包时去除 "00 00 01" 或 "00 00 00 01" 的开始码, 把其他数据封包为 RTP payload 即可。

如有一个 H.264 的 NALU 是这样的:

[00 00 00 01 67 42 A0 1E 23 56 0E 2F ... ]

这是一个序列参数集 NAL 单元. [00 00 00 01] 是四个字节的开始码, 67 是 NALU 头, 42 开始的数据是 NALU 内容.

封装成 RTP 包将如下:

[ RTP Header ] [ 67 42 A0 1E 23 56 0E 2F ]

即只要去掉 4 个字节的开始码就可以了。

组合封包模式

不常用,不介绍

分片封包模式

当NALU的长度超过MTU时,就必须对NALU单元进行分片封包,也称为Fragmentation Units(FUs)。payload 的组成如下,1字节 FU indicator,1字节 FU header,若干字节 FU payload

FU Indicator

F、NRI 和 NALU 的头的 F、NRI 一样

Type 为分包类型,具体如下:

  • 0 没有定义
  • 1-23 NAL单元 单个 NAL 单元包
  • 24 STAP-A 单一时间的组合包
  • 25 STAP-B 单一时间的组合包
  • 26 MTAP16 多个时间的组合包
  • 27 MTAP24 多个时间的组合包
  • 28 FU-A 分片的单元
  • 29 FU-B 分片的单元
  • 30-31 没有定义

FU Header

S:标记该分片打包的第一个RTP包 

E:该分片打包的最后一个RTP包

R:保留位

Type:NALU的头的Type(nal_unit_type)

FU payload

FU payload 是去掉起始码和头部的NALU

 

posted @   流水灯  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2017-11-15 Qt ------ 断开某对信号与槽的connect
2017-11-15 5种网络通信设计模型(也称IO模型)
点击右上角即可分享
微信分享提示