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

    上一篇     回目录    下一篇

  • 相关阅读:
    Sencha touch 2 入门 -------- DataView 显示服务器端JSON文件数据
    Sencha touch API
    Android Intent详解
    物流配送中商品订货数量的控制技术
    multiset基础学习,可以有重复类型的多重集合容器
    人生总会遇到浑噩期,但是需要反思
    创建Sencha touch第一个应用
    How I Turned Down $300,000 from Microsoft to go Full-Time on GitHub
    c++ list 合并操作函数实例
    电子设计与制作100例(第3版)
  • 原文地址:https://www.cnblogs.com/ansersion/p/5081168.html
Copyright © 2011-2022 走看看