4. 媒体封装与传输基础
RTSP 本身只负责“控制”,真正承载音视频数据的是 RTP/RTCP。理解媒体封装与传输基础,是排查推流花屏、卡顿、音画不同步、时间戳跳变等问题的前提。本节围绕编码格式、RTP 打包规则、时间戳与序列号三个核心展开,帮助建立从“编码器输出”到“网络包”的完整链路认知。
一、核心原理:编码格式决定打包方式
RTSP 推流中常见的媒体编码分为视频与音频两类。视频以 H.264、H.265 为主,音频以 AAC、G.711 为主。不同编码的 NAL 单元结构、帧边界、采样率、帧长不同,直接决定了 RTP 打包策略与时间戳步进。
- H.264:以 NAL 单元组织,SPS/PPS 描述解码参数,IDR 帧为关键帧。RTP 打包时需处理分片与聚合,常见模式有 Single NAL、STAP-A、FU-A。
- H.265:同样以 NAL 组织,但 NAL 头为 2 字节,类型更丰富,VPS/SPS/PPS 三层参数集。RTP 打包使用 AP、FU 等模式,分片时需注意 DONL 字段。
- AAC:通常以 ADTS 或 LATM 封装,RTP 打包时需去除 ADTS 头,按 AU 边界封装,时间戳按采样率步进。
- G.711:PCM 编码,PCMA/PCMU 两种律制,每包通常承载 20ms 音频,时间戳步进为 160(8kHz 采样率)。
关键结论:编码格式决定了 RTP 负载类型(Payload Type)、打包模式、时间戳时钟频率。推流前必须确认 SDP 中的 rtpmap 与编码器实际输出一致,否则会出现解码失败或音画不同步。
二、RTP 打包规则:从 NAL 到网络包
RTP 包由固定头(12 字节)与负载组成。固定头中的序列号、时间戳、SSRC、Payload Type 是稳定推流的核心字段。视频打包时,若 NAL 单元小于 MTU,可直接使用 Single NAL 模式;若大于 MTU,则需分片为 FU-A,每个分片携带相同的 RTP 时间戳,序列号递增。
RTP 固定头结构(12 字节):
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
FU-A 分片示例:
| FU indicator | FU header | 分片负载 |
FU indicator: F|NRI|Type=28
FU header: S|E|R|Type(原始 NAL 类型)
音频打包相对简单,AAC 通常一个 RTP 包承载一个或多个 AU,G.711 则按固定采样点数打包。打包时需注意:
- 视频关键帧(IDR)必须完整发送,分片时首片 S=1、末片 E=1,中间片均为 0。
- 同一帧的所有 RTP 包时间戳必须相同,序列号连续递增。
- 音频包时间戳按采样率步进,AAC 常见 1024 采样点/帧,8kHz 时步进 1024。
- MTU 建议控制在 1200~1400 字节,避免 IP 分片导致丢包放大。
三、时间戳与序列号:稳定推流的两个锚点
序列号(Sequence Number)用于检测丢包与乱序,每发送一个 RTP 包递增 1,回绕后从 0 继续。接收端通过序列号判断丢包位置,RTCP 的丢包统计也依赖它。时间戳(Timestamp)用于音视频同步与播放节奏控制,同一帧的所有分片共享同一时间戳,不同帧按采样时钟递增。
| 字段 | 作用 | 典型值/步进 | 常见问题 |
|---|---|---|---|
| Sequence Number | 丢包检测、乱序重排 | 每包 +1,16 位回绕 | 跳变导致接收端误判丢包 |
| Timestamp | 音视频同步、帧节奏 | 视频 90kHz,音频按采样率 | 同帧分片时间戳不一致导致花屏 |
| SSRC | 标识同一媒体源 | 随机 32 位 | 冲突导致流混淆 |
| Payload Type | 标识编码格式 | H.264=96,H.265=98,PCMA=8 | 与 SDP 不一致导致无法解码 |
排查音画不同步时,优先检查 RTCP SR 中的 NTP 时间与 RTP 时间戳对应关系。若视频时间戳步进不是 90kHz 的整数倍,或音频步进与采样率不匹配,同步算法会持续漂移。
四、案例与场景:一次花屏问题的复盘
某项目使用 H.264 推流,播放端偶发花屏。抓包发现:同一 IDR 帧的 FU-A 分片中,中间某个分片的 RTP 时间戳与首片不一致,导致接收端将该分片归入下一帧,重组失败。根因是打包模块在分片时错误地重新读取了系统时间,而非复用帧时间戳。修复方式是:在帧进入打包队列时锁定时间戳,所有分片共享该值。
错误日志特征:
RTP seq=1024 ts=90000 mark=0 FU-A S=1
RTP seq=1025 ts=90000 mark=0 FU-A S=0
RTP seq=1026 ts=90090 mark=0 FU-A S=0 <-- 时间戳跳变
RTP seq=1027 ts=90090 mark=1 FU-A E=1
修复后:
RTP seq=1024 ts=90000 mark=0 FU-A S=1
RTP seq=1025 ts=90000 mark=0 FU-A S=0
RTP seq=1026 ts=90000 mark=0 FU-A S=0
RTP seq=1027 ts=90000 mark=1 FU-A E=1
另一个常见场景是 AAC 音频时间戳步进错误。若编码器输出 44.1kHz 采样率,每帧 1024 采样点,则时间戳步进应为 1024,而非 1000。步进错误会导致音频播放速度异常,进而与视频不同步。
五、误区与检查清单
- 误区一:认为 RTSP 直接传输编码数据。实际上 RTSP 只做控制,媒体由 RTP 承载,RTCP 做同步与统计。
- 误区二:忽略 SPS/PPS 的发送。H.264/H.265 推流时,关键帧前需发送参数集,否则接收端无法解码。
- 误区三:所有帧都使用相同打包模式。大帧必须分片,小帧可聚合,需根据 NAL 大小动态选择。
- 误区四:时间戳使用系统毫秒。RTP 时间戳必须使用媒体时钟,视频 90kHz,音频按采样率。
推流稳定性检查清单:1)SDP 中 rtpmap 与编码器输出一致;2)H.264/H.265 参数集随关键帧发送;3)同一帧所有 RTP 包时间戳一致;4)序列号连续无跳变;5)MTU 分片大小合理;6)音频时间戳步进与采样率匹配;7)RTCP SR 正常发送,便于同步与统计。
掌握以上基础后,后续排查推流问题时,可以按“编码格式 → 打包模式 → 时间戳/序列号 → 网络承载”的顺序逐层定位。大多数花屏、卡顿、音画不同步问题,都能在 RTP 层找到明确线索。