RTSP协议全解析
RTSP(Real Time Streaming Protocol)协议全解析
一、协议概述
-
定位:应用层协议,用于控制流媒体服务器(播放、暂停、录制),媒体传输由 RTP/RTCP 实现。
-
特点:
- 基于文本(类似 HTTP),支持 TCP/UDP(默认端口 554)。
- 无状态协议,通过
Session
头维护会话状态。
-
核心命令:
方法 用途 OPTIONS
查询服务器支持的方法 DESCRIBE
获取媒体描述(SDP 格式) SETUP
建立传输通道(协商 RTP/RTCP 参数) PLAY/PAUSE
控制媒体播放 TEARDOWN
终止会话
二、核心命令详解(含 TCP/UDP 场景对比)
1. DESCRIBE
用途:获取媒体流的元数据(SDP 格式)。
交互示例:
UDP 场景:
C→S: DESCRIBE rtsp://example.com/live RTSP/1.0
CSeq: 1
Accept: application/sdp
S→C: RTSP/1.0 200 OK
Content-Type: application/sdp
Content-Length: 320
v=0
o=- 0 0 IN IP4 192.168.1.1
s=Live Stream
m=video 5004 RTP/AVP 96 # UDP端口5004传输视频
a=rtpmap:96 H264/90000
a=control:trackID=0
a=rtcp:5005 # RTCP端口5005
TCP 场景:
S→C: RTSP/1.0 200 OK
Content-Type: application/sdp
Content-Length: 300
v=0
o=- 0 0 IN IP4 192.168.1.1
s=Live Stream
m=video 0 RTP/AVP/TCP 96 # TCP复用连接
a=rtpmap:96 H264/90000
a=control:trackID=0
a=interleaved:0-1 # 通道0=RTP,通道1=RTCP
2. SETUP
用途:协商 RTP/RTCP 传输参数。
交互示例:
UDP 场景:
C→S: SETUP rtsp://example.com/live/trackID=0 RTSP/1.0
CSeq: 2
Transport: RTP/AVP/UDP;unicast;client_port=5000-5001
S→C: RTSP/1.0 200 OK
Session: 12345678
Transport: RTP/AVP/UDP;unicast;client_port=5000-5001;server_port=6000-6001
TCP 场景:
C→S: SETUP rtsp://example.com/live/trackID=0 RTSP/1.0
CSeq: 2
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
S→C: RTSP/1.0 200 OK
Session: 12345678
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
关键字段对比:
参数 | UDP 场景 | TCP 场景 |
---|---|---|
传输协议 | RTP/AVP/UDP | RTP/AVP/TCP |
端口协商 | client_port=5000-5001 | 无端口(通过 interleaved 复用) |
通道标识 | 无 | interleaved=0-1 |
3. PLAY/PAUSE/TEARDOWN
交互示例(通用格式):
C→S: PLAY rtsp://example.com/live RTSP/1.0
CSeq: 3
Session: 12345678
Range: npt=0-
S→C: RTSP/1.0 200 OK
CSeq: 3
RTP-Info: url=rtsp://example.com/live/trackID=0;seq=12345;rtptime=123456789
三、SDP(Session Description Protocol)详解
SDP 是 RTSP 中描述媒体流参数的元数据协议,核心字段如下:
1. 全局字段
字段 | 格式 | 说明 |
---|---|---|
v= | v=0 | 协议版本(固定为0) |
o= | o=<username> <sess-id> <version> IN IP4 <IP> | 会话源信息(如 o=- 0 0 IN IP4 192.168.1.1 ) |
s= | s=<session name> | 会话名称(如 s=Live Stream ) |
t= | t=0 0 | 会话时间(0表示无限制) |
2. 媒体行(m=
)
参数 | 说明 |
---|---|
<media> | 媒体类型(video /audio ) |
<port> | UDP 场景为端口号(如 5004 ),TCP 场景为 0 |
<proto> | 传输协议(RTP/AVP 表示 UDP,RTP/AVP/TCP 表示 TCP) |
<fmt> | 负载格式编号(对应 a=rtpmap 中的值) |
示例:
m=video 0 RTP/AVP/TCP 96 # TCP视频流
m=audio 5004 RTP/AVP 97 # UDP音频流(端口5004)
3. 扩展属性(a=
)
属性 | 说明 |
---|---|
rtpmap | 定义编解码器(如 a=rtpmap:96 H264/90000 ) |
fmtp | 编解码器参数(如 a=fmtp:96 profile-level-id=42001f ) |
control | 媒体流控制 URL(用于 SETUP 请求,如 a=control:trackID=0 ) |
interleaved | TCP 通道号(如 a=interleaved:0-1 ) |
rtcp | UDP 场景的 RTCP 端口(如 a=rtcp:5005 ) |
四、TCP/UDP 场景数据传输对比
1. UDP 场景
- RTP 包:通过独立 UDP 端口发送。
[RTP Header][Payload] // 端口5004
- RTCP 包:通过相邻奇数端口发送。
[RTCP Header][Payload] // 端口5005
2. TCP 场景
- 数据包格式:所有数据通过同一连接传输,带通道标识前缀。
$<Channel><Length High><Length Low>[Payload]
- 示例:
$00 00 04 00 [RTP视频数据] // 通道0
$01 00 00 0C [RTCP视频报告] // 通道1
五、协议选择建议
特性 | UDP 场景 | TCP 场景 |
---|---|---|
实时性 | 高(低延迟,适合直播、会议) | 中(适合点播、弱网环境) |
可靠性 | 可能丢包(需 RTCP 反馈) | 高(依赖 TCP 重传) |
防火墙穿透 | 需开放多个端口 | 仅需一个端口(默认554) |
开发复杂度 | 需处理丢包重传逻辑 | 逻辑简化(依赖 TCP 可靠性) |