3. 时间戳的本质
在 RTP 音画同步的语境里,时间戳不是“墙上时钟”,也不是“发送顺序号”。它本质上是媒体采样时刻的数字化表达:某个音频采样点或视频帧,在它所属媒体流的时间轴上,位于哪一个“采样刻度”上。理解这一点,是后续做抖动缓冲、音画对齐、A/V 同步计算的基础。
要真正读懂 RTP 时间戳,需要同时看清五个概念:采样时刻、时钟频率、时间基、时间戳单位,以及绝对时间与相对时间的区别。它们不是并列的名词,而是一条从“物理时间”到“RTP 字段值”的映射链。
一、采样时刻:时间戳的“锚点”
音频是连续声波被离散采样的结果。48 kHz 采样率意味着每秒钟采集 48000 个样本,相邻样本间隔约 20.83 微秒。视频虽然不以“采样”命名,但每一帧也有一个采集或显示时刻。RTP 时间戳要回答的第一个问题是:这个包里的第一个采样点或这一帧,对应媒体时间轴上的哪个时刻?
注意,时间戳标记的是“媒体内容的时刻”,不是“包发送的时刻”。同一个音频帧可能被拆成多个 RTP 包,它们可以共享同一个时间戳;而视频一帧通常对应一个时间戳。把时间戳误当成发送时间,是初学者最常见的错误。
二、时钟频率与时间基:把秒换算成刻度
时钟频率(clock rate)定义了时间轴的“刻度密度”。RTP 中常见取值:
- 音频 Opus:48000 Hz
- 音频 PCMU/PCMA:8000 Hz
- 视频:90000 Hz(MPEG 体系传统)
- 某些视频编码也可用 1000 Hz 或 27000000 Hz
时间基(time base)是时钟频率的倒数,表示“一个刻度代表多少秒”。例如 90000 Hz 的时间基是 1/90000 秒,约 11.11 微秒。时间戳单位就是刻度数,是一个整数。RTP 时间戳字段是 32 位无符号整数,会回绕,因此比较两个时间戳时通常使用模 2³² 的差值,而不是直接比大小。
核心公式:
时间戳增量 = 媒体时间增量(秒)× 时钟频率
媒体时间增量 = 时间戳差值 ÷ 时钟频率
三、绝对时间与相对时间:两种视角
绝对时间指某个采样时刻在统一时间轴上的位置,例如“第 3.5 秒”。相对时间指两个时间戳之间的差值,例如“这一帧比上一帧晚了 3000 个刻度”。RTP 时间戳本身是相对某个随机初始值递增的,因此它更接近“相对时间轴上的刻度”,而不是绝对 UTC 时间。
实际同步中,我们通常先计算相对时间差,再映射到接收端的播放时钟。例如音频时间戳差 48000,表示 1 秒;视频时间戳差 90000,也表示 1 秒。只有把不同时钟频率的流都换算成秒,才能比较音画是否对齐。
| 概念 | 含义 | 示例 | 常见误区 |
|---|---|---|---|
| 采样时刻 | 媒体内容在时间轴上的位置 | 第 48000 个音频样本 | 误当成包发送时刻 |
| 时钟频率 | 每秒刻度数 | 48000 Hz、90000 Hz | 不同流直接比较时间戳 |
| 时间基 | 每个刻度代表的秒数 | 1/90000 s | 与帧率混淆 |
| 时间戳单位 | 刻度数(整数) | timestamp=144000 | 当成毫秒使用 |
| 绝对时间 | 统一时间轴上的位置 | 3.5 秒 | 认为 RTP 时间戳就是 UTC |
| 相对时间 | 两个时间戳的差值 | Δ=48000 → 1 秒 | 忽略 32 位回绕 |
四、案例:一次音画不同步的排查
假设接收端发现画面比声音慢约 200 毫秒。抓包看到:
音频 RTP: timestamp = 960000, clock rate = 48000
视频 RTP: timestamp = 1800000, clock rate = 90000
音频相对时间 = 960000 / 48000 = 20.000 s
视频相对时间 = 1800000 / 90000 = 20.000 s
如果两者都从同一基准开始,理论上应对齐。但若音频基准时间戳是 0,视频基准时间戳是 18000,则视频实际相对时间为 (1800000 - 18000) / 90000 = 19.8 秒,比音频早 200 毫秒。问题不在网络抖动,而在初始时间戳基准不同。解决方法是利用 RTCP SR 中的 NTP 时间与 RTP 时间戳对应关系,把两条流映射到同一绝对时间轴。
排障要点:不要直接比较音频和视频的 RTP 时间戳数值。必须先除以各自的时钟频率,再减去各自的初始基准,最后比较秒数。
五、常见误区与复盘
- 把时间戳当毫秒:90000 Hz 下,90000 个刻度才是 1 秒,不是 90000 毫秒。
- 忽略时钟频率差异:音频 48000 和视频 90000 的同一数值代表不同时长。
- 忽略 32 位回绕:时间戳从 4294967295 回到 0 时,直接相减会得到巨大负数,应使用模运算。
- 把绝对时间与相对时间混用:RTP 时间戳是相对初始值的刻度,不是 UTC 绝对时间。
- 忘记 RTCP SR:没有 SR 的 NTP/RTP 对应关系,就无法把相对时间戳锚定到绝对时间轴。
总结来说,RTP 时间戳的本质是:用某个时钟频率把媒体采样时刻离散成整数刻度。时钟频率决定刻度密度,时间基决定每个刻度的秒数,时间戳单位是刻度数,绝对时间提供统一参照,相对时间用于计算间隔。只有把这五者串起来,才能在音画同步实战中正确换算、正确比较、正确定位问题。