RTSP全称是Real Time Streaming Protocol 实时流传输协议是Real Network和Netscape共同提出的在互联网上传输流媒体数据(包括视频和音频数据)的应用层协议。RTSP的作用相当于遥控器可以对远端的服务器进行控制(播放,暂停,终止等)。可以选择使用TCP或UDP来传送串流内容,语法跟HTTP 1.1类似,用的端口号是554。(ps:先提示一下rtsp只是命令控制,传输具体的音视频数据是由rtp协议传输的,还有rtcp用于传输质量监控和会话成员管理)。RTSP被广泛用于安防,在线教育,直播等领域。感兴趣的读者可以详细研读rfc2326.pdf这份文档。
计算机编程领域里所有通信交互就好比人与人之间的沟通,有问有答。世界上人与人之间的沟通也有很多语言如英语,汉语等(对应到计算机就是通信协议)。语言(协议)都是约定俗成的。rtsp类似于http使用纯文本来发送消息,rtsp是有状态的下面先总体看看rtsp基本交互步骤:
由上图可以知道:RTSP操作过程首先,客户端连接到流服务器并发送一个OPTIONS查询服务端支持的方法 ,服务端返回支持的方法。客户端再发送RTSP描述命令(DESCRIBE),服务端通过一个SDP描述来进行回复,回复信息包括流数量、媒体类型等信息。客户端再分析该SDP描述,并为会话中的每一个流发送一个RTSP建立命令(SETUP),RTSP建立命令告诉服务器客户端用于接收媒体数据的端口。流媒体连接建立完成后,客户端发送一个播放命令(PLAY),服务端就开始在UDP端口上传送媒体流(RTP包)到客户端。 在播放过程中客户端还可以向服务器发送命令来控制快进、快退和暂停等。最后,客户端可发送一个终止命令(TERADOWN)来结束流媒体会话。
RTSP消息分为两类,请求消息(request)和 回应消息(ressponse)。
1 请求消息(request)
先上个直观的图吧:
由图可知:
请求消息由 方法+URI+RTSP版本号,之后跟一条或多条消息。
URI:表示接收方的地址,如rtsp://192.168.0.110:8554/rtsp
CR:表示回车。LF:表示换行。
RTSP使用消息类型和消息体来表示不同类型的消息。最后一条消息要使用两个CR LF。
看看wireshark的抓包看一个RTSP的请求消息:
如图中所示,该RTSP请求消息的方法为OPTIONS,请求的目标地址为rtsp://192.168.0.110:8554/rtsp,RTSP的版本为1.0;
接者包含两条消息,第一条为CSeq表示序列号,本次请求的序列号为2;
第二条为User-Agent,表示用户代理,值为”User-Agent: LibVLC/3.0.1 (LIVE555 Streaming Media v2018.02.18)”;
User-Agent做为最后一条消息,其后要跟两组回车和换行!
2 回应消息(response)
先上图:
回应消息由RTSP版本号+状态码+解释开头,之后跟一条或多条消息!
说明:
状态码:表示状态,同http的返回状态,如200,表示OK
解释:针对状态码的文本解释
最后一条消息也是需要 跟两个回车和换行!
来看抓包的数据:
回复消息以Response标识,该消息中RTSP的版本号为1.0;
服务器回复的状态码为:200,解释为:ok;
对RTSP消息的结构就有了比较全面的了解了!接下来我们来讲一讲sdp的详细格式。
sdp,英文全称Session Description Protocol会话描述协议,对应RFC2327。RTSP协议中使用sdp进行媒体信息的描述(客户端发送describe后服务端以sdb方式回复).sdp还应用在语音通话SIP协议,监控安防GB28181国标, webRtc等。
sdp信息由多行"
会话级描述主要包含以下字段
媒体级描述主要包含以下字段
上述图片中有些行是必须要的,带*号标记的行是可选的。必选的字段包括v=,o=,s=,t=,(对于会话级描述必选)m=(对于媒体级会话描述必选)。
格式: v=
描述: 表示sdp的版本号,不包含次版本号
我们来看一个抓包数据:
格式:o=
描述:o=选项对会话的发起者进行了描述;
格式:s=
会话名称,在整个会话中有且只有1个"s="
格式: c=
network type表示网络类型,一般为IN,表示internet;
address type,地址类型,一般为IP4;
connection address,地址,可能为域名或ip地址两种形式
格式: b=
描述:该选项描述了建议的带宽,单位 kbs/s,可选,modifier包括两种类型,CT和AS,CT表示总带宽,AS表示单个媒体带宽的最大值;bandwidth-value表示具体的带宽。
格式:t=
描述:t字段描述了会话的开始时间和结束时间,
start time和stop time均为0,表示一个持久的会话。
格式:e=
描述:用来描述邮件地址。Vlc里没有抓包到这个。
格式:p=
描述:比较简单,用来描述电话号码
格式:u=
描述:类似于url的一个值,这里不过多介绍了
格式 :a=<*>
描述:表示一个会话级别或媒体级别下的0个或多个属性
来看一个抓包文件:
格式:m=
描述:
有"audio","video","application","data"(不向用户显示的数据),"control"(描述额外的控制通道);
RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1)
静态绑定:媒体编码方式与RTP负载类型有确定的一一对应关系,如: m=audio 0 RTP/AVP 8
动态绑定:媒体编码方式没有完全确定,需要使用rtpmap进行进一步的说明: 如:
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
格式:a=rtpmap:
描述:
payload type表示动态负载类型,如 98表示h264
encoding name表示编码名称,如H.264
clock rate表示时钟频率,如90000
我们来看一个抓包文件:
至此,我们把RTSP的基础知识点讲完了,下一篇我们将详细讲解rtsp基本操作。