📄 dotjox的专栏1.htm
字号:
source.如果在请求中没有指定范围,当前位置将在答复中返回。答复中播放范围的单位与请求中相同。在播放完被要求的范围后,表示将自动暂停,就好像发出了一个PAUSE请求。</P>
<P>
下面的示例在play整个表示时从SMPTE时间0:10:20直到剪辑(clip)结束。播放开始于1997年1月23号,15点36分<BR>C->S:
PLAY rtsp://audio.example.com/twister.en RTSP/1.0<BR>CSeq: 833<BR>Session:
12345678<BR>Range: smpte=0:10:20-;time=19970123T153600Z</P>
<P>S->C: RTSP/1.0 200 OK<BR>CSeq: 833<BR>Date: 23 Jan 1997 15:35:06
GMT<BR>Range: smpte=0:10:22-;time=19970123T153600Z<BR>For playing back a
recording of a live presentation, it may be desirable to use clock units:</P>
<P>C->S: PLAY rtsp://audio.example.com/meeting.en RTSP/1.0<BR>CSeq:
835<BR>Session: 12345678<BR>Range: clock=19961108T142300Z-19961108T143520Z</P>
<P>S->C: RTSP/1.0 200 OK<BR>CSeq: 835<BR>Date: 23 Jan 1997 15:35:06
GMT<BR>只有播放的媒体服务器必须支持npt时间格式,可能支持clock和smpte格式。</P>
<P>10.6 PAUSE<BR>
PAUSE请求引起媒体流传输的暂时中断。如果请求URL中指定了具体的媒体流,那么只有该媒体流的播放和记录被暂停(halt)。比如,指定暂停音频,播放将会无声。如果请求URL指定了一个表示或者媒体流已成组,那么在该表示或组中的所有当前活动流的传输将被暂停。在重启播放或记录后,必须维护不同媒体轨迹(track)的同步。尽管服务器可能在暂停后,在timeout的时间内关闭会话,释放资源,但是任何资源都必须保存,其中timeout参数位于SETUP消息的会话头中。</P>
<P>示例:<BR>C->S: PAUSE rtsp://example.com/fizzle/foo RTSP/1.0<BR>CSeq:
834<BR>Session: 12345678</P>
<P>S->C: RTSP/1.0 200 OK<BR>CSeq: 834<BR>Date: 23 Jan 1997 15:35:06 GMT</P>
<P> PAUSE请求中可能包含一个Range首部域用来指定何时媒体流或表示暂停,我们称这个时刻为暂停点(pause
point)。该首部域必须包含一个精确的值,而不是一个时间范围。媒体流的正常播放时间设置成暂停点。当服务器遇到在任何当前挂起(pending)的PLAY请求中指定的时间点后,暂停请求生效。如果Range首部域指定了一个时间超出了任何一个当前挂起的PLAY请求,将返回错误"457
Invalid Range"
。如果一个媒体单元(比如一个音频或视频禎)正好在一个暂停点开始,那么表示将不会被播放或记录。如果Range首部域缺失,那么在收到暂停消息后媒体流传输立即中断,并且暂停点设置成当前正常播放时间。</P>
<P>
利用PAUSE请求可忽视所有排队的PLAY请求,但必须维护媒体流中的暂停点。不带Range首部域的后继PLAY请求从暂停点重启播放。</P>
<P>
比如,如果服务器有两个挂起的播放请求,播放范围(range)分别是10到15和20到29,这时收到一个暂停请求,暂停点是NPT21,那么它将会开始播放第二个范围,并且在NPT21处停止。如果服务器正在服务第一个请求播放到NPT13位置,收到暂停请求,暂停点NPT12,那么它将立即停止。如果请求在NPT16暂停,那么服务器在完成第一个播放请求后停止,放弃了第二个播放请求。</P>
<P>
再如,服务器收到播放请求,播放范围从10到15和13到20(即之间有重叠),PAUSE暂停点是NPT14,则当服务器播放第一段范围时,PAUSE请求将生效,而第二个PLAY请求会被忽略重叠部分,就好像服务器在开始播放第二段前收到PAUSE请求。不管PAUSE请求何时到达,它总是设置NPT到14。//?</P>
<P>
如果服务器已经在Range首部域指定的时间外发送了数据,后继的PLAY仍会在暂停点及时重启,因为它认为客户端会丢弃在暂停点后收到的数据。这就确保了连续、无隙的暂停/播放循环。</P>
<P>10.7 TEARDOWN<BR>
TEARDOWN请求终止了给定URI的媒体流传输,并释放了与该媒体流相关的资源。如果该URI是对此表示的表示URI,那么任何与此会话相关的任何RTSP会话标志符将不再有效。除非所有传输参数由会话描述符定义,否则SETUP请求必须在会话能被再次播放之前发出。</P>
<P>示例:<BR>C->S: TEARDOWN rtsp://example.com/fizzle/foo RTSP/1.0<BR>CSeq:
892<BR>Session: 12345678<BR></P>
<P>S->C: RTSP/1.0 200 OK<BR>CSeq: 892</P>
<P>10.8 GET PARAMETER<BR> GET
PARAMETER请求检索URI指定的表示或媒体流的参数值。答复和响应的内容留给了实现。不带实体主体的GET
PARAMETER可用来测试客户端或服务器是否存活("Ping")。</P>
<P>示例:<BR>S->C: GET_PARAMETER rtsp://example.com/fizzle/foo RTSP/1.0<BR>CSeq:
431<BR>Content-Type: text/parameters<BR>Session: 12345678<BR>Content-Length:
15<BR>packets_received<BR>jitter</P>
<P>C->S: RTSP/1.0 200 OK<BR>CSeq: 431<BR>Content-Length: 46<BR>Content-Type:
text/parameters<BR>packets_received: 10<BR>jitter: 0.3838</P>
<P>"text/parameters"段只是参数类型的一个例子。对此方法有意的进行了松散的定义,对于答复和响应的内容将在更深一层的实验中给出定义。</P>
<P>10.9 SET PARAMETER<BR>
此方法给URI指定的表示或媒体流设置参数值。<BR>
帮助客户端检查某个特殊的请求为何失败的请求(晕~)应该只附带一个参数。当请求附带多个参数时,服务器只有在这些参数全都设置正确时才作出响应。服务器必须允许某个参数被重复设置成相同的值,但可能不允许改变参数值。<BR>注意:必须只能使用SETUP命令来给媒体流设置传输参数。<BR>
限制只有SETUP能设置传输参数有利于防火墙设计。<BR>示例:<BR>C->S: SET_PARAMETER
rtsp://example.com/fizzle/foo RTSP/1.0<BR>CSeq: 421<BR>Content-length:
20<BR>Content-type: text/parameters<BR>barparam: barstuff</P>
<P>S->C: RTSP/1.0 451 Invalid Parameter<BR>CSeq: 421<BR>Content-length:
10<BR>Content-type: text/parameters<BR>barparam</P>
<P>"text/parameters"段只是参数类型的一个例子。对此方法有意的进行了松散的定义,对于答复和响应的内容将在更深一层的实验中给出定义。</P>
<P>10.10 REDIRECT<BR>
REDIRECT请求告知客户端连接到另一个服务器位置。它包含首部域Location,该域指出了客户端应该发出请求的URL。它可能包含参数Range,在重定向生效时,该域指明了媒体流的范围。如果客户端希望继续发送或接收其URI指定的媒体,它必须发出一个TEARDOWN请求来关闭当前会话,并向委派的主机发送SETUP以建立新的会话。</P>
<P>本例中,在给定的播放时间将URI请求重定向到新的服务器:<BR>S->C: REDIRECT
rtsp://example.com/fizzle/foo RTSP/1.0<BR>CSeq: 732<BR>Location:
rtsp://bigserver.com:8001<BR>Range: clock=19960213T143205Z-</P>
<P>10.11 RECORD<BR>
此方法根据表示描述开始记录媒体数据。时间戳(timestamp)表现了起始和结束时间(UTC)。如果没有给定时间范围,就使用表示描述中提供的开始和结束时间。如果会话已经开启,立即开始记录。由服务器来决定是否存储记录的数据到请求URI下或者其它URI下。如果服务器没有使用请求URI,那么响应代码应该是201(创建),并且包含一个实体,该实体描述了请求的状态,并通过Location首部域指向新资源。</P>
<P> 允许记录现场表示(live presentations)的媒体服务器必须支持时钟范围格式(the clock
range format),smpte格式对此无用。</P>
<P> 在本示例中,媒体服务器被邀请到指定的会议<BR>C->S: RECORD
rtsp://example.com/meeting/audio.en RTSP/1.0<BR>CSeq: 954<BR>Session:
12345678<BR>Conference: 128.16.64.19/32492374</P>
<P>10.12 Embedded (Interleaved) Binary Data<BR>
可能某些防火墙设计和环境会强制服务器交叉RTSP方法和媒体流数据。这种交叉增加了客户端和服务器操作的复杂性,带来了额外的开销,因此通常情况下应该避免;除非必须交叉。只有RTSP在TCP上运载时,交叉的二进制数据才能使用。</P>
<P> 媒体流数据,如RTP包,被封装成下列形式:ASCII的美元符(十进制数24),一个字节的通道标志符(channel
identifier),被封装的二进制数据的长度,以网络字节顺序编码的2字节整数。紧接着的是上层的协议头。每个$块都正确地包含了一个上层协议数据单元,比如一个RTP包。</P>
<P> 通道标志符使用交叉参数定义在传输头。<BR>
当使用实时传输协议传输时,RTP和RTCP消息也会在TCP连接上相互交叉。默认情况下,RTCP包会在第一个可用的通道上发送,高于RTP通道。而客户端可能在另一个通道显式地请求RTCP包。在传输头的交叉参数中指定两个通道可解决此问题。</P>
<P>C->S: SETUP rtsp://foo.com/bar.file RTSP/1.0<BR>CSeq: 2<BR>Transport:
RTP/AVP/TCP;interleaved=0-1</P>
<P>S->C: RTSP/1.0 200 OK<BR>CSeq: 2<BR>Date: 05 Jun 1997 18:57:18
GMT<BR>Transport: RTP/AVP/TCP;interleaved=0-1<BR>Session: 12345678</P>
<P>C->S: PLAY rtsp://foo.com/bar.file RTSP/1.0<BR>CSeq: 3<BR>Session:
12345678</P>
<P>S->C: RTSP/1.0 200 OK<BR>CSeq: 3<BR>Session: 12345678<BR>Date: 05 Jun 1997
18:59:15 GMT<BR>RTP-Info:
url=rtsp://foo.com/bar.file;<BR>seq=232433;rtptime=972948234<BR>S->C: $\000{2
byte length}{"length" bytes data, w/RTP header}<BR>S->C: $\000{2 byte
length}{"length" bytes data, w/RTP header}<BR>S->C: $\001{2 byte
length}{"length" bytes RTCP packet}</P><BR><BR>
<P id=TBPingURL>Trackback:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=714773</P></DIV>
<DIV class=postFoot>
<SCRIPT src=""></SCRIPT>
[<A href="javascript:StorePage()">点击此处收藏本文</A>] DotJox发表于
2006年05月09日 14:46:00 </DIV></DIV><LINK
href="http://blog.csdn.net/DotJox/Services/Pingback.aspx" rel=pingback><!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://blog.csdn.net/DotJox/archive/2006/05/09/714773.aspx"
dc:identifier="http://blog.csdn.net/DotJox/archive/2006/05/09/714773.aspx"
dc:title="读RFC2326RTSP ch10方法定义"
trackback:ping="http://tb.blog.csdn.net/TrackBack.aspx?PostId=714773" />
</rdf:RDF>
-->
<SCRIPT>function hide(){showComment();}</SCRIPT>
<BR>
<SCRIPT type=text/javascript>document.write("<img src=http://counter.csdn.net/pv.aspx?id=24 border=0 width=0 height=0>");</SCRIPT>
没有评论。
<DIV class=CommentForm id=commentform>
<H3>发表评论</H3>
<TABLE class=CommentForm>
<TBODY>
<TR>
<TD width=69 height=0></TD>
<TD></TD></TR>
<TR>
<TD width=70>大名:</TD>
<TD align=left><INPUT id=PostComment.ascx_tbName style="WIDTH: 300px"
size=40 name=PostComment.ascx$tbName> <SPAN
id=PostComment.ascx_RequiredFieldValidator2
style="DISPLAY: none; COLOR: red"><BR>请输入尊姓大名</SPAN> </TD></TR>
<TR>
<TD width=70>网址:</TD>
<TD align=left><INPUT id=PostComment.ascx_tbUrl style="WIDTH: 300px"
size=40 name=PostComment.ascx$tbUrl> </TD></TR>
<TR>
<TD colSpan=3>评论 <SPAN id=PostComment.ascx_RequiredFieldValidator3
style="DISPLAY: none; COLOR: red"><BR>请输入评论</SPAN> <BR><TEXTAREA id=PostComment.ascx_tbComment style="WIDTH: 381px; HEIGHT: 193px" name=PostComment.ascx$tbComment rows=10 cols=50></TEXTAREA>
</TD></TR>
<TR style="DISPLAY: none">
<TD height=24>验证码</TD>
<TD><INPUT id=PostComment.ascx_ValidationKey style="WIDTH: 150px"
name=PostComment.ascx$ValidationKey> <INPUT id=VCImageSrc type=hidden
value=/VerifyCode.aspx?url=http%3a%2f%2fblog.csdn.net%2fDotJox%2farchive%2f2006%2f05%2f09%2f714773.aspx&datetime=7%2f26%2f2006+6%3a30%3a46+PM&ip=58.100.84.155>
<SPAN id=VCImageSpan></SPAN>
<SCRIPT src="DotJox的专栏1.files/deferShowVerifyImage.js"
type=text/javascript></SCRIPT>
</TD></TR>
<TR>
<TD colSpan=3><INPUT class=Button id=PostComment.ascx_btnSubmit onclick='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("PostComment.ascx$btnSubmit", "", true, "", "", false, false))' type=submit value=提交 name=PostComment.ascx$btnSubmit>
<INPUT id=PostComment.ascx_chkRemember type=checkbox
name=PostComment.ascx$chkRemember><LABEL
for=PostComment.ascx_chkRemember>记住我?</LABEL></TD></TR>
<TR>
<TD colSpan=3><SPAN id=PostComment.ascx_Message
style="COLOR: red"></SPAN></TD></TR></TBODY></TABLE></DIV></DIV>
<P id=footer>Powered by: <BR><A id=Footer1_Hyperlink2
href="http://scottwater.com/blog" name=Hyperlink1><IMG
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
src="DotJox的专栏1.files/100x30_Logo.gif"></A> <A id=Footer1_Hyperlink3
href="http://asp.net/" name=Hyperlink1><IMG
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
src="DotJox的专栏1.files/PoweredByAsp.Net.gif"></A> <BR>Copyright © DotJox </P>
<SCRIPT src="DotJox的专栏1.files/counter.js"></SCRIPT>
<SCRIPT type=text/javascript>
<!--
var Page_Validators = new Array(document.getElementById("PostComment.ascx_RequiredFieldValidator2"), document.getElementById("PostComment.ascx_RequiredFieldValidator3"));
// -->
</SCRIPT>
<SCRIPT type=text/javascript>
<!--
var PostComment.ascx_RequiredFieldValidator2 = document.all ? document.all["PostComment.ascx_RequiredFieldValidator2"] : document.getElementById("PostComment.ascx_RequiredFieldValidator2");
PostComment.ascx_RequiredFieldValidator2.controltovalidate = "PostComment.ascx_tbName";
PostComment.ascx_RequiredFieldValidator2.errormessage = "<br>请输入尊姓大名";
PostComment.ascx_RequiredFieldValidator2.display = "Dynamic";
PostComment.ascx_RequiredFieldValidator2.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
PostComment.ascx_RequiredFieldValidator2.initialvalue = "";
var PostComment.ascx_RequiredFieldValidator3 = document.all ? document.all["PostComment.ascx_RequiredFieldValidator3"] : document.getElementById("PostComment.ascx_RequiredFieldValidator3");
PostComment.ascx_RequiredFieldValidator3.controltovalidate = "PostComment.ascx_tbComment";
PostComment.ascx_RequiredFieldValidator3.errormessage = "<br>请输入评论";
PostComment.ascx_RequiredFieldValidator3.display = "Dynamic";
PostComment.ascx_RequiredFieldValidator3.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
PostComment.ascx_RequiredFieldValidator3.initialvalue = "";
// -->
</SCRIPT>
<DIV><INPUT id=__EVENTVALIDATION type=hidden
value=/wEWBwL+raDpAgKYsei0AwKKr+LbDALQg87YCQKmqJOtCwLQ562RCALZosDQBIZQDn1fOiJPMxWSpm/4VTb19kbE
name=__EVENTVALIDATION> </DIV>
<SCRIPT type=text/javascript>
<!--
var Page_ValidationActive = false;
if (typeof(ValidatorOnLoad) == "function") {
ValidatorOnLoad();
}
function ValidatorOnSubmit() {
if (Page_ValidationActive) {
return ValidatorCommonOnSubmit();
}
else {
return true;
}
}
// -->
</SCRIPT>
</FORM>
<SCRIPT language=javascript type=text/javascript>
<!--
try{
hide();
}
catch(e){
}
//-->
</SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -