('关于RTSP.RTSP协议是一个非常类似HTTP协议的流控制协议。它们都使用纯文本来发送信息,而且rtsp协议的语法也和HTTP类似。Rtsp一开始这样设计,也是为了能够兼容使用以前写的HTTP协议分析代码。这是个好消息。它们主要的区别是HTTP协议是没有状态的,http协议在发送一个命令后,连接会断开,而且命令之间没有依赖性。不同的是RTSP的命令需要知道现在正处于一个什么状态,也就是说rtsp的命令总是按照顺序来发送,某个命令总在另外一个命令之前要发送。Rtsp不管处于什么状态都不会去断掉连接。HTTP协议默认使用80端口,而RTSP默认使用554端口。如果一些服务器因为某些安全的原因而封掉了这个端口,那代理和防火墙可能不让RTSP消息通过,需要管理员去放开554端口,而使得rtsp协议能通过。RTSP并非只是微软在用!这是一个公开的规范,在这个规范上开发了很多的流服务器。甚至Linux服务提供者和苹果的程序员也使用rtsp协议以及RealNetworks流媒体。似乎整个世界的网络流传输都用这个协议。然而,微软并不只在rtsp上有所作为。微软和RTSP.在写这个文档的时候,微软正处于从首选MMS协议转换到首选采用RTSP协议的过程中。这个说明在MediaPlayer9.0版本和流媒体服务器2003版本之后,我们会看到微软将rtsp协议作为流媒体传输的主要协议。随着时间慢慢的流逝,我们会发现mms协议正逐步走出人们的视野。ItisonlyassumedthatthisissoMScansaytheyarebeingopenwiththeirprotocols(rtspisanopenstandard)whileatthesametimedisregardingtheneedtopublicisetheirownMMSprotocolonceitsgonefrommediaplayer.然而,mms还没有真的死亡,至少在接下来的几年中我们依然可以看到它在流媒体传输中的身影。是否微软的RTSP协议和标准的开放式RTSP不同?是的。跟在RFC2326(1998年四月)中定义的原始RTSP协议相比,微软的rtsp协议有一些轻微的改动。我们网站上有本文档(还有后续版本)和一个简单的研究,它们可以帮助你了解这些信息。区别在哪儿?微软的rstp规范与标准rtsp协议相比最主要的改动是发送包payloads到客户端的方式,另外还有一些请求命令有一些改动。传输单个媒体包的机制并没有文档(就我目前所知),这可能是微软要保留的信息。就像MMS和HTTP1.0流协议使用一个媒体数据包头一样,RTSP也有。但是微软的数据包头格式没有在任何的rtsp文档中注明。在企图连接微软的rtsp服务器时,这是主要的问题。微软RTSP协议的命令采用的语法和标准rtsp协议的命令语法一样,只有一些小的修改和添加,可以通过阅读网上的一些文档,就可以知道怎么去组成这些命令。微软rtsp命令部分已经有文档了。一次典型的RTSP协议传输过程这个例子为了简略,没有把发送接收的包放上来ToServer=>NETWORK<=ToClient客户端连服务器的554端口客户端发送“DESCRIBE”命令服务器返回标准rtsp头这个rtsp头和数据实体包含ASF文件头信息以及所有的和媒体文件相关的流bitratedata客户端发送“SETUP”音频流媒体建立命令(stream1)服务器返回标准rtsp头客户端发送“SETUP”视频流媒体建立命令(stream2)服务器返回标准rtsp头客户端发送“PLAY”命令服务器返回标准rtsp头客户端发送“SET_PARAMETER”命令这个命令还包含了一些客户端发送给服务器的信息,比如客户端的操作系统,CPU类型,播放器版本,日期时间等信息。消息格式是taggedXML.服务器返回标准rtsp头####服务器即将开始一个流,发送媒体数据包(包含媒体数据包头),请看接下来的####当要断开这个流的时候,服务器会向客户端发送一个EOF指示服务器断开socket连接一个典型的发给服务器的RTSP命令DESCRIBErtsp://wm.microsoft.com/ms/video/0001-hi.wmvRTSP/1.0User-Agent:WMPlayer/9.0.0.2980guid/3300AD50-2C39-46C0-AE0A-81D88F547805Accept:application/sdpAccept-Charset:UTF-8,;q=0.1X-Accept-Authentication:NTLM,Digest,BasicAccept-Language:en-GB,;q=0.1CSeq:1Supported:com.microsoft.wm.srvppair,com.microsoft.wm.sswitch,com.microsoft.wm.eosmsg,com.microsoft.wm.predstrm注意:DESCRIBErtsp://wm.microsoft.com/ms/video/0001-hi.wmvRTSP/1.0这是要连接的url(服务器域名和流路径),后面跟着RTSP的版本。User-Agent:WMPlayer/9.0.0.2980guid/3300AD50-2C39-46C0-AE0A-81D88F547805这条表示了客户端使用的是什么播放器,以及播放器的版本,再跟着一个独特的GUID。X-Accept-Authentication:NTLM,Digest,Basic客户端可以接受的authentication类型注意CSeq要从1开始。服务器针对请求命令的应答也应该有Cseq:加上数字,这样可以知道是针对哪条请求发的应答。在客户端发送一个请求命令,得到成功的应答后,再发送下一条命令,CSeq的值要加1。一个典型的RTSP应答消息,它们跟HTTP的消息非常的相似一个针对客户端发的DESCRIBE命令,服务器的应答例子如下所示:<<>>RTSP/1.0200OKContent-Type:application/sdpVary:AcceptX-Playlist-Gen-Id:27006X-Broadcast-Id:0Content-Length:3324Date:Tue,18Nov200315:57:05GMTCSeq:1Server:WMServer/9.0.0.3372Supported:com.microsoft.wm.srvppair,com.microsoft.wm.sswitch,com.microsoft.wm.eosmsg,com.microsoft.wm.fastcache,com.microsoft.wm.packetpairssrcLast-Modified:Tue,18Jun200221:05:39GMTCache-Control:x-wms-content-size=23180160,max-age=86399,must-revalidate,proxy-revalidateEtag:"23180160"<<>>(两个“\\r\\n”指示本SDP数据的开始).<<<这是SessionDescriptionProtocol协议>>>v=0o=-200311171721060249200311171721060249INIP4127.0.0.1s=c=INIP40.0.0.0b=AS:1091a=maxps:13632t=00a=control:rtsp://wm.microsoft.com/ms/video/0001-hi.wmv/a=etag:{9D7121C3-1A1B-8ED6-6675-CB15D19D1FB7}a=range:npt=3.100-173.903a=recvonlya=pgmpu:data:application/x-wms-contentdesc,8,language,31,0,,5,title,31,0,,6,author,31,0,,9,copyright,31,0,,35,WMS_CONTENT_DESCRIPTION_DESCRIPTION,31,0,,30,WMS_CONTENT_DESCRIPTION_RATING,31,0,,44,WMS_CONTENT_DESCRIPTION_SERVER_BRANDING_INFO,31,12,WMServer/9.0,51,WMS_CONTENT_DESCRIPTION_PLAYLIST_ENTRY_START_OFFSET,3,4,3100,47,WMS_CONTENT_DESCRIPTION_PLAYLIST_ENTRY_DURATION,3,6,170803,58,WMS_CONTENT_DESCRIPTION_COPIED_METADATA_FROM_PLAYLIST_FILE,3,1,1,42,WMS_CONTENT_DESCRIPTION_PLAYLIST_ENTRY_URL,31,17,0001-hi.wmv%0D%0Aa=pgmpu:data:application/vnd.ms.wms-hdr.asfv1;base64,Mcay...dY5mm2QCAQ==m=audio0RTP/AVP96b=AS:35b=RS:0b=RR:0a=rtpmap:96x-asf-pf/1000a=control:audioa=stream:1m=application0RTP/AVP96b=RS:0b=RR:0a=rtpmap:96x-wms-rtx/1000a=control:rtxa=stream:65536m=video0RTP/AVP96b=AS:471b=RS:0b=RR:0a=rtpmap:96x-asf-pf/1000a=control:stream=2a=stream:2以\\r\\n\\r\\n结束看下面这行:a=pgmpu:data:application/vnd.ms.wms-hdr.asfv1;base64,Mcay..…==这是真实的ASF文件头数据(被Base64编码过)。在将这部分头数据写到文件之前需要Base64解码成标准的ascii码。SDP实体数据也告诉我们在媒体数据中都有些什么流这个文件有2个媒体流:ID=1有一个“audio”标志的音频流ID=2有一个“stream=2”标志的视频流还有第三个以“rtx”标志的流,这是一个控制流,并不携带任何的媒体内容。这个控制流使用streamID=65536.看下面这行:a=pgmpu:data:application/x-wms-contentdesc,…..这表示了紧跟的数据是一个内容描述对象。标准RTSP消息的错误代码–在应答消息的第一行表示”100”;Continue(all100range)“200”;OK”201”;Created”250”;LowonStorageSpace”300”;MultipleChoices”301”;MovedPermanently”302”;MovedTemporarily”303”;SeeOther”304”;NotModified”305”;UseProxy”350”;GoingAway”351”;LoadBalancing”400”;BadRequest”401”;Unauthorized”402”;PaymentRequired”403”;Forbidden”404”;NotFound”405”;MethodNotAllowed”406”;NotAcceptable”407”;ProxyAuthenticationRequired”408”;RequestTime-out”410”;Gone”411”;LengthRequired”412”;PreconditionFailed”413”;RequestEntityTooLarge”414”;Request-URITooLarge”415”;UnsupportedMediaType”451”;ParameterNotUnderstood”452”;reserved”453”;NotEnoughBandwidth”454”;SessionNotFound”455”;MethodNotValidinThisState”456”;HeaderFieldNotValidforResource”457”;InvalidRange”458”;ParameterIsRead-Only”459”;Aggregateoperationnotallowed”460”;Onlyaggregateoperationallowed”461”;Unsupportedtransport”462”;Destinationunreachable”500”;InternalServerError”501”;NotImplemented”502”;BadGateway”503”;ServiceUnavailable”504”;GatewayTime-out”505”;RTSPVersionnotsupported”551”;OptionnotsupportedRTSP数据包头(每一个媒体数据包的开头)二进制包头数据后面紧跟着媒体数据包(asf/wmv等等)。ValuesareinBigEndianorder.(notlittleendianasinmmsandhttpprotocols).--------这些数据位在公开的RTSP文档中也指示了-------BYTE“$”or0x24BYTEChannelid,一般=0x00,你可以看到“P”或者0x50forpacketpairsdata,看下面的描述.WORD数据包的长度(从接下来的区域算起)--------接下来的数据位表示的含义还没有确定,微软也许会指出-----------WORD???填充0x80E0WORD序列号。这个值被初始化成一个随即的值,然后在每一个数据包发送时加1。在这个值达到0xffff时,它将设置成0。跟其他协议相比,这个值得范围比较小(16位),使得它不能在写媒体数据到文件中时做为有指导性的序列号使用。大的流媒体文件有很多的数据包,包的数量超过了他的范围,所以可能会发生相同序列号的包。只使用这个序列号来作错误检验——缺少了某一个序列号的包意味着发生了丢包错误。DWORD发送时间。Thisisstatedinmillisecondsandshowsthetimethatthismediapacketshouldbepresented.预先录制的文件设置T=0,实况流设置一个不同于0的值。DWORD???固定的一个值.它是一个随即值,但是一旦一个rtsp会话建立,这个值就一直保持不变,所有的数据包都是这个值。可以使用这个值作为每次会话的一个ID,新的rtsp会话会有新的值。BYTE标志位,看下面:Bit0(lsb)?=0Bit1?=0Bit2?=0Bit3?=0Bit4Durationfieldpresentinpreheaderifset(seebelow)Bit5?=0Bit6?=1(总是1)Bit7(msb)被设置成1,表示数据包含有一个关键桢BYTE???总是设置成0WORD包长度。此16位表示从上面标志位域开始的包长度。DWORD[可选的]持续时间。只有上面的标志位的Bit4被设置了才会有这个域,否则就没有这个域表示为多少毫秒,指出了传输的媒体包的总持续时间。<<<下面跟着媒体数据,like820000…..>>>在RTSP请求和应答中使用的有用的标签值:CSeq:命令的序列号,逐1增加。所有的请求和应答都用得到。Content-Length:这个标记的存在说明后面有实体数据,而且给出了这个数据块的大小,单位是byteX-Playlist-Gen-Id:用来检查播放列表是否有效。这个标记最初在客户端发送DESCRIBE命令后使用。客户端在发送“SETUP”命令给服务器时必须回应一样的值X-Playlist-Seek-Id:值必须和X-Playlist-Gen-Id域的值相同,在PLAY请求命令中使用.Blocksize:媒体包的总长度,单位是byteSession:SessionID是用作客户端和服务器之间是否是正确的连接。在客户端发送SETUP命令,服务器会在应答消息头里面发送这个值给客户端。WeonlyseetheSessionvalueonthefirststreamselected(usuallythisistheaudiostream)。Session值相当的长,一共有20个阿拉伯数字。紧跟着Session值,你可以看到一个值:“timeout=xxxx”。.这是服务器需要得到回应或者ACK回应(为了保持连接)的时间。客户端必须在这个时段内发送一个ACK,要不然连接就要被强制中断。一个ACK就是发送一条GET_PARAMETER命令到服务器。X-Accept-Authentication:允许的authentication方法NTLM,Digest和Basic是标准的X-Broadcast-Id:是否是实况或者是先期录制的流。0表示先期录制,其他的值表示是实况。Range:Rangeistheoffsetandendtimepositionstostreamthemedia.Forazerostartandfullfilestream,thisvalueissetto:npt=0.000-where0.000istheoffsetand–0.000(optional)istheendingtime.Valuesarestatedinseconds.Speed:用来调整传输到客户端的流得速度。假如你的带宽可以接受更高速的数据传送,这个域的值可以设置大于1来加速下载数据普通情况Speed:1.0i.e.x1rateMediaplayer使用:Speed:1.294这个主要取决于你的网络连接速度。Server:服务器类型和软件版本EOF:文件结束标记,也是流的结束标记Date:日期时间,下面举个例子:Tue,18Nov200315:57:07GMTBandwidth:流需要的最大带宽,bits/秒Transport:使用什么协议来传输数据,比如TCP或者UDP等Etag:实体标记Entitytag,是一个分配给会话的值,就像"23180160"Supported:支持的COMmodules,有的是可选的.com.microsoft.wm.srvppair-packetpairsatservercom.microsoft.wm.sswitch-streamIDselectioncom.microsoft.wm.eosmsg-endofstreammessagecom.microsoft.wm.fastcache-fastcacheforbufferingcom.microsoft.wm.packetpairssrc.-packetpairsContent-Type:此域用来表示命令或者应答的用意下面是常用的几种类型:application/x-wms-Logconnectstats这个在SET_PARAMETER命令中用到,表示将客户端的信息登记到服务器上。application/sdp这个表示接下来数据包里面的是sdp数据,它是在服务器对DESCRIBE命令的应答包中。application/x-wms-contentdesc表示紧跟的数据是一个内容描述对象,它设置thelayoutofthedialog.application/vnd.ms.wms-hdr.asfv1表示跟着一个流媒体头信息(ASFheader),可以用BASIC或者DIGEST来解码。application/x-rtsp-packetpairPacketPairdataisrandomnon-compressibledataandissenttotheclientandtimedforresponsetimes.它被用来确定连接的可用带宽。Packetpairdata是可选的,你不必经常去请求这个数据。这个是在发送GET_PARAMATER命令到服务器时,用到的。.本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/CodeJoker/archive/2009/10/16/4679740.aspx',)