什么是RTSP
- RTSP是一个实时传输流协议,是一个应用层的协议
- 通常说的RTSP包括RTSP协议、RTP协议、RTCP协议
- 各协议的简单理解
- RTP(Real-time Transport Protocol):实时传输协议,是用于Internet上针对多媒体数据流的一种传输层协议。RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。
- RTCP(Real-time Transport Control Protocol):实时传输控制协议,RTCP本身并不传输数据,但和RTP一起协作将多媒体数据打包和发送。RTCP定期在流多媒体会话参加者之间传输控制数据。RTCP的主要功能是为RTP所提供的服务质量(Quality of Service)提供反馈。 RTCP收集相关媒体连接的统计信息,例如:传输字节数,传输分组数,丢失分组数,jitter,单向和双向网络延迟等等。
- RTSP(Real Time Streaming Protocol):实时流协议,用来控制声音或影像的多媒体串流协议,服务器端可以自行选择使用TCP或UDP来传送串流内容
- RTSP和RTP的关系:RTP不象http和ftp可完整的下载整个影视文件,它是以固定的数据率在网络上发送数据,客户端也是按照这种速度观看影视文件,当影视画面播放过后,就不可以再重复播放,除非重新向服务器端要求数据。RTSP与RTP最大的区别在于:RTSP是一种双向实时数据传输协议,它允许客户端向服务器端发送请求,如回放、快进、倒退等操作。当然,RTSP可基于RTP来传送数据,还可以选择TCP、UDP、组播UDP等通道来发送数据,具有很好的扩展性。它时一种类似与http协议的网络应用层协议。
RTSP协议
RTSP数据格式
RTSP协议格式与HTTP协议格式类似
- RTSP客户端的请求格式
method url vesion\r\n CSeq: x\r\n xxx\r\n ... \r\n
- method:方法,表明这次请求的方法,rtsp定义了很多方法,后面再详细介绍
- url:格式一般为rtsp://ip:port/session,ip表主机ip,port表端口好,如果不写那么就是默认端口,rtsp的默认端口为554,session表明请求哪一个会话
- version:表示rtsp的版本,现在为RTSP/1.0
- CSeq:序列号,每个RTSP请求和响应都对应一个序列号,序列号是递增的
- RTSP服务器的响应格式
vesion 200 OK\r\n CSeq: x\r\n xxx\r\n ... \r\n
- version:表示rtsp的版本,现在为RTSP/1.0
- CSeq:序列号,这个必须与对应请求的序列号相同
RTSP请求的常用方法
- OPTIONS:获取服务器提供的可用方法
- DESCRIBE:向服务器获取对应会话的媒体描述信息
- SETUP:向服务器发起建立请求,建立连接会话
- PLAY:向服务器发起播放请求
- TEARDOWN:向服务器发起关闭连接会话请求
RTSP交互过程
- OPTIONS - 获取服务器提供的可用方法
- 客户端 -> 服务器
OPTIONS rtsp://192.168.1.141:554 RTSP/1.0\r\n CSeq: 2\r\n User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)\r\n Accept: application/sdp\r\n \r\n
- 服务器 -> 客户端
RTSP/1.0 200 OK\r\n CSeq: 2\r\n Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY\r\n \r\n
- 服务器回复客户端,当前可用方法OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY
- DESCRIBE - 向服务器获取对应会话的媒体描述信息,格式为sdp
- 客户端 -> 服务器
DESCRIBE rtsp://192.168.1.141:554 RTSP/1.0\r\n CSeq: 3\r\n User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)\r\n Accept: application/sdp\r\n \r\n
- 服务器 -> 客户端
RTSP/1.0 200 OK\r\n CSeq: 3\r\n Content-Base: rtsp://192.168.1.141:554 Content-type: application/sdp\r\n Content-length: 129 \r\n v=0\r\n o=- 91639218130 1 IN IP4 192.168.1.141\r\n t=0 0\r\n a=contol:*\r\n m=video 0 RTP/AVP 96\r\n a=rtpmap:96 H264/90000\r\n a=framerate:25\r\n a=control:track0\r\n \r\n
- 服务器回复了sdp文件,这个文件告诉客户端当前服务器有哪些音视频流,有什么属性,具体稍后介绍。
- SETUP - 向服务器发起建立请求,建立连接会话
- 客户端 -> 服务器
SETUP rtsp://192.168.1.141:554/track0 RTSP/1.0\r\n CSeq: 4\r\n User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)\r\n Transport: RTP/AVP;unicast;client_port=50692-50693\r\n \r\n
- 客户端发送建立请求,请求建立连接会话,准备接收音视频数据
- RTP/AVP:表示RTP通过UDP发送,如果是RTP/AVP/TCP则表示RTP通过TCP发送
- unicast:表示单播,如果是multicast则表示多播
- client_port=50692-50693:由于这里希望采用的是RTP OVER UDP,所以客户端发送了两个用于传输数据的端口,客户端已经将这两个端口绑定到两个udp套接字上,54492表示是RTP端口,54493表示RTCP端口(RTP端口为某个偶数,RTCP端口为RTP端口+1)
- 服务器 -> 客户端
RTSP/1.0 200 OK\r\n CSeq: 4\r\n Transport: RTP/AVP;unicast;client_port=50692-50693;server_port=56400-56401\r\n Session: 66334873\r\n \r\n
- 服务器接收到请求之后,得知客户端要求采用RTP OVER UDP发送数据,单播,客户端用于传输RTP数据的端口为54492,RTCP的端口为54493
- 服务器也有两个udp套接字,绑定好两个端口,一个用于传输RTP,一个用于传输RTCP,这里的端口号为56400-56401
- 客户端会使用50692-50693这两端口和服务器通过udp传输数据,服务器会使用56400-56401这两端口和这个客户端传输数据
- PLAY - 向服务器发起播放请求
- 客户端 -> 服务器
PLAY rtsp://192.168.1.141:554 RTSP/1.0\r\n CSeq: 5\r\n Session: 66334873\r\n Range: =0.000-\r\n \r\n
- 服务器 -> 客户端
RTSP/1.0 200 OK\r\n CSeq: 5\r\n Range: npt=0.000-\r\n Session: 66334873; timeout=60\r\n \r\n
- 服务器回复之后,会开始使用RTP通过udp向客户端的54492端口发送数据
- TEARDOWN - 向服务器发起关闭连接会话请求
- 客户端 -> 服务器
TEARDOWN rtsp://192.168.1.141:554 RTSP/1.0\r\n CSeq: 6\r\n Session: 66334873\r\n \r\n
- 客户端请求断开会话
- 服务器 -> 客户端
RTSP/1.0 200 OK\r\n CSeq: 6\r\n \r\n
sdp格式
- sdp格式由多行的type=value组成
- sdp会话描述由一个会话级描述和多个媒体级描述组成。会话级描述的作用域是整个会话,媒体级描述描述的是一个视频流或者音频流
- 会话级描述由"v="开始到第一个媒体级描述结束
- 媒体级描述由"m="开始到下一个媒体级描述结束
- 下面是上面示例的sdp文件
v=0\r\n o=- 91565340853 1 IN IP4 192.168.1.141\r\n t=0 0\r\n a=contol:*\r\n m=video 0 RTP/AVP 96\r\n a=rtpmap:96 H264/90000\r\n a=framerate:25\r\n a=control:track0\r\n
- v=0,表示sdp的版本
- o=- 91565340853 1 IN IP4 192.168.1.141
- 格式:o=<用户名> <会话id> <会话版本> <网络类型><地址类型> <地址>
- 用户名:-
- 会话id:91565340853,表示rtsp://192.168.1.141:554请求中的live这个会话
- 会话版本:1
- 网络类型:IN,表示internet
- 地址类型:IP4,表示ipv4
- 地址:192.168.1.141,表示服务器的地址
- m=video 0 RTP/AVP 96
- 格式: m=<媒体类型> <端口号> <传输协议> <媒体格式 >
- 媒体类型:video
- 端口号:0,为什么是0?因为上面在SETUP过程会告知端口号,所以这里就不需要了
- 传输协议:RTP/AVP,表示RTP OVER UDP,如果是RTP/AVP/TCP,表示RTP OVER TCP
- 媒体格式:表示负载类型(payload type),一般使用96表示H.264
- a=rtpmap:96 H264/90000
- 格式:a=rtpmap:<媒体格式><编码格式>/<时钟频率>
- a=framerate:25
- 表示帧率
- a=control:track0
- 表示这路视频流在这个会话中的编号
RTP协议
RTP协议封装示意图
RTP包格式
- rtp包由rtp首部和rtp载荷(数据)构成
- rtp首部
- 版本号(V):2Bit,用来标志使用RTP版本
- 填充位(P):1Bit,如果该位置位,则该RTP包的尾部就包含填充的附加字节
- 扩展位(X):1Bit,如果该位置位,则该RTP包的固定头部后面就跟着一个扩展头部
- 参与源数(CSRC计数(CC))4Bit,CSRC计数包括紧接在固定头后CSRC标识符个数。
- 标记位(M):1Bit,该位的解释由配置文档来承担
- 载荷类型(PT):7Bit,标识了RTP载荷的类型
- 序列号(SN):16Bit,发送方在每发送完一个RTP包后就将该域的值增加1,可以由该域检测包的丢失及恢复
- 包的序列。序列号的初始值是随机的
- 时间戳:32比特,记录了该包中数据的第一个字节的采样时刻
- 同步源标识符(SSRC):32比特,同步源就是RTP包源的来源。在同一个RTP会话中不能有两个相同的SSRC值
- 贡献源列表(CSRC List):0-15项,每项32比特,这个不常用
- rtp荷载
- rtp载荷为音频或者视频数据
- RTP默认是采用UDP发送的,格式为RTP头+RTP载荷,如果是使用TCP,那么需要在RTP头之前再加上四个字节
- 第一个字节:$,辨识符
- 第二个字节:通道,在SETUP的过程中获取
- 第三第四个字节: RTP包的大小,最多只能12位,第三个字节保存高4位,第四个字节保存低8位
RTCP协议
- RTCP用于在RTP传输过程中提供传输信息,可以报道RTP传输情况,还可以用来音视频同步