4. RTP与RTCP机制
在RTSP会话中,RTSP负责“建立与控制”,真正承载音视频数据的是RTP,而RTCP则负责传输质量反馈与时间基准同步。理解RTP/RTCP机制,是解决音画不同步问题的核心前提。很多现场问题——例如音频比视频快半秒、播放器进度条抖动、多路流对齐失败——根源往往不在解码器,而在RTP时间戳与RTCP SR的映射关系没有被正确处理。
一、RTP包结构:载荷之外的“同步信息”
RTP包由固定头和载荷组成。固定头中最关键的字段包括:序列号(Sequence Number)、时间戳(Timestamp)、SSRC和载荷类型(Payload Type)。序列号用于检测丢包与乱序,时间戳用于表达采样时刻,SSRC用于区分同一会话中的不同媒体源。
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|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| contributing source (CSRC) identifiers |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| payload |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中,时间戳的“单位”不是秒,而是采样时钟周期。视频通常使用90000Hz时钟,音频常用48000Hz或8000Hz。这意味着:视频时间戳每增加90000代表1秒,音频时间戳每增加48000代表1秒。不同媒体流的时间戳不能直接比较,必须通过RTCP SR映射到统一时间轴。
二、序列号与时间戳:两种不同的“连续性”
序列号解决的是“包是否连续”,时间戳解决的是“帧在时间轴上的位置”。二者职责不同,不能混用。序列号是16位,回绕后从0重新开始;时间戳是32位,也会回绕。判断丢包时看序列号,判断播放节奏时看时间戳。
- 序列号:每发送一个RTP包递增1,用于丢包检测、乱序重排、NACK重传。
- 时间戳:同一帧的多个分片包共享同一时间戳,用于帧重组与播放时刻计算。
- 标记位M:视频中通常表示一帧的最后一个分片,音频中表示一个talkspurt结束。
三、RTCP SR与RR:时间映射的桥梁
RTCP不传媒体数据,但它是同步的关键。RTCP SR(Sender Report)由发送方周期性发出,包含两个核心时间字段:NTP时间和对应的RTP时间戳。接收方通过这两个值建立“RTP时间戳 ↔ 绝对时间”的映射关系。RTCP RR(Receiver Report)由接收方发出,报告丢包率、抖动和最高序列号,用于质量反馈。
上图的映射公式是音画同步的数学基础。接收方收到SR后,记录NTP_SR与RTP_TS_SR。当收到一个RTP包时,用其时间戳减去SR中的基准时间戳,除以时钟频率,再加上NTP基准时间,就得到该包对应的绝对播放时刻。视频和音频各自完成这一计算后,都落到同一个NTP时间轴上,从而实现对齐。
四、NTP时间与RTP时间的映射细节
NTP时间戳是64位,高32位为秒,低32位为小数部分。RTP时间戳是32位,单位由采样率决定。映射时需要注意三点:
- 时钟频率必须匹配:视频90000Hz、音频48000Hz不能混用,否则计算出的播放时刻会成比例偏移。
- 处理32位回绕:RTP时间戳回绕时,差值计算需使用无符号减法,避免出现巨大负数。
- SR间隔合理:SR通常每1~5秒发送一次,间隔过大时映射基准漂移,间隔过小则增加带宽开销。
| 字段 | 所属 | 作用 | 典型值/单位 |
|---|---|---|---|
| Sequence Number | RTP头 | 丢包检测、乱序重排 | 16位,每包+1 |
| Timestamp | RTP头 | 帧采样时刻 | 视频90000Hz,音频48000Hz |
| SSRC | RTP头 | 区分媒体源 | 32位随机数 |
| NTP Time | RTCP SR | 绝对时间基准 | 64位,秒+小数 |
| RTP TS in SR | RTCP SR | 与NTP对应的RTP时间 | 32位 |
| 丢包率/抖动 | RTCP RR | 质量反馈 | 百分比/毫秒 |
五、案例与复盘:一次音画不同步的排查
某监控项目使用RTSP拉流,播放端出现音频比视频快约400ms。抓包后发现:视频SR每5秒发送一次,音频SR每1秒发送一次,且音频SR中的NTP时间与视频SR的NTP时间来自不同系统时钟,存在固定偏差。接收端分别用各自的SR做映射,导致两条时间轴没有对齐。
# 使用 tcpdump 抓取 RTCP SR 包
tcpdump -i eth0 -nn 'udp port 5004 or udp port 5005' -w rtcp.pcap
# 用 Wireshark 过滤 RTCP
rtcp
# 查看 SR 中的 NTP Time 与 RTP Timestamp 字段
修复方式是:统一发送端的NTP时钟源,确保视频与音频SR使用同一系统时间;同时将SR间隔统一为2秒,并在接收端实现基于SR的映射表,对每条流分别计算播放时刻。调整后音画偏差从400ms降至20ms以内。
总结来说,RTP负责“带时间信息地传数据”,RTCP SR负责“把RTP时间翻译成绝对时间”,RTCP RR负责“反馈传输质量”。序列号管连续性,时间戳管节奏,NTP与RTP的映射管对齐。只有三者协同,RTSP流媒体才能实现稳定的音画同步。