2. RTP基础回顾

在音画同步的工程实践中,RTP(Real-time Transport Protocol,实时传输协议)是承载音频与视频码流最核心的协议之一。它由 IETF 在 RFC 3550 中定义,专门用于在 IP 网络上传输实时媒体数据。理解 RTP 的报文结构、序列号与时间戳字段,以及它与 RTCP 的配合关系,是后续实现精准音画同步的前提。本节将系统回顾 RTP 的基础知识,为时间戳精讲打下坚实基础。

一、RTP协议概述

RTP 通常运行在 UDP 之上,本身不保证可靠传输、不保证顺序、也不保证带宽。它的设计目标不是"可靠",而是"实时"——在允许少量丢包的前提下,尽可能低延迟地传递媒体流。RTP 负责承载实际的音视频载荷,而它的控制伙伴 RTCP(RTP Control Protocol)则负责传输质量反馈、同步信息与参与者信息。

RTP 的核心职责包括:

  • 载荷封装:将编码后的音视频帧切分为适合网络传输的 RTP 包。
  • 序列编号:通过序列号标识包的顺序,帮助接收端检测丢包与乱序。
  • 时间同步:通过时间戳字段标记媒体采样时刻,是音画同步的关键依据。
  • 源标识:通过 SSRC 区分同一会话中的不同媒体源。

RTP 本身不定义如何建立会话,这通常由 SIP、RTSP、WebRTC 等信令协议完成。RTP 只关注"如何把媒体数据打包并打上时间标记"。

二、RTP报文结构

一个标准 RTP 报文由固定头部(12 字节)和可选的扩展头部、载荷组成。固定头部中的关键字段如下:

字段 长度 作用
V(版本) 2 bit 当前版本号为 2
P(填充) 1 bit 指示载荷末尾是否有填充字节
X(扩展) 1 bit 指示是否存在扩展头部
CC(CSRC计数) 4 bit 贡献源数量
M(标记) 1 bit 标记重要事件,如视频帧边界
PT(载荷类型) 7 bit 标识编码格式,如 PCMU、H.264
序列号 16 bit 每发送一个 RTP 包递增 1
时间戳 32 bit 标识媒体采样时刻
SSRC 32 bit 同步源标识符

下面是一个 RTP 头部的十六进制示例,帮助理解字段布局:

80 60 12 34 00 00 0A 5F 00 00 00 01
|  |  |     |        |           |
|  |  |     |        |           +-- SSRC = 0x00000001
|  |  |     |        +-------------- 时间戳 = 0x00000A5F
|  |  |     +----------------------- 序列号 = 0x1234
|  |  +----------------------------- PT = 96 (动态载荷类型)
|  +-------------------------------- M=1, PT高1位
+----------------------------------- V=2, P=0, X=0, CC=0

三、载荷类型与序列号

载荷类型(Payload Type,PT)是一个 7 位字段,用于告诉接收端载荷中承载的是什么编码格式。静态载荷类型(0~95)由 RFC 3551 规定,例如 PT=0 表示 PCMU(G.711 μ-law),PT=8 表示 PCMA。动态载荷类型(96~127)则通过 SDP 协商,常用于 H.264、VP8、Opus 等现代编码。

序列号是一个 16 位无符号整数,每发送一个 RTP 包递增 1,初始值随机。它的主要作用是:

  • 检测丢包:接收端发现序列号不连续即可判断丢包。
  • 恢复顺序:UDP 不保证顺序,序列号用于重排。
  • 估计抖动:结合到达时间可计算网络抖动。
序列号只反映"包"的顺序,不反映"时间"的顺序。音画同步必须依赖时间戳,而不是序列号。

四、时间戳字段的基本作用

时间戳是 32 位字段,表示该 RTP 包中第一个字节的采样时刻。它的单位不是秒,而是"采样时钟周期"。不同媒体的时钟频率不同:

  • 音频:通常为 8000 Hz(G.711)或 48000 Hz(Opus)。
  • 视频:通常为 90000 Hz(H.264、MPEG)。

例如,音频时钟频率为 8000 Hz,每个包携带 160 个采样点(20 ms),则相邻包的时间戳增量为 160。视频时钟频率为 90000 Hz,帧率为 30 fps,则每帧时间戳增量为 90000/30 = 3000。

时间戳的初始值是随机的,因此接收端不能直接比较音频与视频的绝对时间戳,而需要通过 RTCP 的 SR(Sender Report)报文进行映射,将不同媒体的时间戳统一到同一个"墙钟时间"上。

五、RTP与RTCP的关系

RTP 负责传输媒体数据,RTCP 负责传输控制信息。两者通常使用相邻的端口(RTP 偶数端口,RTCP 奇数端口)。RTCP 的主要报文类型包括:

  • SR(Sender Report):发送端报告,包含 NTP 时间戳与 RTP 时间戳的对应关系,是音画同步的核心。
  • RR(Receiver Report):接收端报告,反馈丢包率、抖动等质量信息。
  • SDES:源描述,如 CNAME。
  • BYE:结束会话。

音画同步的关键在于:接收端通过 SR 报文中的 NTP 时间与 RTP 时间戳的对应关系,将音频和视频的 RTP 时间戳分别映射到统一的 NTP 时间轴上,再结合播放缓冲策略,实现唇音同步。

RTP 报文结构与 RTCP 同步关系 RTP 固定头部(12 字节) V/P/X/CC M/PT 序列号 16bit 时间戳 32bit SSRC 32bit CSRC 列表(可选,0~15 个 32bit) 扩展头部(可选) + 载荷(音频/视频编码数据) RTCP 控制报文 SR:NTP ↔ RTP 时间戳映射 RR:丢包率 / 抖动反馈 SDES:CNAME 源描述 配合 音画同步映射流程 音频 RTP 时间戳 时钟 8000 Hz 视频 RTP 时间戳 时钟 90000 Hz RTCP SR 映射 NTP 时间 ↔ RTP 时间戳 统一到墙钟时间轴 统一 NTP 时间轴 音频与视频对齐 播放缓冲 → 唇音同步

六、常见误区与复盘

误区一:把序列号当作时间戳使用。序列号只表示包的发送顺序,不携带时间信息。两个包的序列号相差 1,不代表时间相差固定值,因为包大小和打包间隔可能变化。
误区二:直接比较音频与视频的 RTP 时间戳。音频和视频的时钟频率不同,初始时间戳也随机,直接比较毫无意义。必须通过 RTCP SR 映射到 NTP 时间轴。
误区三:忽略时间戳回绕。32 位时间戳在高速率下会回绕(约 13.25 小时 @ 90000 Hz)。接收端必须使用模运算处理回绕,否则同步会突然跳变。