outlook邮件存放位置新收到的邮件怎么自动存放在已删除邮件内了?

RTSP协议详解_RTSP协议详解免费下载_爱问共享资料
(window.slotbydup=window.slotbydup || []).push({
id: '2370785',
container: s,
size: '146,102',
display: 'inlay-fix'
RTSP协议详解.pdf
1666次下载
简介:当前资料暂无简介!
RTSP协议详解.pdf
RTSP协议详解.pdf
1666次下载
简介:当前资料暂无简介!
主要RTP详细学习
多个实用文档
vC线程同步技术、RTSP协议详解、高质量C++C编程指南、FFPLAY的原理
当前资料暂无简介~
rtsp实时流媒体传输协议资料
RTSP 协议英文原版,更权威,更详细。
RTSP协议分析
中文版的 RTSP 协议分析。
学习rtsp流媒体
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
当前资料暂无简介~
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
刚刚上传了
在此可输入您对该资料的评论~
资料阅读排行
请选择举报的类型
赌博犯罪类
资料评价:
所需积分:0音视频.传输.RTSP(4)
&&& RTSP(Real Time Stream Protocol,实时流协议)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频的受控、点播成为可能。数据 源包括现插数据与存储在剪辑中的数据。该协议目的在于控制多个数据发送连接,为选择发送通道如UDP、多播UDP与TCP等提供途径,并为选择基于RTP 上发送机制提供方法。
实时流协议建立并控制一个或几个时间同步的连续流媒体。尽管连续媒体流与控制流交叉是可能的,通常它本身并不发送连续流。换言之,RTSP充当多媒 体服务器的网络远程控制。RTSP连接没有绑定到传输层连接,如TCP。在RTSP连接期间,RTSP用户可打开或关闭多个对服务器的可靠传输连接以发出 RTSP请求。此外,可使用无连接传输协议,如UDP。RTSP流控制的流可能用到RTP,但RTSP操作并不依赖用于携带连续媒体的传输机制。实时流协 议在语法和操作上与HTTP 1.1类似,因此HTTP的扩展机制大都可加入RTSP。协议支持的操作如下:
(1)从媒体服务器上检索媒体
用户可通过HTTP或其他方法提交一个演示描述。如演示是多播,演示时就包含用于连续媒体的多播地址和端口。如演示仅通过单播发送给用户,用户为了安全应提供目的地址。
(2)媒体服务器邀请进入会议
媒体服务器可被邀请参加正进行的会议,或回放媒体,或记录其中一部分或全部。这种模式在分布式教育应用上很有用,会议中几方可轮流按远程控制按钮。
(3)将媒体加到现成讲座中
例如,服务器告诉用户可获得附加媒体内容。这对现场讲座显得尤其有用。如HTTP 1.1中类似,RTSP请求可由代理、通道与缓存处理。
2.协议特点
RTSP有如下特性。
(1) 可扩展性:新方法和参数很容易加入RTSP。
(2) 易解析:RTSP可由标准HTTP或MIME解析器解析。
(3) 安全:RTSP使用网页安全机制。
(4) 独立于传输:RTSP可使用不可靠数据报协议(EDP)、可靠数据报协议(RDP);如要实现应用级可靠,可使用可靠流协议。
(5) 多服务器支持:每个流可放在不同服务器上,用户端自动与不同服务器建立几个并发控制连接,媒体同步在传输层执行。
(6) 记录设备控制:协议可控制记录和回放设备。
(7) 流控与会议开始分离:仅要求会议初始化协议提供,或可用来创建惟一会议标识号。特殊情况下,可用SIP或H.323来邀请服务器入会。
(8) 适合专业应用:通过SMPTE时标,RTSP支持帧级精度,允许远程数字编辑。
(9) 演示描述中立:协议没强加特殊演示或元文件,可传送所用格式类型;然而,演示描述至少必须包括一个RTSP URL。
(10) 代理与防火墙友好:协议可由应用和传输层防火墙处理。防火墙需要理解SETUP方法,为UDP媒体流打开一个“缺口”。
(11) HTTP友好:此处,RTSP明智地采用HTTP观念,使现在结构都可重用。结构包括Internet内容选择平台(PICS)。由于在大多数情况下控制连续媒体需要服务器状态,RTSP不仅仅向HTFP添加方法。
(12) 适当的服务器控制:如用户启动一个流,必须也可以停止一个流。
(13) 传输协调:实际处理连续媒体流前,用户可协调传输方法。
(14) 性能协调:如基本特征无效,必须有一些清理机制让用户决定哪种方法没生效。这允许用户提出适合的用户界面。
3.扩展RTSP
由于不是所有媒体服务器有着相同的功能,媒体服务器有必要支持不同请求集。RTSP可以如下三种方式扩展:
(1) 以新参数扩展。如用户需要拒绝通知,而方法扩展不支持,相应标记就加人要求的段中。
(2) 加入新方法。如信息接收者不理解请求,返回501错误代码,发送者不应再次尝试这种方法。用户可使用OPTIONS方法查询服务器支持的方法。服务器使用公共响应头列出支持的方法。
(3) 定义新版本协议,允许改变所有部分(协议版本号位置除外)。
4.操作模式
每个演示和媒体流可用RTSP URL识别。演示组成的整个演示与媒体属性由演示描述文件定义。使用HTTP或其他途径用户可获得这个文件,它没有必要保存在媒体服务器上。为了说明这个 问题,假设演示描述了多个演示,其中每个演示维持了一个公共时间轴。为简化说明,且不失一般性,假定演示描述的确包含这样一个演示。演示可包含多个媒体 流。除媒体参数外,网络目标地址和端口也需要决定。
下面区分几种操作模式。
(1)单播:用户选择的端口号将媒体发送到RTSP请求源。
(2)服务器选择地址多播:媒体服务器选择多播地址和端口,这是现场直播或准点播常用的方式。
(3)用户选择地址多播:如服务器加入正在进行的多播会议,多播地址、端口和密钥由会议描述给出。
5.RTSP状态
RTSP控制通过单独协议发送的流,与控制通道无关。例如,RTSP控制可通过TCP连接,而数据流通过UDP。因此,即使媒体服务器没有收到请 求,数据也会继续发送。在连接生命期,单个媒体流可通过不同TCP连接顺序发出请求来控制。所以,服务器需要维持能联系流与RTSP请求的连接状态。 RTSP中很多方法与状态无关,但下列方法在定义服务器流资源的分配与应用上起着重要的作用:
(1) SETUP:让服务器给流分配资源,启动RTSP连接。
(2) PLAY与RECORD:启动SETUP分配流的数据传输。
(3) PAUSE:临时停止流,而不释放服务器资源。
(4) TEARDOWN:释放流的资源,RTSP连接停止。
标识状态的RTSP方法使用连接头段识别RTSP连接,为响应SETUP请求,服务器连接产生连接标识。
6.与其他协议的关系
RTSP在功能上与HTTP有重叠,与HTTP相互作用体现在与流内容的初始接触是通过网页的。目前的协议规范目的在于允许在网页服务器与实现 RTSP媒体服务器之间存在不同传递点。例如,演示描述可通过HTTP和RTSP检索,这降低了浏览器的往返传递,也允许独立RTSP服务器与用户不全依 靠HTTP。
但是,RTSP与HTTP的本质差别在于数据发送以不同协议进行。HTTP是不对称协议,用户发出请求,服务器作出响应。RTSP中,媒体用户和服 务器都可发出请求,且其请求都是无状态的;在请求确认后很长时间内,仍可设置参数,控制媒体流。重用HTTP功能至少在两个方面有好处,即安全和代理。要 求非常接近时,在缓存、代理和授权上采用HTTP功能是有价值的。
当大多数实时媒体使用RTP作为传输协议时,RTSP没有绑定到RTP。RTSP假设存在演示描述格式可表示包含几个媒体流的演示的静态与临时属性。
二. 协议参数
1.RTSP版本
H.321采用,用RTSP代替HTTP。
2.RTSPURL
“rksp&和“rtspu&方案用于指RTSP协议使用的网络资源,为RTSP URL定义方案特定的语法和语义。
3.会议标识
会议标识对RTSP来说是模糊的,采用标准URI编码方法编码,可包含任何八位组数值。会议标识必须全局惟一。
4.连接标识
连接标识是长度不确定的字符串,必须随机选择,至少要8个八位组长,使其很难被猜出。
5.SMPTE相关时标
SMPTE相关时标表示相对剪辑开始的时间,相关时标表示成SMPTE时间代码,精确到帧级。时间代码格式为小时:分钟:秒:帧。缺省smpte格 式是&SMPTE 30&,帧速率为每秒29.97帧。其他SMPTE代码可选择使用smpte时间获得支持(如&SMPIE 25&)。时间数值中帧段值可从0到29。每秒30与29.97帧的差别可将每分钟的头两帧丢掉来实现。如帧值为零,就可删除。
6.正常播放时间
正常播放时间(NPT)表示相对演示开始的流绝对位置。时标由十进制分数组成。左边部分用秒或小时、分钟、秒表示;小数点右边部分表示秒的部分。演 示的开始对应0.0秒,负数没有定义。特殊常数定义成现场事件的当前时刻,这也许只用于现场事件。直观上,NPT是联系观看者与程序的时钟,通常以数字式 显示在VCR上。
7.绝对时间
绝对时间表示成ISO 8601时标,采用UTC(GMT)。
8.可选标签
可选标签是用于指定RTSP新可选项的惟一标记。这些标记用在请求和代理-请求头段。当登记新RTSP选项时,需提供下列信息:
(1)名称和描述选项。名称长度不限,但不应该多于20个字符。名称不能包括空格、控制字符。
(2)表明谁改变选项的控制。如IETF,ISO,ITU-T,或其他国际标准团体、联盟或公司。
(3)深入描述的参考,如RFC、论文、专利、技术报告、文档源码和计算机手册。
(4)对专用选项,附上联系方式。
三. RTSP信息
RTSP是基于文本的协议,采用ISO 10646字符集,使用UTF-8编码方案。行以CRLF中断,但接收者本身可将CR和LF解释成行终止符。基于文本的协议使以自描述方式增加可选参数更 容易。由于参数的数量和命令的频率出现较低,处理效率没引起注意。文本协议很容易以脚本语言(如:Tcl,Visual Basic与Perl)实现研究原型。
ISO 10646字符集避免敏感字符集切换,但对应用来说不可见。RTCP也采用这种编码方案。带有重要意义位的ISO 8859-1字符表示如x x x x x x。RTSP信息可通过任何低层传输协议携带。
请求包括方法、方法作用于其上的对象以及进一步描述方法的参数。方法也可设计为在服务器端只需要少量或不需要状态维护。当信息体包含在信息中,信息体长度由如下因素决定:
(1)不管实体头段是否出现在信息中,不包括信息体的响应,信息总以头段后第一个空行结束。
(2)如出现内容长度头段,其值以字节计,表示信息体长度。如未出现头段,其值为零。
(3)服务器关闭连接。
注意,RTSP目前并不支持HTTP 1.1“块”传输编码,需要有内容长度头。假如返回适度演示描述长度,即使动态产生,使块传输编码没有必要,服务器也应该能决定其长度。如有实体,即使必须有内容长度,且长度没显式给出,规则可确保行为合理。
从用户到服务器端的请求信息在第一行内包括源采用的方法、源标识和所用协议版本。RTSP定义了附加状态代码,但没有定义任何HTTP代码。
如不受请求方法或响应状态编码限制,请求和响应信息可传输实体,实体则由实体头文件和实体体组成,有些响应仅包括实体头。在此,根据谁发送实体、谁接收实体,发送者和接收者可分别指用户和服务器。
实体头定义实体体可选元信息,如没有实体体,指请求标识的资源。扩展头机制允许定义附加实体头段,而不用改变协议,但这些段不能假定接收者能识别。不可识别头段应被接收者忽略,而让代理转发。
RTSP请求可以几种不同方式传送:
·&&&&&&&&&&&& 持久传输连接,用于多个请求/响应传输。
·&&&&&&&&&&&& 每个请求/响应传输一个连接。
·&&&&&&&&&&&& 无连接模式。
传输连接类型由RTSP URL来定义。对“rtsp'’方案,需要持续连接;而&rtspu&方案,调用RTSP请求发送,而不用建立连接。
不像HTTP,RTSP允许媒体服务器给媒体用户发送请求。然而,这仅在持久连接时才支持,否则媒体服务器没有可靠途径到达用户,这也是请求通过防火墙从媒体服务器传到用户的惟一途径。
六. 方法定义
方法记号表示资源上执行的方法,它区分大小写。新方法可在将来定义,但不能以$开头。已定义方法如表14-03-1所示。
表14-03-1 &&RTSP方法
检查演示或媒体对象的描述,也允许使用接收头指定用户理解的描述格式。DESCRIBE的答复-响应组成媒体RTSP初始阶段
当从用户发往服务器时,ANNOUNCE将请求URL识别的演示或媒体对象描述发送给服务器;反之,ANNOUNCE实时更新连接描述。如新媒体流加入演示,整个演示描述再次发送,而不仅仅是附加组件,使组件能被删除
GET_PARAMETER
GET_PARAMETER请求检查RUL指定的演示与媒体的参数值。没有实体体时,GET_PARAMETER也许能用来测试用户与服务器的连通情况
可在任意时刻发出OPTIONS请求,如用户打算尝试非标准请求,并不影响服务器状态
PAUSE 请求引起流发送临时中断。如请求URL命名一个流,仅回放和记录被停止;如请求URL命名一个演示或流组,演示或组中所有当前活动的流发送都停止。恢复回 放或记录后,必须维持同步。在SETUP消息中连接头超时参数所指定时段期间被暂停后,尽管服务器可能关闭连接并释放资源,但服务器资源会被预订
PLAY 告诉服务器以SEFUP指定的机制开始发送数据;直到一些SETUP请求被成功响应,客户端才可发布PLAY请求。PLAY请求将正常播放时间设置在所指 定范围的起始处,发送流数据直到范围的结束处。PLAY请求可排成队列,服务器将PLAY请求排成队列,顺序执行
该 方法根据演示描述初始化媒体数据记录范围,时标反映开始和结束时间;如没有给出时间范围,使用演示描述提供的开始和结束时间。如连接已经启动,立即开始记 录,服务器数据请求URL或其他URL决定是否存储记录的数据;如服务器没有使用URL请求,响应应为201(创建),并包含描述请求状态和参考新资源的 实体与位置头。支持现场演示记录的媒体服务器必须支持时钟范围格式,smpte格式没有意义
重定向请求通知客户端连接到另一服务器地址。它包含强制头地址,指示客户端发布URL请求;也可能包括参数范围,以指明重定向何时生效。若客户端要继续发送或接收URL媒体,客户端必须对当前连接发送TEARDOWN请求,而对指定主执新连接发送SETUP请求
对 URL的SETUP请求指定用于流媒体的传输机制。客户端对正播放的流发布一个SETUP请求,以改变服务器允许的传输参数。如不允许这样做,响应错误 为&455 Method Not Valid In This State”。为了透过防火墙,客户端必须指明传输参数,即使对这些参数没有影响
SET_PARAMETER
这 个方法请求设置演示或URL指定流的参数值。请求仅应包含单个参数,允许客户端决定某个特殊请求为何失败。如请求包含多个参数,所有参数可成功设置,服务 器必须只对该请求起作用。服务器必须允许参数可重复设置成同一值,但不让改变参数值。注意:媒体流传输参数必须用SETUP命令设置。将设置传输参数限制 为SETUP有利于防火墙。将参数划分成规则排列形式,结果有更多有意义的错误指示
TEARDOWN请求停止给定URL流发送,释放相关资源。如URL是此演示URL,任何RTSP连接标识不再有效。除非全部传输参数是连接描述定义的,SETUP请求必须在连接可再次播放前发布
注:P----演示,S----流,C----用户端,S----服务器端
某些防火墙设计与其他环境可能要求服务器插入RTSP方法和流数据。由于插入将使客户端和服务器操作复杂,并增加附加开销,除非有必要,应避免这样 做。插入二进制数据仅在RTSP通过TCP传输时才可使用。流数据(如RTP包)用一个ASCII字符$封装,后跟一个一字节通道标识,其后是封装二进制 数据的长度,两字节整数。流数据紧跟其后,没有CRLF,但包括高层协议头。每个$块包含一个高层协议数据单元。
当传输选择为RTP,RTCP信息也被服务器通过TCP连接插入。缺省情况下,RTCP包在比RTP通道高的第一个可用通道上发送。客户端可能在另 一通道显式请求RTCP包,这可通过指定传输头插入参数中的两个通道来做到。当两个或更多流交叉时,为取得同步,需要RTCP。而且,这为当网络设置需要 通过TCP控制连接透过RTP/RTCP提供了一条方便的途径,可能时,在UDP上进行传输。
七. 流水线操作
支持持久连接或无连接的客户端可能给其请求排队。服务器必须以收到请求的同样顺序发出响应。如果请求不是发送给多播组,接收者就确认请求,如没有确认信息,发送者可在超过一个来回时间(RTT)后重发同一信息。
在TCP中RTT估计的初始值为500ms。应用缓存最后所测量的RTT,作为将来连接的初始值。如使用一个可靠传输协议传输RTSP,请求不允许 重发,RTSP应用反过来依赖低层传输提供可靠性。如两个低层可靠传输(如TCP和RTSP)应用重发请求,有可能每个包损失导致两次重传。由于传输栈在 第一次尝试到达接收者前不会发送应用层重传,接收者也不能充分利用应用层重传。如包损失由阻塞引起,不同层的重发将使阻塞进一步恶化。时标头用来避免重发 模糊性问题,避免对圆锥算法的依赖。每个请求在CSeq头中携带一个系列号,每发送一个不同请求,它就加一。如由于没有确认而重发请求,请求必须携带初始
实现RTSP的系统必须支持通过TCP传输RTSP,并支持UDP。对UDP和TCP,RTSP服务器的缺省端口都是554。许多目的一致的 RTSP包被打包成单个低层PDU或TCP流。RTSP数据可与RTP和RTCP包交叉。不像HTTP,RTSP信息必须包含一个内容长度头,无论信息何 时包含负载。否则,RTSP包以空行结束,后跟最后一个信息头。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:85495次
积分:1981
积分:1981
排名:第17674名
原创:92篇
转载:106篇RTSP客户端的JAVA实现_Java_ThinkSAAS
RTSP客户端的JAVA实现
RTSP客户端的JAVA实现
内容来源: 网络
1. 《RTSP简单命令》:http://blog.csdn.net/feidragon319/archive//1742357.aspx
2. /dispbbs.asp?boardid=15&Id=22948
3. 《RTSP客户端的Java实现》:/ssyuan/blog/item/566df6defac1dc5094ee37eb.html
二. RTSP的常用命令与解释
其中C是客户端,S是服务端。
OPTION request //询问S有哪些方法可用
OPTION response //S回应信息中包括提供的所有可用方法
使用举例:
客户端到服务端:
OPTIONS rtsp://218.207.101.236:554/mobile/3/67A451E RTSP/1.0
OPTIONS rtsp://218.207.101.236:554/mobile/3/67A451E RTSP/1.0
Cseq: 1 服务端对OPTIONS的回应:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD
DESCRIBE request //要求得到S提供的媒体初始化描述信息
DESCRIBE response //S回应媒体初始化描述信息,主要是sdp
使用举例:
客户端到服务端:
DESCRIBE Java代码
rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp RTSP/1.0
rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp RTSP/1.0
Cseq: 2 服务端对OPTIONS的回应:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Content-length: 421
Date: Mon, 03 Aug :33 GMT
Expires: Mon, 03 Aug :33 GMT
Content-Type: application/sdp
x-Accept-Retransmit: our-retransmit
x-Accept-Dynamic-Rate: 1
Content-Base: rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/
o=MediaBox 813 IN IP4 0.0.0.0
s=RTSP Session
i=Starv Box Live Cast
c=IN IP4 218.207.101.236
a=range:npt=now-
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 MP4V-ES/1000
a=fmtp:96 profile-level-id=8; config=fa282c2090a31f; decode_buf=12586
a=range:npt=now-
a=framerate:5
a=framesize:96 176-144
a=cliprect:0,0,144,176
a=control:trackID=1
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Content-length: 421
Date: Mon, 03 Aug :33 GMT
Expires: Mon, 03 Aug :33 GMT
Content-Type: application/sdp
x-Accept-Retransmit: our-retransmit
x-Accept-Dynamic-Rate: 1
Content-Base: rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/
o=MediaBox 813 IN IP4 0.0.0.0
s=RTSP Session
i=Starv Box Live Cast
c=IN IP4 218.207.101.236
a=range:npt=now-
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 MP4V-ES/1000
a=fmtp:96 profile-level-id=8; config=fa282c2090a31f; decode_buf=12586
a=range:npt=now-
a=framerate:5
a=framesize:96 176-144
a=cliprect:0,0,144,176
a=control:trackID=1 2.3
SETUP request //设置会话的属性,以及传输模式,提醒S建立会话
SETUP response //S建立会话,返回会话标识符,以及会话相关信息
客户端到服务端的请求举例:
SETUP rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/trackID=1
Transport: RTP/AVP;UNICAST;client_port=;mode=play
SETUP rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/trackID=1
Transport: RTP/AVP;UNICAST;client_port=;mode=play 服务端对客户端的回应举例:
RTSP/1.0 200 OK
Server: PVSS/1.4.8(Build/;Platform/Win32;Release/StarV )
Session: 89
Date: Mon, 03 Aug :33 GMT
Expires: Mon, 03 Aug :33 GMT
Transport: RTP/AVP;UNICAST;mode=client_port=;server_port=
RTSP/1.0 200 OK
Server: PVSS/1.4.8(Build/;Platform/Win32;Release/StarV )
Session: 89
Date: Mon, 03 Aug :33 GMT
Expires: Mon, 03 Aug :33 GMT
Transport: RTP/AVP;UNICAST;mode=client_port=;server_port= 2.4
PLAY request //C请求播放
PLAY response //S回应该请求的信息
客户端到服务端的请求举例:
PLAY rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp RTSP/1.0
Session: 89
PLAY rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp RTSP/1.0
Session: 89
服务端对客户端的回应举例:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 89
RTP-Info: url=rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/trackID=1;seq=0;rtptime=0
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 89
RTP-Info: url=rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/trackID=1;seq=0;rtptime=0
PAUSE request //C请求暂停播放
PAUSE response //S回应该请求的信息
客户端到服务端的请求举例:
PAUSE rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/ RTSP/1.0
Session: 89
PAUSE rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/ RTSP/1.0
Session: 89 服务端对客户端的回应举例:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 89
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 892.6
TEARDOWN request //C请求关闭会话
TEARDOWN response //S回应该请求
客户端到服务端的请求举例:
TEARDOWN rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/ RTSP/1.0
User-Agent: RealMedia Player HelixDNAClient/10.0.0.11279 (win32)
Session: 89
TEARDOWN rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/ RTSP/1.0
User-Agent: RealMedia Player HelixDNAClient/10.0.0.11279 (win32)
Session: 89 服务端对客户端的回应举例:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 89
Connection: Close
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 89
Connection: Close 三. RTSP客户端的Java实现
接口IEvent.java
接口IEvent.java的代码如下:
package com.amigo.
import java.io.IOE
import java.nio.channels.SelectionK
* IEvent.java 网络事件处理器,当Selector可以进行操作时,调用这个接口中的方法.
下午03:35:51
* @author sycheng
* @version 1.0
public interface IEvent {
* 当channel得到connect事件时调用这个方法.
* @param key
* @throws IOException
void connect(SelectionKey key) throws IOE
* 当channel可读时调用这个方法.
* @param key
* @throws IOException
void read(SelectionKey key) throws IOE
* 当channel可写时调用这个方法.
* @throws IOException
void write() throws IOE
* 当channel发生错误时调用.
* @param e
void error(Exception e);
RTSP的测试类:RTSPClient.java
RTSP的测试类RTSPClient.java类的代码如下所示:
package com.amigo.
import java.io.IOE
import java.net.InetSocketA
import java.nio.ByteB
import java.nio.channels.SelectionK
import java.nio.channels.S
import java.nio.channels.SocketC
import java.util.I
import java.util.concurrent.atomic.AtomicB
public class RTSPClient extends Thread implements IEvent {
private static final String VERSION ="RTSP/1.0
private static final String RTSP_OK ="RTSP/1.0 200 OK";
/** *//** 远程地址 */
private final InetSocketAddress remoteA
/** *//** * 本地地址 */
private final InetSocketAddress localA
/** *//** * 连接通道 */
private SocketChannel socketC
/** *//** 发送缓冲区 */
private final ByteBuffer sendB
/** *//** 接收缓冲区 */
private final ByteBuffer receiveB
private static final int BUFFER_SIZE = 8192;
/** *//** 端口选择器 */
private Status sysS
/** *//** 线程是否结束的标志 */
private AtomicB
private int seq=1;
private boolean isS
private String trackI
private enum Status {
init, options, describe, setup, play, pause, teardown
public RTSPClient(InetSocketAddress remoteAddress,
InetSocketAddress localAddress, String address) {
this.remoteAddress = remoteA
this.localAddress = localA
this.address =
// 初始化缓冲区
sendBuf = ByteBuffer.allocateDirect(BUFFER_SIZE);
receiveBuf = ByteBuffer.allocateDirect(BUFFER_SIZE);
if (selector == null) {
// 创建新的Selector
selector = Selector.open();
} catch (final IOException e) {
e.printStackTrace();
startup();
sysStatus = Status.
shutdown=new AtomicBoolean(false);
public void startup() {
// 打开通道
socketChannel = SocketChannel.open();
// 绑定到本地端口
socketChannel.socket().setSoTimeout(30000);
socketChannel.configureBlocking(false);
socketChannel.socket().bind(localAddress);
if (socketChannel.connect(remoteAddress)) {
System.out.println("开始建立连接:"+ remoteAddress);
socketChannel.register(selector, SelectionKey.OP_CONNECT
| SelectionKey.OP_READ | SelectionKey.OP_WRITE, this);
System.out.println("端口打开成功");
} catch (final IOException e1) {
e1.printStackTrace();
public void send(byte[] out) {
if (out == null || out.length & 1) {
synchronized (sendBuf) {
sendBuf.clear();
sendBuf.put(out);
sendBuf.flip();
// 发送出去
} catch (final IOException e) {
e.printStackTrace();
public void write() throws IOException {
if (isConnected()) {
socketChannel.write(sendBuf);
} catch (final IOException e) {
System.out.println("通道为空或者没有连接上");
public byte[] recieve() {
if (isConnected()) {
int len = 0;
int readBytes = 0;
synchronized (receiveBuf) {
receiveBuf.clear();
while ((len = socketChannel.read(receiveBuf)) & 0) {
readBytes +=
} finally {
receiveBuf.flip();
if (readBytes & 0) {
final byte[] tmp = new byte[readBytes];
receiveBuf.get(tmp);
System.out.println("接收到数据为空,重新启动连接");
} catch (final IOException e) {
System.out.println("接收消息错误:");
System.out.println("端口没有连接");
public boolean isConnected() {
return socketChannel != null && socketChannel.isConnected();
private void select() {
int n = 0;
if (selector == null) {
n = selector.select(1000);
} catch (final Exception e) {
e.printStackTrace();
// 如果select返回大于0,处理事件
if (n & 0) {
for (final Iterator&SelectionKey& i = selector.selectedKeys()
.iterator(); i.hasNext();) {
// 得到下一个Key
final SelectionKey sk = i.next();
i.remove();
// 检查其是否还有效
if (!sk.isValid()) {
// 处理事件
final IEvent handler = (IEvent) sk.attachment();
if (sk.isConnectable()) {
handler.connect(sk);
} else if (sk.isReadable()) {
handler.read(sk);
// System.err.println("Ooops");
} catch (final Exception e) {
handler.error(e);
sk.cancel();
public void shutdown() {
if (isConnected()) {
socketChannel.close();
System.out.println("端口关闭成功");
} catch (final IOException e) {
System.out.println("端口关闭错误:");
} finally {
socketChannel =
System.out.println("通道为空或者没有连接");
public void run() {
// 启动主循环流程
while (!shutdown.get()) {
if (isConnected()&&(!isSended)) {
switch (sysStatus) {
case init:
doOption();
case options:
doDescribe();
case describe:
doSetup();
case setup:
if(sessionid==null&&sessionid.length()&0){
System.out.println("setup还没有正常返回");
case play:
doPause();
case pause:
doTeardown();
// do select
Thread.sleep(1000);
} catch (final Exception e) {
} catch (final Exception e) {
e.printStackTrace();
shutdown();
public void connect(SelectionKey key) throws IOException {
if (isConnected()) {
// 完成SocketChannel的连接
socketChannel.finishConnect();
while (!socketChannel.isConnected()) {
Thread.sleep(300);
} catch (final InterruptedException e) {
e.printStackTrace();
socketChannel.finishConnect();
public void error(Exception e) {
e.printStackTrace();
public void read(SelectionKey key) throws IOException {
// 接收消息
final byte[] msg = recieve();
if (msg != null) {
handle(msg);
key.cancel();
private void handle(byte[] msg) {
String tmp = new String(msg);
System.out.println("返回内容:");
System.out.println(tmp);
if (tmp.startsWith(RTSP_OK)) {
switch (sysStatus) {
case init:
sysStatus = Status.
case options:
sysStatus = Status.
trackInfo=tmp.substring(tmp.indexOf("trackID"));
case describe:
sessionid = tmp.substring(tmp.indexOf("Session:") + 9, tmp
.indexOf("Date:"));
if(sessionid!=null&&sessionid.length()&0){
sysStatus = Status.
case setup:
sysStatus = Status.
case play:
sysStatus = Status.
case pause:
sysStatus = Status.
shutdown.set(true);
case teardown:
sysStatus = Status.
System.out.println("返回错误:"+ tmp);
private void doTeardown() {
StringBuilder sb = new StringBuilder();
sb.append("TEARDOWN");
sb.append(this.address);
sb.append("/");
sb.append(VERSION);
sb.append("Cseq:");
sb.append(seq++);
sb.append("
sb.append("User-Agent: RealMedia Player HelixDNAClient/10.0.0.11279 (win32)
sb.append("Session:");
sb.append(sessionid);
sb.append("
send(sb.toString().getBytes());
System.out.println(sb.toString());
private void doPlay() {
StringBuilder sb = new StringBuilder();
sb.append("PLAY");
sb.append(this.address);
sb.append(VERSION);
sb.append("Session:");
sb.append(sessionid);
sb.append("Cseq:");
sb.append(seq++);
sb.append("
sb.append("
System.out.println(sb.toString());
send(sb.toString().getBytes());
private void doSetup() {
StringBuilder sb = new StringBuilder();
sb.append("SETUP");
sb.append(this.address);
sb.append("/");
sb.append(trackInfo);
sb.append(VERSION);
sb.append("Cseq:");
sb.append(seq++);
sb.append("
sb.append("Transport: RTP/AVP;UNICAST;client_port=;mode=play
sb.append("
System.out.println(sb.toString());
send(sb.toString().getBytes());
private void doOption() {
StringBuilder sb = new StringBuilder();
sb.append("OPTIONS");
sb.append(this.address.substring(0, address.lastIndexOf("/")));
sb.append(VERSION);
sb.append("Cseq:");
sb.append(seq++);
sb.append("
sb.append("
System.out.println(sb.toString());
send(sb.toString().getBytes());
private void doDescribe() {
StringBuilder sb = new StringBuilder();
sb.append("DESCRIBE");
sb.append(this.address);
sb.append(VERSION);
sb.append("Cseq:");
sb.append(seq++);
sb.append("
sb.append("
System.out.println(sb.toString());
send(sb.toString().getBytes());
private void doPause() {
StringBuilder sb = new StringBuilder();
sb.append("PAUSE");
sb.append(this.address);
sb.append("/");
sb.append(VERSION);
sb.append("Cseq:");
sb.append(seq++);
sb.append("
sb.append("Session:");
sb.append(sessionid);
sb.append("
send(sb.toString().getBytes());
System.out.println(sb.toString());
public static void main(String[] args) {
// RTSPClient(InetSocketAddress remoteAddress,
// InetSocketAddress localAddress, String address)
RTSPClient client = new RTSPClient(
new InetSocketAddress("218.207.101.236", 554),
new InetSocketAddress("192.168.2.28", 0),
"rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp");
client.start();
} catch (Exception e) {
e.printStackTrace();
其中:rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp为我在网上找到的一个rtsp的sdp地址,读者可自行更换,RTSP的默认端口为554.
运行RTSPClient.java,运行结果如下所示:
端口打开成功
OPTIONS rtsp://218.207.101.236:554/mobile/3/67A451E RTSP/1.0
返回内容:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD
DESCRIBE rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp RTSP/1.0
返回内容:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Content-length: 421
Date: Mon, 03 Aug :36 GMT
Expires: Mon, 03 Aug :36 GMT
Content-Type: application/sdp
x-Accept-Retransmit: our-retransmit
x-Accept-Dynamic-Rate: 1
Content-Base: rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/
o=MediaBox 813 IN IP4 0.0.0.0
s=RTSP Session
i=Starv Box Live Cast
c=IN IP4 218.207.101.236
a=range:npt=now-
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 MP4V-ES/1000
a=fmtp:96 profile-level-id=8; config=fa282c2090a31f; decode_buf=12586
a=range:npt=now-
a=framerate:5
a=framesize:96 176-144
a=cliprect:0,0,144,176
a=control:trackID=1
SETUP rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/trackID=1
Transport: RTP/AVP;UNICAST;client_port=;mode=play
返回内容:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 69
Date: Mon, 03 Aug :36 GMT
Expires: Mon, 03 Aug :36 GMT
Transport: RTP/AVP;UNICAST;mode=client_port=;server_port=
PLAY rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp RTSP/1.0
Session: 69
返回内容:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 69
RTP-Info: url=rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/trackID=1;seq=0;rtptime=0
PAUSE rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/ RTSP/1.0
Session: 69
返回内容:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 69
TEARDOWN rtsp://218.207.101.236:554/mobile/3/67A451EjH5QPU5GWS07Ugn.sdp/ RTSP/1.0
User-Agent: RealMedia Player HelixDNAClient/10.0.0.11279 (win32)
Session: 69
返回内容:
RTSP/1.0 200 OK
Server: PVSS/1.4.8 (Build/; Platform/Win32; Release/StarV )
Session: 69
Connection: Close
端口关闭成功
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信

我要回帖

更多关于 outlook收到邮件乱码 的文章

 

随机推荐