2025-10-10
音视频
00
请注意,本文编写于 68 天前,最后修改于 68 天前,其中某些信息可能已经过时。

目录

一、RTP 视频时间戳的含义
二、基本计算公式(可变帧率)
举例:
三、代码示例(C风格伪代码)
四、注意事项
总结

一、RTP 视频时间戳的含义

RTP 视频时间戳单位是 时钟周期,标准频率为 90 kHz(即每秒 90000 个 tick)。 它代表帧在播放时间轴上的“相对时间”,而不是发送时间。


二、基本计算公式(可变帧率)

如果上一帧捕获时间是 t_prev,当前帧捕获时间是 t_now,单位为秒:

text
Δt = t_now - t_prev timestamp_now = timestamp_prev + Δt × 90000

举例:

帧号采集时间(秒)时间差 ΔtRTP ts 增量RTP timestamp
00.000--1000000
10.0330.03329701002970
20.0660.03329701005940
30.1000.03430601009000
40.1360.03632401012240

这样生成的 RTP 时间戳完全根据真实捕获时间变化,可自然适应 VFR(可变帧率)。


三、代码示例(C风格伪代码)

c
uint32_t video_ts_base = rand(); // 初始随机时间戳 uint32_t video_ts = video_ts_base; double last_capture_time = now_seconds(); // 获取当前系统时间(秒) while (get_next_frame(&frame)) { double now = now_seconds(); double delta = now - last_capture_time; uint32_t inc = (uint32_t)(delta * 90000.0); video_ts += inc; send_rtp_packet(frame.data, frame.size, video_ts); last_capture_time = now; }

四、注意事项

  1. 不要用系统 tick 直接当 RTP 时间戳 RTP 时间戳只能反映播放时间间隔,不能是实际系统时间(否则 wraparound、同步都会出问题)。

  2. 要避免时间抖动 如果帧间隔噪声大(比如摄像头捕获不稳定),可以对 Δt 做平滑(如移动平均)以减少 jitter。

  3. 视频和音频的时钟不同

    • 视频:90000 Hz
    • 音频:采样率(8000 Hz, 48000 Hz 等) 但两者在 RTCP SR 包里可以对齐(NTP→RTP 时间基转换)。
  4. 在录像/回放中保持一致的时间基 如果你的编码器输出带有 PTS/DTS(比如 ffmpeg),可以直接用帧的 pts → 转换到 90 kHz:

    text
    rtp_ts = pts_in_seconds × 90000

总结

场景时间戳计算方式
固定帧率rtp_ts += 90000 / fps
可变帧率 (VFR)rtp_ts += (t_now - t_prev) * 90000
从编码器 PTSrtp_ts = pts * 90000

本文作者:zion

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!