RTP(Real-time Transport Protocol)是一种用于音视频通信的协议,它定义了一种标准的数据包格式,称为RTP数据包。我们的音视频数据就被封装在RTP包里面。
格式介绍
以下是RTP数据包的格式:
0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP extension ID | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP extension data |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| payload |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
上面的数据包格式由12个字节的固定头部和可选的变长扩展和有效载荷组成。下面是各字段的解释:
V:2位,协议版本号。当前为2。
P:1位,填充位标志。当存在填充时设置为1,否则为0。
X:1位,扩展位标志。当存在扩展头时设置为1,否则为0。
CC:4位,贡献者(SSRC)个数。表示固定头部后面跟着的所有SSRC标识符的数量。
M:1位,标记位。标记当前数据包是否为一个分片的最后一个数据包。
PT:7位,有效载荷类型。指定了RTP数据包中携带的数据类型,例如音频或视频。
sequence number:16位,序列号。标识每个RTP数据包的序列号。
timestamp:32位,时间戳。用于同步音视频数据的播放时间,以及计算延迟和抖动等。
SSRC:32位,同步源标识符。标识RTP数据包的源端。
CSRC:0-15个32位的贡献者标识符。它们表示RTP数据包的贡献者,即通过混音器混合后的音频数据的源。
RTP extension ID:16位,RTP扩展头标识符。可选项。
length:16位,RTP扩展头长度。可选项。
RTP extension data:RTP扩展头数据。可选项。
payload:RTP有效载荷。它包含了音视频数据。
负载介绍
Payload里面就是真正要传递的有效音视频数据了。
像:
RTP包中的音频数据可以采用多种不同的编码格式,如PCM、MP3、AAC、G.711等
RTP包中的视频数据,如H.264、VP8、VP9、H.265、AV1等都可以作为负载
也就是像MP3是音频编码格式,PCM作为裸流(数字音频格式),都可以放在RTP包中进行传输,负载的格式,在RTP包头中的PT字段中体现。
RTP与RTCP
RTP和RTCP包是一对关联的协议,在音视频传输过程中同时传递。
RTP协议用于实时传输音视频数据,而RTCP协议则用于传输有关该音视频流的控制信息。
RTCP包含有关音视频流的统计数据,如传输速率、丢包率、抖动等,同时也包含用于同步多个媒体流的时序信息。
RTCP包与RTP包相似,但是它们有不同的端口号。
为什么RTP和RTCP端口号会差1?
通常,RTP数据流会使用偶数端口号进行传输,而RTCP则使用奇数端口号。
例如,如果RTP使用UDP端口号5004,那么RTCP则使用UDP端口号5005。
在传输过程中,RTP和RTCP包是同时传递的。
在RTP数据包传输时,RTCP协议也会发送相应的控制信息,以便接收端了解当前音视频流的状态并进行调整和同步。
这种设计是为了方便协议的实现和配置。使用相邻的端口号可以使防火墙和路由器等网络设备更容易地识别和转发RTP和RTCP流量,同时也可以确保这两个流量在网络中的路径相同,从而避免延迟和抖动等问题,也有助于提高音视频传输的稳定性和质量。
RTCP包格式
RTCP包的格式如下:
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P| RC | PT=SR=200 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of sender |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NTP timestamp, most significant word |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NTP timestamp, least significant word |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sender's packet count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sender's octet count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| report block |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| report block |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. . .
. . .
. . .
| report block |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
该格式共有两个版本:V=1和V=2,其中V=2是更常用的版本。该格式的各个字段含义如下:
V (2 bits):版本号,用于指定RTCP包的版本,通常为2。
P (1 bit):填充标志,如果为1,则在RTCP包的末尾包含额外的填充字节。
RC (5 bits):接收器数量计数器,指示发送端发送该RTCP包的接收者数量。
PT (8 bits):分组类型,用于指示RTCP分组的类型,如200表示SR(Sender Report)。
length (16 bits):包含RTCP包的长度(以32位字为单位),不包括头部。
SSRC of sender (32 bits):发送方的同步信源(SSRC)标识符,用于唯一标识发送RTCP包的发送方。
NTP timestamp (64 bits):用于指示发送方的实时时钟,可用于同步多个媒体流。
RTP timestamp (32 bits):用于指示RTP数据包的时间戳。
sender's packet count (32 bits):指示发送方自该会话开始以来发送的RTP数据包数量。
sender's octet count (32 bits):指示发送方自该会话开始以来发送的RTP数据包总字节数。
report block:用于包含有关每个接收者的统计