一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(三)RTSP命令解析
一、RTSP命令简述
RTSP是用来控制实时流媒体“播放”、“暂停”、“停止”、“录像”等行为的传输协议。该协议规定了一系列命令以及这些命令的发送格式,RTSP客户端可以通过发送这些指定的命令,从而控制媒体流数据的传输。rfc2326上明确指定的有以下11个命令:DESCRIBE, ANNOUNCE, GET_PARAMETER, OPTIONS, PAUSE, PLAY, RECORD, REDIRECT, SETUP, SET_PARAMETER, TEARDOWN。要完成基本的视频流传输,至少需要4个命令:DESCRIBE, SETUP, PLAY, TEARDOWN,而myRTSPClient中的example就是以这4个命令展开的,讲完了这4个命令,那我们的example程序也就基本讲完了。
我们现在就先来看看这4个命令是如何实现客户端与服务端之间的交互的。
(详细叙述可以参考:http://www.cnblogs.com/qq78292959/archive/2010/08/12/2077039.html)
二、DESCRIBE、SETUP、PLAY、TEARDOWN
客户端在发送这些命令的过程中,最关键的一个元素就是RTSP服务端的URI,在说明以下命令的过程中,我们假设RTSP服务端的URI为:rtsp://127.0.0.1/ansersion
1. DECRIBE
命令名称:DESCRIBE
命令作用:请求SDP
命令格式:
DESCRIBE<BLANK><RTSP URI><BLANK>RTSP/<RTSP VERSION>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n\r\n
(Note:<BLANK>:空格;<COMMAND SEQUENCE>:命令序列,每一次发送命令该数字加1)
命令示例:
DESCRIBE rtsp://127.0.0.1/ansersion RTSP/1.0
CSeq: 1
(Note:虽然看不见,但示例中最后是有空行的,必不可少哦!看看“命令格式”最后连着两个"\r\n"你就明白了。空行(\r\n)是RTSP数据包的结束标识。)
服务端返回信息格式:
RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n\r\n<SDP>
(Note:<OTHER>: 其他描述信息;<SDP>: SDP描述信息,SDP不属于RTSP的打包数据,这里可以看到空行(\r\n)在SDP之前)
服务端返回信息示例:
RTSP/1.0 200 OK
CSeq: 1
Date: Sun, Dec 27 2015 02:16:50 GMT
Content-Base: rtsp://127.0.0.1/ansersion/
Content-Type: application/sdp
Content-Length: 510
v=0
o=- 1451182595570866 1 IN IP4 192.168.81.145
s=Session streamed by "testOnDemandRTSPServer"
i=ansersion
t=0 0
a=tool:LIVE555 Streaming Media v2015.11.09
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:Session streamed by "testOnDemandRTSPServer"
a=x-qt-text-inf:ansersion
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=4D4033;sprop-parameter-sets=Z01AM5JUDAS0IAAAAwBAAAAM0eMGVA==,aO48gA==
a=control:track1
(Note:以RTSP客户端的角度,以上红字部分信息必须理解。
首先是"RTSP/1.0 200 OK",这个表示RTSP服务端成功受理客户端的请求。
再者是“m=video 0 RTP/AVP 96”,该信息指出了RTSP客户端提供传输的流媒体类型,“a=control:track1”指出了访问该流媒体的方式,是后续SETUP命令的重要参数,这是一个简化的版本,有时候服务端会返回完整版本:“a=control:rtsp://127.0.0.1/ansersion/track1”。
最后是“Z01AM5JUDAS0IAAAAwBAAAAM0eMGVA==”和“aO48gA==”,这是H264的SPS和PPS的Base64编码。老实说,要让RTSP客户端去考虑具体编码格式的问题,着实是一个设计上的瑕疵。后续我打算把这部分改掉,现在我们将其看作H264的重要参数即可)
2. SETUP
命令名称:SETUP
命令作用:建立流媒体会话,告知RTSP服务端准备资源,以待后续进一步操作(比如“PLAY”)
命令格式:
SETUP<BLANK><RTSP URI>/<SDP ATTRIBUTE CONTROL>RTSP/<RTSP VERSION>\r\nTransport:<BLANK><PROTOCOL>;<CAST METHOD>;client_port=<RTP PORT>-<RTCP PORT>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n\r\n
(Note:<SDP ATTRIBUTE CONTROL>:SDP中“a=control:track1”;<PROTOCOL>:实时流传输协议,一般为RTP+UDP;<CAST METHOD>:传输方式,单播或组播;)
命令示例:
SETUP rtsp://127.0.0.1/ansersion/track1 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=10330-10331
CSeq: 2
(Note:使用RTP传输(RTP/AVP/UDP),传输方式为单播(unicast),RTP和RTCP的端口号分别为10330和10331(client_port=10330-10331))
服务端返回信息格式:
RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n<SESSION ID>\r\n\r\n
(Note:<SESSION ID>:服务端建立好资源后,通过该标识访问其媒体流资源。)
服务端返回信息示例:
RTSP/1.0 200 OK
CSeq: 2
Date: Sun, Dec 27 2015 02:28:01 GMT
Transport: RTP/AVP;unicast;destination=127.0.0.1;source=127.0.0.1;client_port=10330-10331;server_port=6970-6971
Session: ABF519D9;timeout=65
(Note:其中“ABF519D9”为SESSION ID,PLAY命令以此为参数,告知服务端以SETUP命令中指定的方式(RTP、unicast、client_port=10330-10331)进行媒体流传输)
3. PLAY
命令名称:PLAY
命令作用:告知服务端开始传输媒体流
命令格式:
PLAY<BLANK><RTSP URI>RTSP/<RTSP VERSION>\r\nCSeq:<BLANK><COMMAND SEQUENCE>Session:<BLANK><SESSION ID>\r\n\r\n
命令示例:
PLAY rtsp://127.0.0.1/ansersion RTSP/1.0
CSeq: 3
Session: ABF519D9
(Note:“ABF519D9”为SETUP返回信息中指定的ID)
服务端返回信息格式:
RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n\r\n
服务端返回信息示例:
RTSP/1.0 200 OK
CSeq: 3
Date: Sun, Dec 27 2015 02:28:01 GMT
Range: npt=0.000-
Session: ABF519D9
RTP-Info: url=rtsp://127.0.0.1/ansersion/track1;seq=35825;rtptime=3103868658
(Note:服务端受理PLAY命令之后,就会有媒体流数据向客户端发送过来了。依照SETUP中的传输方式,媒体流会通过RTP/UDP封包发送至客户端的10330端口)
4. TEARDOWN
命令名称:TEARDOWN
命令作用:取消会话,告知服务端停止继续发包,并销毁相关资源。
命令格式:
TEARDOWN<BLANK><RTSP URI>RTSP/<RTSP VERSION>\r\nCSeq:<BLANK><COMMAND SEQUENCE>Session:<BLANK><SESSION ID>\r\n\r\n
命令示例:
TEARDOWN rtsp://127.0.0.1/ansersion RTSP/1.0
CSeq: 4
Session: ABF519D9
服务端返回信息格式:
RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE>\r\nCSeq:<BLANK><COMMAND SEQUENCE>\r\n<OTHER>\r\n\r\n
服务端返回信息示例:
RTSP/1.0 200 OK
CSeq: 4
Date: Sun, Dec 27 2015 02:17:29 GMT
(Note:服务端受理TEARDOWN命令之后,服务端就不会再发送数据“骚扰”客户端了。)
三、附录
以下是一份截获的网络数据包,可使用wireshark打开,以供参考。
http://pan.baidu.com/s/1gfae1wv
一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(三)RTSP命令解析的更多相关文章
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(一)简介
关于实时流媒体传输的开源库,目前流行的主要有两个:live555和jrtplib. 其中live555将rtp.rtcp和rtsp的传输协议实现集于一身,功能齐全,是个超强的集合体.但是对于嵌入式系统 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(二)示例
一.搭建RTSP服务器 要想测试RTSP客户端,没有服务端怎么行呢?然而,有时候条件有限,手头并没有独立的RTSP服务器拿来用,那么我们不妨自己撘一个. 以下有2种方便的做法可供选择: 第一种:使用v ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(四)example代码解析
一.example逻辑伪码 myRTSPClient附带3个example程序:simple_example.complete_example.common_example.后两个example都是从 ...
- 一个基于JRTPLIB的轻量级RTSP客户端——myRTSPClient详解
myRTSPClient是一个轻量级的RTSP客户端C++函数库. 支持多平台,支持H264,H265,MPA等音视频传输. 免费开源,接口易用,配套教程与代码解析(本博客). 适合RTSP入门学习. ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(一)用ffmpeg解码视频
一.概述 myRTSPClient(RTSPClient)获取音视频数据之后,接下来的工作便是将音视频数据交给解码器去解码(ffmpeg),ffmpeg解码之后于是便有了呈现在终端用户(USER)面前 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(四)用户接口层之处理SDP报文
当RTSP客户端向RTSP服务端发送DESCRIBE命令时,服务端理应当回复一条SDP报文. 该SDP报文中包含RTSP服务端的基本信息.所能提供的音视频媒体类型以及相应的负载能力,以下是一段SDP示 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(五)用户接口层之提取媒体流数据
当RTSP客户端向RTSP服务端发送完PLAY命令后,RTSP服务端就会另外开启UDP端口(SDP协商定义的端口)发送RTP媒体流数据包.这些数据包之间会间隔一段时间(毫秒级)陆续被发送到RTSP客户 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(十)使用JRTPLIB传输RTP数据
myRtspClient通过简单修改JRTPLIB的官方例程作为其RTP传输层实现.因为JRTPLIB使用的是CMAKE编译工具,这就是为什么编译myRtspClient时需要预装CMAKE. 该部分 ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(二)用户接口层之RtspClient类及其构造函数
RtspClient类是myRTSPClient函数库所有特性集中实现的地方. 主要为用户提供: 1. RTSP协议通信接口函数,如DoOPTIONS(): 2. RTSP账号.密码设置函数,如Set ...
随机推荐
- (转发)RequestDispatcher的include()方法和forward()方法的区别
forward(): 该方法用于将请求从一个Servlet传递给服务器上的另外的Servlet.JSP页面或者是HTML文件. 在Servlet中,可以对请求做一个初步的处理,然后调用这个方法,将请求 ...
- CJOJ 2307 【一本通】完全背包(动态规划)
CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...
- (Android)Wifi-Direct直连
因项目需要Pad端和手机端交互,采用wifi直连.查阅资料,大概写下一些资料和收获吧.注:大公司的代码带不出来,我也比较懒不想再认真去写一遍了,所以大概这个意思哦. wifi直连也叫做wifi设备点对 ...
- docker~Dockerfile方式建立镜像HelloWorld
回到目录 Dockerfile可以便捷的建立一个image,它可以在一个镜像基础上,去构建另一个镜像,这也许就是它的特色,也是docker的本意! 我们下载一个mono的镜像 docker pull ...
- Python面向对象编程(四)
1.多态 多态的概念虽然现在才说,但是我们一直在用.多态就是多种形态的意思,动物都猫,狗,猪等等,这些都是动物的多种形态. 反映在Python中,多态就意味着就算不知道变量所引用的对象类型是什么,也能 ...
- ajax分页效果、分类联动、搜索功能
一.使用smarty+ajax+php实现无刷新分页效果 效果图 <!DOCTYPE html> <html lang="en"> <head> ...
- 使用jquery获取url及url参数的方法
使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下: window.location.href; 其实只是用到了javasc ...
- javaScript获取url问号后面的参数
javaScript获取url问号后面的参数方法 function GetRequest() { var url = location.search; //获取url中"?"符后的 ...
- Xamarin.Forms(一) Visual Studio 连接安卓模拟器(逍遥安卓)
刚开始学习Xamarin.Forms的时候总是比较困难的,连接安卓模拟器就花了我好长时间,后来在网上找到了方法: 1.打开adb.exe所在目录: 如:cd F:\Android\android-sd ...
- discuz相关总结
1.dz的下载安装 进入discuz官方网站下载discuz安装包:拷贝出其中的upload目录,重命名为discuz,将discuz目录上传至linux公网服务器: 配置web服务器,nginx或者 ...