2. RTSP协议基础
好,咱们进入第二章。上一章聊了音画不同步到底有多坑,这一章得先把地基打牢——RTSP推流到底是怎么工作的?
说白了,RTSP就是一个“遥控器”。它自己不传视频数据,只负责协商、建立和控制会话。真正运载音视频流的是RTP。我刚开始接触RTSP时也犯过糊涂,以为RTSP包里面装着视频数据,调试了半天才发现抓包全是控制信令,数据流在另一个端口上跑得正欢。
2.1 RTSP协议栈回顾
先看一张完整的协议栈分层图,你心里就有谱了。
嗯,这里要注意:RTSP和RTP/RTCP是“兄弟关系”,不是“父子关系”。RTSP在TCP上建立会话,然后通过RTP在UDP上传输媒体数据。我见过不少新手把RTSP和RTP混为一谈,调试时只盯着RTSP端口,结果发现视频流根本没过来——其实数据在另一个端口上。
2.2 推流端与拉流端交互流程
推流端(比如摄像头、编码器)和拉流端(比如播放器、录像服务器)之间是怎么“握手”的?我习惯把它拆成五个步骤,你想想看,跟打电话很像:
- OPTIONS —— 拉流端先问:“你支持哪些方法?”
- DESCRIBE —— “把你的媒体描述(SDP)给我看看。”
- SETUP —— “好,我要准备接收了,告诉我RTP端口和传输方式。”
- PLAY —— “开始推吧!”
- TEARDOWN —— “停,结束会话。”
下面这张图把完整交互画出来了,你对照着看:
💡 我的经验:SETUP阶段返回的Transport头里会带上interleaved模式或unicast模式。如果网络环境复杂(比如有防火墙),我建议用TCP interleaved模式,把RTP数据也走TCP通道,虽然延迟会高一点,但至少不会丢包。
2.3 音视频数据流复用
好,现在RTSP会话建立好了,RTP开始推流。问题来了:音频和视频是混在一起发,还是分开发?
答案是:分开发,但通过同一个会话管理。每个媒体流都有自己的RTP流和RTCP流。音频走一个SSRC,视频走另一个SSRC。拉流端根据SSRC来区分。
我整理了一个对比表,你看一眼就明白了:
| 属性 | 音频流 | 视频流 |
|---|---|---|
| SSRC | 0xA1B2C3D4(示例) | 0xE5F6A7B8(示例) |
| Payload Type | 8(PCMA)或 0(PCMU) | 96(动态H.264) |
| RTP端口 | 5000(偶数) | 5002(偶数) |
| RTCP端口 | 5001(奇数) | 5003(奇数) |
| 时间戳时钟 | 8000 Hz(8kHz采样) | 90000 Hz(90kHz标准) |
为什么会这样设计?因为音频和视频的采样率、编码方式、时间基准都不一样。音频用8kHz时钟,视频用90kHz时钟,你想想看,如果混在一个流里,时间戳根本没法对齐。
那拉流端怎么知道哪个RTP包是音频、哪个是视频?靠SDP描述。在DESCRIBE阶段返回的SDP里,会明确声明每个媒体流的m=行:
v=0
o=- 123456 789012 IN IP4 192.168.1.100
s=RTSP Session
t=0 0
m=audio 5000 RTP/AVP 8
a=rtpmap:8 PCMA/8000
m=video 5002 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0JAKpY=,aM48gA==
嗯,这里要注意:m=audio和m=video是两行独立的描述。拉流端解析SDP后,会为每个媒体流单独创建RTP接收器。我在项目中就踩过这个坑——SDP里音频和视频的端口写反了,结果拉流端把音频数据当成视频解码,全是雪花点。
2.4 音视频同步的起点:RTP时间戳
说到音画同步,RTP时间戳就是最核心的“对齐基准”。每个RTP包头部都有一个32位的时间戳字段。音频和视频各自用自己的时钟递增,但拉流端需要知道它们之间的换算关系。
举个例子:
- 音频PCMA,采样率8000Hz,每帧20ms,时间戳增量 = 8000 × 0.02 = 160
- 视频H.264,时钟90000Hz,每帧33.33ms(30fps),时间戳增量 ≈ 3000
拉流端收到音频时间戳3200、视频时间戳90000时,怎么对齐?
换算成同一单位(比如毫秒):
- 音频:3200 / 8000 × 1000 = 400ms
- 视频:90000 / 90000 × 1000 = 1000ms
嗯,差了600ms,明显不同步。这就是音画同步要解决的根本问题。
⚠️ 重要提醒:RTP时间戳是相对于各自媒体流的起始点,不是绝对时间。要真正对齐音视频,必须依赖RTCP SR(Sender Report)中的NTP时间戳。这个我们会在后面章节详细展开。
2.5 本章小结
这一章我们走了一遍RTSP推流的完整架构:
- 协议栈:RTSP控制 + RTP数据 + RTCP同步
- 交互流程:OPTIONS → DESCRIBE → SETUP → PLAY → TEARDOWN
- 数据复用:音频和视频分开的RTP流,通过SSRC和SDP描述区分
- 时间戳:音视频各自时钟不同,拉流端需要换算才能对齐