RTSP(Real Timing Streaming Procotol)全称“实时流协议”,是TCP/IP协议体系下的一个应用层协议,定义了一对多应用程序如何有效地通过IP网络传送多媒体数据, 用于多媒体数据的网络控制。
同:
异:
RTSP组合使用了可靠传输协议TCP(控制信息)和高效传输协议UDP(媒体数据)来串流内容给用户。支持点播和直播。
RTSP协议本身只负责传输媒体控制信息,并不负责数据传输,使用RTP(Real-time Transport Protocol)和RTCP(Real-time Control Protocol)完成数据传输和数据检测。
会话参与者(发送端和接收端)周期性的向所有参与者发送RTCP包。主要功能是为应用程序提供会话质量或广播性能质量的信息,这些信息包括发送的信息包数目、丢失的信息包数目和信息包抖动等情况。
简而言之:
客户端如果一段时间内(默认是60s)没有任何响应,那么rtsp服务器就会关闭该会话,所以客户端需要发送心跳包给服务器。
方法 | 方向 | 要求 | 作用 |
---|---|---|---|
DESCRIBE | C->S | 推荐 | 获得会话描述信息 |
ANNOUNCE | C->S,S->C | 可选 | 将请求URL识别的演示或媒体对象描述发给服务器 |
GET_PARAMETER | C->S,S->C | 可选 | 获得会话参数 |
SET_PARAMETER | C->S,S->C | 可选 | 设置会话参数 |
OPTIONS | C->S,S->C | 必要 | 获得服务器的可用方法 |
PAUSE | C->S | 推荐 | 客户端发起暂停播放请求 |
PLAY | C->S | 必要 | 客户端发起播放请求 |
RECORD | C->S | 可选 | 请求录制指定范围的媒体数据 |
REDIRECT | S->C | 可选 | 服务器返回重定向地址 |
SETUP | C->S | 必要 | 客户端请求建立会话 |
TERADOWN | C->S | 必要 | 客户端发起关闭会话请求 |
c: client s: server
请求和回应的模板如下所示。
在请求和回应的消息头中都有一个CSeq的参数,是为了进行客户端和服务端的同步而设立的。
CSeq初始值为1,客户端每发起一个请求,该值加1。传输正确的情况下,服务端的回应中的CSeq应该与对应请求相等。
[方法] [URI] [RTSP版本]
[消息头]
[消息体]
[RTSP版本] [状态码] [状态码解释]
[消息头]
[消息体]
OPTIONS
用于请求服务器所支持的所有方法。
C->S OPTIONS rtsp://video.foocorp.com:554 RTSP/1.0
CSeq: 1
S->C RTSP/1.0 200 OK
CSeq: 1
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, RECORD
DESCRIBE
用来请求URL指定对象的描述信息,通常描述信息使用SDP(Session Description Protocol)格式。
描述信息中比较重要的是数据传输方式、播放时长以及codec type。
C->S DESCRIBE rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 2
S->C RTSP/1.0 200 OK
CSeq: 2
Content-Type: application/sdp
Content-Length: 210
m=video 0 RTP/AVP 96
a=control:streamid=0
a=range:npt=0-7.741000
a=length:npt=7.741000
a=rtpmap:96 MP4V-ES/5544
a=mimetype:string;"video/MP4V-ES"
a=AvgBitRate:integer;304018
a=StreamName:string;"hinted video track"
m=audio 0 RTP/AVP 97
a=control:streamid=1
a=range:npt=0-7.712000
a=length:npt=7.712000
a=rtpmap:97 mpeg4-generic/32000/2
a=mimetype:string;"audio/mpeg4-generic"
a=AvgBitRate:integer;65790
a=StreamName:string;"hinted audio track"
从SDP信息中可以知道码流的元数据信息。
SETUP:
用于请求URL使用指定传输格式,必须在PLAY前发出。
C->S SETUP rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 3
Transport: rtp/udp;unicast;client_port=5067-5068
S->C RTSP/1.0 200 OK
CSeq: 3
Session: 12345678
Transport: rtp/udp;client_port=5067-5068;server_port=6023-6024
客户端发起的请求说明接收RTP和RTCP数据的端口,一般’-‘前面的是RTP,’-'后面的是RTCP,比如上述请求:
用接收RTP数据(音视频)的本地端口是5067,接收RTCP数据的本地端口是5068
而服务器返回的信息说明服务端对应RTP和RTCP的端口,比如上述响应:
server对应的端口是6023和6024。
重要的是,服务器端还会将该传输会话的ID带给客户端,也就是Session ID,之后客户端的请求都需要带这个唯一标识码。
另外,如果发现setup的client端口已经被强占的话,可以不用关闭会话,只需要再次调用setup来重新配置端口,不过要带上当前的Session ID。
需要说明的是,端口之间是有一定联系的。如下图:
PLAY:
用于请求服务器开始传输数据,该请求是需要排队的,执行完一个PLAY请求,再执行下一个。
另外该请求可以带Range关键字,请求不同时间点的数据,单位是秒,相当于seek操作。
C->S PLAY rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 4
Session: 12345678
Range: npt=0.000- //设置播放时间的范围,单位是秒,精度小数点后三位
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
S->C RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
Range: npt=0.000000-
如果要实现快进/快退功能,也是通过PLAY cmd向服务器请求,快进/快退倍速通过Scale关键字提供,如下:
C->S PLAY rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 4
Session: 12345678
SCALE: 4 // 设置快进/快退倍速
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
S->C RTSP/1.0 200 OK
CSeq: 4
Session: 12345678
SCALE: 4
TEARDOWN:
用于请求终止会话,停止会话相关码流,并释放资源。
C->S TEARDOWN rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 5
Session: 12345678
S->C RTSP/1.0 200 OK
CSeq: 5
C->S: ANNOUNCE rtsp://video.foocorp.com:554/streams/example.rm RTSP/1.0
CSeq: 10
Session: 47112344
Content-Type: application/sdp
Content-Length: 332
v=0
o=mhandley 2890844526 2890845468 IN IP4 126.16.64.4
s=SDP Seminar
i=A Seminar on the session description protocol
u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
[email protected](Mark Handley)
c=IN IP4 224.2.17.12/127
t=2873397496 2873404696
a=recvonly
m=audio 3456 RTP/AVP 0
m=video 2232 RTP/AVP 31
S->C: RTSP/1.0 200 OK
CSeq: 10
S->C: GET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0
CSeq: 431
Content-Type: text/parameters
Session: 12345678
Content-Length: 15
packets_received
jitter
C->S: RTSP/1.0 200 OK
CSeq: 431
Content-Length: 46
Content-Type: text/parameters
packets_received: 10
jitter: 0.3838
C->S: SET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0
CSeq: 421
Content-Length: 20
Content-type: text/parameters
barparam: barstuff // 格式:
S->C: RTSP/1.0 451 Invalid Parameter
CSeq: 421
Content-Length: 10
Content-type: text/parameters
barparam // 返回参数错误的键
C->S: PAUSE rtsp://example.com/fizzle/foo RTSP/1.0
CSeq: 834
Session: 12345678
S->C: RTSP/1.0 200 OK
CSeq: 834
Date: 23 Jan 1997 15:35:06 GMT
C->S: RECORD rtsp://example.com/meeting/audio.en RTSP/1.0
CSeq: 954
Session: 12345678
Conference: 128.16.64.19/32492374
S->C: REDIRECT rtsp://example.com/fizzle/foo RTSP/1.0
CSeq: 732
Location: rtsp://bigserver.com:8001
Range: clock=19960213T143205Z-
RTP包的传输方式在SETUP cmd中指定,分为两种:
C->S: SETUP rtsp://example.com/foo/bar/baz.rm RTSP/1.0
CSeq: 302
Transport: RTP/AVP;unicast;client_port=4588-4589
S->C: RTSP/1.0 200 OK
CSeq: 302
Date: 23 Jan 1997 15:35:06 GMT
Session: 47112344
Transport: RTP/AVP;unicast; client_port=4588-4589;server_port=6256-6257
可以看到通过UDP传输,RTP接收端口是4588,对应发送端口为6256;RTCP交互端口为4589,对应端口为6257.C->S: SETUP rtsp://foo.com/bar.file RTSP/1.0
CSeq: 2
Transport: RTP/AVP/TCP;interleaved=0-1
S->C: RTSP/1.0 200 OK
CSeq: 2
Date: 05 Jun 1997 18:57:18 GMT
Transport: RTP/AVP/TCP;interleaved=0-1
通过TCP传输的话,RTSP cmd、RTP packet和RTCP packet是在同一个TCP连接上传输的,示意图如下:点播的case,如何判断End of stream?
1> 服务器主动发"ANNOUNCE" cmd告诉player码流传输结束。
S->C: ANNOUNCE rtsp://172.16.12.6:5554/… RTSP/1.0
CSeq: 4
Session: 370384394
x-notice: 2101 "End-of-Stream Reached" event-data=20210706T025811Z
2> 可以从DESCRIBE的SDP info中拿到duration,那么播放时长(playtime + 1)达到duration,那就认为数据传输结束。
3> 最新的规范(RTSP 2.0)中,服务器发送"PLAY_NOTIFY"cmd给客户端,通知eos。
S->C: PLAY_NOTIFY rtsp://example.com/… RTSP/2.0
Cseq:854
Notify-Reason: end-of-stream
4>无法拿到duration,那么设置100秒超时,如果100秒内server没有发送播放数据给player,那就认为数据传输结束。
RTSP重定向的情况:
DESCRIBE请求返回303说明要进行重定向,响应头中会说明重定向的url。
客户端需要对重定向url重新进行OPTION和DESCRIBE请求。
C->S:
DESCRIBE rtsp://172.16.74.210:559/2305_3a__3a_MOV00000002305106151_3a__3a_2305106151_f.mpg RTSP/1.0
CSeq: 2
User-Agent: MODPlayer
S->C:
RTSP/1.0 303 See Other
Server: Orbit2x
CSeq: 2
Location: rtsp://172.17.178.142:554/2305_3a__3a_MOV00000002305106151_3a__3a_2305106151_f.mpg
C->S:
OPTIONS rtsp://172.17.178.142:554/2305_3a__3a_MOV00000002305106151_3a__3a_2305106151_f.mpg RTSP/1.0
CSeq: 1
User-Agent: MODPlayer
S->C:
RTSP/1.0 200 OK
Server: Orbit2x
CSeq: 1
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER
C->S:
DESCRIBE rtsp://172.17.178.142:554/2305_3a__3a_MOV00000002305106151_3a__3a_2305106151_f.mpg RTSP/1.0
CSeq: 2
User-Agent: MODPlayer
S->C:
RTSP/1.0 200 OK
Server: Orbit2x
CSeq: 2
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER
Content-Type: application/sdp
Content-Length: 178
媒体数据直接基于UDP传输:
transport是RAW/RAW/UDP,传输的数据没有封包为RTP包,直接以UDP包的形式传输。
SETUP rtsp://172.17.245.46:554/378289119.ts RTSP/1.0
Transport: RAW/RAW/UDP;unicast;destination=10.134.37.122;client_port=15500
User-Agent: MODPlayer
CSeq: 3
RTSP/1.0 200 OK
Server: Orbit2x
CSeq: 3
Session: 26931165;timeout=60
Transport: RAW/RAW/UDP;unicast;destination=10.134.37.122;client_port=15500;source=172.17.245.46;server_port=10000
-----------------
udp的url是:udp://172.17.245.46:10000 --> 注意这是一个单播地址,不是udp组播地址(224. ~ 239.)
SDP:
SDP(Session Description Protocol)是一个用来描述多媒体会话的应用层控制协议,是一个基于文本的协议。
用来会话建立过程中的媒体类型,以及协商编码方案等。
SDP由许多文本行组成,文本行的格式为<类型>=<值>,<类型>是一个字母,<值>是结构化的文本串,其格式视<类型>而定。
SDP文本行例子:
v= (协议版本)
o= (所有者/创建者和会话标识符)
s= (会话名称)
i= (会话信息)
u= (URI 描述)
e= (Email 地址)
p= (电话号码)
c= (连接信息)
b=: (带宽信息)
t= (会话活动时间)
r= (0或多次重复次数)
z= ....
k=
k=: (加密密钥)
a= (0 个或多个会话属性行)
a=:
m= (媒体名称和传输地址)