RTSP(Real-Time Stream Protocol )是一种基于文本的应用层协议,在语法及一些消息参数等方面,RTSP协议与HTTP协议类似。
RTSP用于建立媒体流的控制传输,它为多媒体服务扮演“网络远程控制”的角色。尽管有时可以把RTSP控制信息和媒体流(数据)交织在一起传送,但一般情况RTSP并不用于转送媒体流数据,而是通过RTP/RTCP协议来完成流数据传输。
二、一次基本的RTSP操作过程
1. 客户端Client连接到流服务器Server并发送一个RTSP描述命令(DESCRIBE)。注意,这个时候server端应该已经开始发送媒体流数据。
2. 流服务器通过一个SDP描述来进行反馈,反馈信息包括流数量、媒体类型等信息。
3. 客户端再分析该SDP描述,并为会话中的每一个流发送一个RTSP建立命令(SETUP),RTSP建立命令告诉服务器,客户端用于接收媒体流数据的端口。
4. 流媒体连接建立完成后,客户端发送一个播放命令(PLAY),服务器就开始在UDP上传送媒体流(RTP包)到客户端。
5. 在播放过程中客户端还可以向服务器发送命令来控制快进、快退和暂停等。
6. 客户端可发送一个终止命令(TERADOWN)来结束流媒体会话
三、项目实例
下面是本人一个高清视频传输的项目打印信息,供大家学习参考。
client command: /home/root/rtsp_client -F /tmp/clientCh0.h264 -b 1843200 rtsp://192.168.1.3:8554/avstream &
Opening connection to 192.168.1.3, port 8554...
...remote connection opened
C-->S 用于得到服务器提供的可用方法;
Sending request: OPTIONS rtsp://192.168.1.3:8554/avstream RTSP/1.0
CSeq: 2
User-Agent: /home/root/rtsp_client (LIVE555 Streaming Media v2014.12.17)
S->C 服务器的回应信息会在Public字段列出提供的方法
Received 125 new bytes of response data.
Received a complete OPTIONS response:
RTSP/1.0 200 OK
Server: VLC/2.0.10
Content-Length: 0
Cseq: 2
Public: DESCRIBE,SETUP,TEARDOWN,PLAY,PAUSE,GET_PARAMETER
C-->S 客户端向服务器端发送DESCRIBE,用于得到URI所指定的媒体描述信息,一般是SDP信息。客户端通过Accept头指定客户端可以接受的媒体述信息类型。
Sending request: DESCRIBE rtsp://192.168.1.3:8554/avstream RTSP/1.0
CSeq: 3
User-Agent: /home/root/rtsp_client (LIVE555 Streaming Media v2014.12.17)
Accept: application/sdp 用于指定客户端可以接受的媒体描述信息类型
S->C 服务器回应URI指定媒体的描述信息
Received 210 new bytes of response data.
Have received 210 total bytes of a DESCRIBE RTSP response; awaiting 708 bytes more.
Received 708 new bytes of response data.
Received a complete DESCRIBE response:
RTSP/1.0 200 OK
Server: VLC/2.0.10
Date: Wed, 17 Jun 2015 12:19:22 GMT
Content-Type: application/sdp
Content-Base: rtsp://192.168.1.3:8554/avstream
Content-Length: 708
Cache-Control: no-cache
Cseq: 3 指定了RTSP请求回应对应的序列号,在每个请求或回应中都必须包括这个头字段。对每个包含一个给定序列号的请求消息,都会有一个相同序列号的回应消息。
具体的SDP信息
v=0
o=- 15648852339074415390 15648852339074415390 IN IP4 ma-virtual-machine
s=Unnamed
i=N/A
c=IN IP4 0.0.0.0
t=0 0
a=tool:vlc 2.0.10
a=recvonly
a=type:broadcast
a=charset:UTF-8
a=control:rtsp://192.168.1.3:8554/avstream
m=video 0 RTP/AVP 96
b=RR:0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42c01f;sprop-parameter-sets=Z0LAH9oBQBboQAAA+kAAOpgDxgyo,aM4yyA==;
a=control:rtsp://192.168.1.3:8554/avstream/trackID=6
m=audio 0 RTP/AVP 96
b=RR:0
a=rtpmap:96 mpeg4-generic/48000/2
a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=0990; SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1;
a=control:rtsp://192.168.1.3:8554/avstream/trackID=7
Opened URL "rtsp://192.168.1.3:8554/avstream", returning a SDP description:
v=0
o=- 15648852339074415390 15648852339074415390 IN IP4 ma-virtual-machine
s=Unnamed
i=N/A
c=IN IP4 0.0.0.0
t=0 0
a=tool:vlc 2.0.10
a=recvonly
a=type:broadcast
a=charset:UTF-8
a=control:rtsp://192.168.1.3:8554/avstream
m=video 0 RTP/AVP 96
b=RR:0
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=42c01f;sprop-parameter-sets=Z0LAH9oBQBboQAAA+kAAOpgDxgyo,aM4yyA==;
a=control:rtsp://192.168.1.3:8554/avstream/trackID=6
m=audio 0 RTP/AVP 96
b=RR:0
a=rtpmap:96 mpeg4-generic/48000/2
a=fmtp:96 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=0990; SizeLength=13; IndexLength=3; IndexDeltaLength=3; Profile=1;
a=control:rtsp://192.168.1.3:8554/avstream/trackID=7
C-->S 用于确定转输机制,建立RTSP会话。客户端能够发出一个SETUP请求为正在播放的媒体流改变传输参数,服务器可能同意这些参数的改变。若是不同意,它必须响应错误"455 Method Not Valid In This State"。
Created receiver for "video/H264" subsession (client ports 46954-46955)
Created receiver for "audio/MPEG4-GENERIC" subsession (client ports 51830-51831)
Sending request: SETUP rtsp://192.168.1.3:8554/avstream/trackID=6 RTSP/1.0
CSeq: 4
User-Agent: /home/root/rtsp_client (LIVE555 Streaming Media v2014.12.17)
Transport: RTP/AVP;unicast;client_port=46954-46955 包含客户端接受的转输选项列表,包括传输协议,地址端口,TTL等。服务器端也通过这个头字段返回实际选择的具体选项
S->C 服务器端对SETUP Request产生一个Session ID
Received 271 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
Server: VLC/2.0.10
Date: Wed, 17 Jun 2015 12:19:22 GMT
Transport: RTP/AVP/UDP;unicast;client_port=46954-46955;server_port=47326-47327;ssrc=F162517D;mode=play
Session: 976b50594e7fb9f1;timeout=60 Session ID由服务器在SETUP的回应中选择的,客户端一旦得到Session ID后,在以后对Session(会话)的操作请求消息中都要包含Session ID.
Content-Length: 0
Cache-Control: no-cache
Cseq: 4
Setup "video/H264" subsession (client ports 46954-46955)
Sending request: SETUP rtsp://192.168.1.3:8554/avstream/trackID=7 RTSP/1.0
CSeq: 5
User-Agent: /home/root/rtsp_client (LIVE555 Streaming Media v2014.12.17)
Transport: RTP/AVP;unicast;client_port=51830-51831
Session: 976b50594e7fb9f1
S-->C
Received 271 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
Server: VLC/2.0.10
Date: Wed, 17 Jun 2015 12:19:22 GMT
Transport: RTP/AVP/UDP;unicast;client_port=51830-51831;server_port=36454-36455;ssrc=99368B0B;mode=play
Session: 976b50594e7fb9f1;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 5
C-->S PLAY方法告知服务器通过SETUP中指定的机制开始发送数据 。在尚未收到SETUP请求的成功应答之前,客户端不可以发出PLAY请求。
Setup "audio/MPEG4-GENERIC" subsession (client ports 51830-51831)
Created output file: "/tmp/clientCh0.h264"
Created output file: "/tmp/clientCh0.h264"
Sending request: PLAY rtsp://192.168.1.3:8554/avstream RTSP/1.0
CSeq: 6
User-Agent: /home/root/rtsp_client (LIVE555 Streaming Media v2014.12.17)
Session: 976b50594e7fb9f1
Range: npt=0.000-
S-->C
Received 354 new bytes of response data.
Received a complete PLAY response:
RTSP/1.0 200 OK
Server: VLC/2.0.10
Date: Wed, 17 Jun 2015 12:19:22 GMT
RTP-Info: url=rtsp://192.168.1.3:8554/avstream/trackID=6;seq=22956;rtptime=3668001435, url=rtsp://192.168.1.3:8554/avstream/trackID=7;seq=2574;rtptime=1956267432
Range: npt=824.178902- 以UTC格式指定了播放开始的时间
Session: 976b50594e7fb9f1;timeout=60
Content-Length: 0
Cache-Control: no-cache
Cseq: 6
Started playing session
Receiving streamed data (signal with "kill -HUP 600" or "kill -USR1 600" to terminate)...
四、总结
第一步:查询服务器端可用方法
1.C->S:OPTION request //询问S有哪些方法可用
1.S->C:OPTION response //S回应信息的public头字段中包括提供的所有可用方法
第二步:得到媒体描述信息
2.C->S:DESCRIBE request //要求得到S提供的媒体描述信息
2.S->C:DESCRIBE response //S回应媒体描述信息,一般是sdp信息
第三步:建立RTSP会话
3.C->S:SETUP request //通过Transport头字段列出可接受的传输选项,请求S建立会话
3.S->C:SETUP response //S建立会话,通过Transport头字段返回选择的具体转输选项,并返回建立的Session ID;
第四步:请求开始传送数据
4.C->S:PLAY request //C请求S开始发送数据
4.S->C:PLAY response //S回应该请求的信息
第五步: 数据传送播放中
5.S->C:发送流媒体数据 // 通过RTP协议传送数据
第六步:关闭会话,退出
6.C->S:TEARDOWN request //C请求关闭会话
6.S->C:TEARDOWN response //S回应该请求
其中第三和第四步是必需的!第一步,只要服务器客户端约定好,有哪些方法可用,则OPTIONS 请求可以不要。第二步,如果我们有其他途径得到媒体初始化描述信息(比如http请求等等),则我们也不需要通过rtsp中的DESCRIBE请求来完成。