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 时间轴上,再结合播放缓冲策略,实现唇音同步。