zoukankan      html  css  js  c++  java
  • 一个基于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> CSeq:<BLANK><COMMAND SEQUENCE>

    (Note:<BLANK>:空格;<COMMAND SEQUENCE>:命令序列,每一次发送命令该数字加1)

    命令示例:

    DESCRIBE rtsp://127.0.0.1/ansersion RTSP/1.0
    CSeq: 1

    (Note:虽然看不见,但示例中最后是有空行的,必不可少哦!看看“命令格式”最后连着两个" "你就明白了。空行( )是RTSP数据包的结束标识。)

    服务端返回信息格式:

    RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE> CSeq:<BLANK><COMMAND SEQUENCE> <OTHER> <SDP>

    (Note:<OTHER>: 其他描述信息;<SDP>: SDP描述信息,SDP不属于RTSP的打包数据,这里可以看到空行( )在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> Transport:<BLANK><PROTOCOL>;<CAST METHOD>;client_port=<RTP PORT>-<RTCP PORT> CSeq:<BLANK><COMMAND SEQUENCE>

    (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> CSeq:<BLANK><COMMAND SEQUENCE> <OTHER> <SESSION ID>

    (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> CSeq:<BLANK><COMMAND SEQUENCE>Session:<BLANK><SESSION ID>

    命令示例:

    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> CSeq:<BLANK><COMMAND SEQUENCE> <OTHER>

    服务端返回信息示例:

    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> CSeq:<BLANK><COMMAND SEQUENCE>Session:<BLANK><SESSION ID>

    命令示例:

    TEARDOWN rtsp://127.0.0.1/ansersion RTSP/1.0
    CSeq: 4
    Session: ABF519D9

    服务端返回信息格式:

    RTSP/<RTSP VERSION><BLANK><STATE ID><BLANK><STATE DESCRIBE> CSeq:<BLANK><COMMAND SEQUENCE> <OTHER>

    服务端返回信息示例:

    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

    上一篇     回目录    下一篇

  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/ansersion/p/5081168.html
Copyright © 2011-2022 走看看