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)由接收方发出,报告丢包率、抖动和最高序列号,用于质量反馈。

RTCP SR 建立 NTP 时间与 RTP 时间戳的映射 发送方 Sender 视频 SSRC=0x1A2B 时钟 90000 Hz 音频 SSRC=0x3C4D 接收方 Receiver 维护映射表 计算播放时刻 输出音画同步 RTCP SR (Sender Report) NTP Time = 0xE8A1_2C00_8000_0000 RTP TS = 0x0A3F_1C80 (视频) RTP TS = 0x00B7_2A00 (音频) RTCP RR (Receiver Report) 丢包率 / 抖动 / 最高序列号 用于拥塞控制与质量反馈 播放时刻 = NTP_SR + (RTP_TS - RTP_TS_SR) / 时钟频率 视频与音频分别映射到同一 NTP 时间轴后即可对齐

上图的映射公式是音画同步的数学基础。接收方收到SR后,记录NTP_SR与RTP_TS_SR。当收到一个RTP包时,用其时间戳减去SR中的基准时间戳,除以时钟频率,再加上NTP基准时间,就得到该包对应的绝对播放时刻。视频和音频各自完成这一计算后,都落到同一个NTP时间轴上,从而实现对齐。

四、NTP时间与RTP时间的映射细节

NTP时间戳是64位,高32位为秒,低32位为小数部分。RTP时间戳是32位,单位由采样率决定。映射时需要注意三点:

  1. 时钟频率必须匹配:视频90000Hz、音频48000Hz不能混用,否则计算出的播放时刻会成比例偏移。
  2. 处理32位回绕:RTP时间戳回绕时,差值计算需使用无符号减法,避免出现巨大负数。
  3. 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 字段
常见误区:认为“时间戳相同就是同步”。实际上,不同媒体流的RTP时间戳基准不同,必须通过RTCP SR映射到NTP时间轴后才能比较。另一个误区是忽略SR的发送间隔,间隔不一致会导致映射基准漂移。

修复方式是:统一发送端的NTP时钟源,确保视频与音频SR使用同一系统时间;同时将SR间隔统一为2秒,并在接收端实现基于SR的映射表,对每条流分别计算播放时刻。调整后音画偏差从400ms降至20ms以内。

总结来说,RTP负责“带时间信息地传数据”,RTCP SR负责“把RTP时间翻译成绝对时间”,RTCP RR负责“反馈传输质量”。序列号管连续性,时间戳管节奏,NTP与RTP的映射管对齐。只有三者协同,RTSP流媒体才能实现稳定的音画同步。