一、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命令解析的更多相关文章

  1. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(一)简介

    关于实时流媒体传输的开源库,目前流行的主要有两个:live555和jrtplib. 其中live555将rtp.rtcp和rtsp的传输协议实现集于一身,功能齐全,是个超强的集合体.但是对于嵌入式系统 ...

  2. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(二)示例

    一.搭建RTSP服务器 要想测试RTSP客户端,没有服务端怎么行呢?然而,有时候条件有限,手头并没有独立的RTSP服务器拿来用,那么我们不妨自己撘一个. 以下有2种方便的做法可供选择: 第一种:使用v ...

  3. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——收流篇:(四)example代码解析

    一.example逻辑伪码 myRTSPClient附带3个example程序:simple_example.complete_example.common_example.后两个example都是从 ...

  4. 一个基于JRTPLIB的轻量级RTSP客户端——myRTSPClient详解

    myRTSPClient是一个轻量级的RTSP客户端C++函数库. 支持多平台,支持H264,H265,MPA等音视频传输. 免费开源,接口易用,配套教程与代码解析(本博客). 适合RTSP入门学习. ...

  5. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(一)用ffmpeg解码视频

    一.概述 myRTSPClient(RTSPClient)获取音视频数据之后,接下来的工作便是将音视频数据交给解码器去解码(ffmpeg),ffmpeg解码之后于是便有了呈现在终端用户(USER)面前 ...

  6. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(四)用户接口层之处理SDP报文

    当RTSP客户端向RTSP服务端发送DESCRIBE命令时,服务端理应当回复一条SDP报文. 该SDP报文中包含RTSP服务端的基本信息.所能提供的音视频媒体类型以及相应的负载能力,以下是一段SDP示 ...

  7. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(五)用户接口层之提取媒体流数据

    当RTSP客户端向RTSP服务端发送完PLAY命令后,RTSP服务端就会另外开启UDP端口(SDP协商定义的端口)发送RTP媒体流数据包.这些数据包之间会间隔一段时间(毫秒级)陆续被发送到RTSP客户 ...

  8. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(十)使用JRTPLIB传输RTP数据

    myRtspClient通过简单修改JRTPLIB的官方例程作为其RTP传输层实现.因为JRTPLIB使用的是CMAKE编译工具,这就是为什么编译myRtspClient时需要预装CMAKE. 该部分 ...

  9. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(二)用户接口层之RtspClient类及其构造函数

    RtspClient类是myRTSPClient函数库所有特性集中实现的地方. 主要为用户提供: 1. RTSP协议通信接口函数,如DoOPTIONS(): 2. RTSP账号.密码设置函数,如Set ...

随机推荐

  1. 自定义VS程序异常处理及调试Dump文件(一)

    自定义VS程序异常处理及调试Dump文件(一) 1. Dump文件 1. Dump文件介绍 Dump文件(Dump File),也叫转储文件,以.DMP为文件后缀.dump文件是进程在内存中的镜像文件 ...

  2. jmeter-Java-MongoDB 数据库增删改查操作

    在日常测试过程中会发现有些测试数据是通过数据库来获取的,一般常用的数据比如SQL .Oracle,此类数据库jmeter有专门的插件进行使用JDBC,今天跟大家说一说关于Mongodb这个数据库jme ...

  3. 计算BMI

    用一个小程序计算BMI 代码如下: package Day06; public class BMI { private String name; private int age; private do ...

  4. 关于springmvc配置validator的注意事项

    <mvc:annotation-driven validator="validator" /> 在使用springmvc整合hibernate-validator做表单 ...

  5. 读Zepto源码之Callbacks模块

    Callbacks 模块并不是必备的模块,其作用是管理回调函数,为 Defferred 模块提供支持,Defferred 模块又为 Ajax 模块的 promise 风格提供支持,接下来很快就会分析到 ...

  6. Java 多态的实现原理

    一个对象变量可以指示多种实际类型的现象称为多态 允许不同类的对象对同一消息做出响应.方法的重载.类的覆盖正体现了多态. 1.多态的机制 1.1 本质上多态分两种 .编译时多态(又称静态多态) .运行时 ...

  7. Multimodal —— 看图说话(Image Caption)任务的论文笔记(三)引入视觉哨兵的自适应attention机制

    在此前的两篇博客中所介绍的两个论文,分别介绍了encoder-decoder框架以及引入attention之后在Image Caption任务上的应用. 这篇博客所介绍的文章所考虑的是生成captio ...

  8. 如何写出面试官欣赏的Java单例

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 今天我们不谈单例模式的用途,只说一说如果在面试的时候面试官让你敲一段代码 ...

  9. eclipse导入lombok后打不开(如果你的lombok不是最新的,那就来下载最新的)

    如果你的不是最新的,去这里下载最新版的,先点击左上角的Download红方块,然后再点击下图中的位置 https://projectlombok.org/ 下载完后把eclipse关掉,双击下载的ja ...

  10. 156个Python网络爬虫资源

    本列表包含Python网页抓取和数据处理相关的库. 网络相关 通用 urllib - 网络库(标准库) requests - 网络库 grab - 网络库(基于pycurl) pycurl - 网络库 ...