RTSP(Real-Time Stream Protocol)协议是一个基于文本的多媒体播放控制协议,属于应用层。RTSP以客户端方式工作,对流媒体提供播放、暂停、后退、前进等操作。该标准由IETF指定,对应的协议是RFC2326。

RTSP作为一个应用层协议,提供了一个可供扩展的框架,使得流媒体的受控和点播变得可能,它主要用来控制具有实时特性的数据的发送,但其本身并不用于传送流媒体数据,而必须依赖下层传输协议(如RTP/RTCP)所提供的服务来完成流媒体数据的传送。RTSP负责定义具体的控制信息、操作方法、状态码,以及描述与RTP之间的交互操作。RTSP媒体服务协议框架如下:

RTSP包含Normal RTSP(数据通过RTP传输,应用厂商有苹果和微软等),以及Real-RTSP(数据通过RDT传输)。本篇我们主要讲Normal RTSP。

RTSP传输的一般是TS、MP4格式的流,其传输一般需要2~3个通道,命令和数据通道分离。使用RTSP协议传输流媒体数据需要有专门的媒体播放器和媒体服务器,也就是需要支持RTSP协议的客户端和服务器。

客户端要播放RTSP媒体流,就需要知道媒体源的URL,RTSP的URL格式一般如下:

rtsp://host[:port]/[abs_path]/content_name

host: 有效的域名或IP地址;

port: 端口号,缺省为554,若为缺省可不填写,否则必须写明。

例如,一个完整的RTSP URL可写为:

rtsp://192.168.1.67:554/test

又如目前市面上常用的海康网络摄像头的RTSP地址格式为:

rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream

示例: rtsp://admin:12345@192.168.1.67:554/h264/ch1/main/av_stream

rtsp://admin:12345@192.168.1.67/mpeg4/ch1/sub/av_stream

RTSP报文

 
对RTSP协议的使用有了一个大概的了解之后,我们来看一下RTSP报文结构。

RTSP是一种基于文本的协议,用CRLF(回车换行)作为每一行的结束符,其好处是,在使用过程中可以方便地增加自定义参数,也方便抓包分析。从消息传送方向上来分,RTSP的报文有两类:请求报文和响应报文。请求报文是指从客户端向服务器发送的请求(也有少量从服务器向客户端发送的请求),响应报文是指从服务器到客户端的回应。

RTSP请求报文的常用方法与作用:

一次基本的RTSP交互过程如下,C表示客户端,S表示服务端。

首先客户端连接到流媒体服务器并发送一个RTSP描述请求(DESCRIBE request),服务器通过一个SDP(Session DescriptionProtocol)描述来进行反馈(DESCRIBEresponse),反馈信息包括流数量、媒体类型等信息。客户端分析该SDP描述,并为会话中的每一个流发送一个RTSP连接建立请求(SETUPrequest),该命令会告诉服务器用于接收媒体数据的端口,服务器响应该请求(SETUP response)并建立连接之后,就开始传送媒体流(RTP包)到客户端。在播放过程中客户端还可以向服务器发送请求来控制快进、快退和暂停等。最后,客户端可发送一个终止请求(TEARDOWN request)来结束流媒体会话。

下面我们通过具体的消息实例来进一步了解一下RTSP的工作过程:

  • OPTIONS

OPTIONS请求是客户端向服务器询问可用的方法,请求和回复实例如下:

  1.  
    C->S: OPTIONS rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 1
  3.  
    Require: implicit-play
  4.  
    Proxy-Require: gzipped-messages
  5.  
     
  6.  
    S->C: RTSP/1.0 200 OK
  7.  
    CSeq: 1
  8.  
    Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
  • DESCRIBE

客户端向服务器请求媒体资源描述,服务器端通过SDP(Session Description Protocol)格式回应客户端的请求。资源描述中会列出所请求媒体的媒体流及其相关信息,典型情况下,音频和视频分别作为一个媒体流传输。实例如下:

  1.  
    C->S: DESCRIBE rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 2
  3.  
     
  4.  
    S->C: RTSP/1.0 200 OK
  5.  
    CSeq: 2
  6.  
    Content-Base: rtsp://example.com/media.mp4
  7.  
    Content-Type: application/sdp
  8.  
    Content-Length: 460
  9.  
     
  10.  
    m=video 0 RTP/AVP 96
  11.  
    a=control:streamid=0
  12.  
    a=range:npt=0-7.741000
  13.  
    a=length:npt=7.741000
  14.  
    a=rtpmap:96 MP4V-ES/5544
  15.  
    a=mimetype:string;"video/MP4V-ES"
  16.  
    a=AvgBitRate:integer;304018
  17.  
    a=StreamName:string;"hinted video track"
  18.  
    m=audio 0 RTP/AVP 97
  19.  
    a=control:streamid=1
  20.  
    a=range:npt=0-7.712000
  21.  
    a=length:npt=7.712000
  22.  
    a=rtpmap:97 mpeg4-generic/32000/2
  23.  
    a=mimetype:string;"audio/mpeg4-generic"
  24.  
    a=AvgBitRate:integer;65790
  25.  
    a=StreamName:string;"hinted audio track"
  • SETUP

SETUP请求确定了具体的媒体流如何传输,该请求必须在PLAY请求之前发送。SETUP请求包含媒体流的URL和客户端用于接收RTP数据(audio or video)的端口以及接收RTCP数据(meta information)的端口。服务器端的回复通常包含客户端请求参数的确认,并会补充缺失的部分,比如服务器选择的发送端口。每一个媒体流在发送PLAY请求之前,都要首先通过SETUP请求来进行相应的配置。

  1.  
    C->S: SETUP rtsp://example.com/media.mp4/streamid=0 RTSP/1.0
  2.  
    CSeq: 3
  3.  
    Transport: RTP/AVP;unicast;client_port=8000-8001
  4.  
     
  5.  
    S->C: RTSP/1.0 200 OK
  6.  
    CSeq: 3
  7.  
    Transport: RTP/AVP;unicast;client_port=8000-8001;server_port=9000-9001;ssrc=1234ABCD
  8.  
    Session: 12345678
  • PLAY

客户端通过PLAY请求来播放一个或全部媒体流,PLAY请求可以发送一次或多次,发送一次时,URL为包含所有媒体流的地址,发送多次时,每一次请求携带的URL只包含一个相应的媒体流。PLAY请求中可指定播放的range,若未指定,则从媒体流的开始播放到结束,如果媒体流在播放过程中被暂停,则可在暂停处重新启动流的播放。

  1.  
    C->S: PLAY rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 4
  3.  
    Range: npt=5-20
  4.  
    Session: 12345678
  5.  
     
  6.  
    S->C: RTSP/1.0 200 OK
  7.  
    CSeq: 4
  8.  
    Session: 12345678
  9.  
    RTP-Info: url=rtsp://example.com/media.mp4/streamid=0;seq=9810092;rtptime=3450012
  • PAUSE

PAUSE请求会暂停一个或所有媒体流,后续可通过PLAY请求恢复播放。PAUSE请求中携带所请求媒体流的URL,若参数range存在,则指明在何处暂停,若该参数不存在,则暂停立即生效,且暂停时长不确定。

  1.  
    C->S: PAUSE rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 5
  3.  
    Session: 12345678
  4.  
     
  5.  
    S->C: RTSP/1.0 200 OK
  6.  
    CSeq: 5
  7.  
    Session: 12345678
  • TEARDOWN

结束会话请求,该请求会停止所有媒体流,并释放服务器上的相关会话数据。

  1.  
    C->S: TEARDOWN rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 8
  3.  
    Session: 12345678
  4.  
     
  5.  
    S->C: RTSP/1.0 200 OK
  6.  
    CSeq: 8
  • GET_PARAMETER

检索指定URI数据中的参数值。不携带消息体的GET_PARAMETER可用来测试服务器端或客户端是否可通(类似ping的功能)。

  1.  
    S->C: GET_PARAMETER rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 9
  3.  
    Content-Type: text/parameters
  4.  
    Session: 12345678
  5.  
    Content-Length: 15
  6.  
     
  7.  
    packets_received
  8.  
    jitter
  9.  
     
  10.  
    C->S: RTSP/1.0 200 OK
  11.  
    CSeq: 9
  12.  
    Content-Length: 46
  13.  
    Content-Type: text/parameters
  14.  
     
  15.  
    packets_received: 10
  16.  
    jitter: 0.3838
  • SET_PARAMETER

用于设置指定媒体流的参数。

  1.  
    C->S: SET_PARAMETER rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 10
  3.  
    Content-length: 20
  4.  
    Content-type: text/parameters
  5.  
     
  6.  
    barparam: barstuff
  7.  
     
  8.  
    S->C: RTSP/1.0 451 Invalid Parameter
  9.  
    CSeq: 10
  10.  
    Content-length: 10
  11.  
    Content-type: text/parameters
  12.  
     
  13.  
    barparam
  • REDIRECT

重定向请求,用于服务器通知客户端新的服务地址,客户端需要向这个新地址重新发起请求。重定向请求中可能包含Range参数,指明重定向生效的时间。客户端若需向新服务地址发起请求,必须先teardown当前会话,再向指定的新主机setup一个新的会话。

  1.  
    S->C: REDIRECT rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 11
  3.  
    Location: rtsp://bigserver.com:8001
  4.  
    Range: clock=19960213T143205Z-
  • ANNOUNCE

ANNOUNCE请求有两个用途:(1)C->S:客户端向服务器端发布URL指定的媒体信息描述;(2) S->C:实时更新对话描述。若媒体表示中新增了一个媒体流,例如在直播过程中,则整个媒体表示的description都要被重新发送,而不是只发送新增部分。

  1.  
    C->S: ANNOUNCE rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 7
  3.  
    Date: 23 Jan 1997 15:35:06 GMT
  4.  
    Session: 12345678
  5.  
    Content-Type: application/sdp
  6.  
    Content-Length: 332
  7.  
     
  8.  
    v=0
  9.  
    o=mhandley 2890844526 2890845468 IN IP4 126.16.64.4
  10.  
    s=SDP Seminar
  11.  
    i=A Seminar on the session description protocol
  12.  
    u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
  13.  
    e=mjh@isi.edu (Mark Handley)
  14.  
    c=IN IP4 224.2.17.12/127
  15.  
    t=2873397496 2873404696
  16.  
    a=recvonly
  17.  
    m=audio 3456 RTP/AVP 0
  18.  
    m=video 2232 RTP/AVP 31
  19.  
     
  20.  
    S->C: RTSP/1.0 200 OK
  21.  
    CSeq: 7
  • RECORD

请求录制指定范围的媒体数据,请求中可指定录制的起止时间戳;若未指定时间范围,则使用presentation description中的开始和结束时间,这种情况下,如果会话已开始,则立即启动录制操作。

  1.  
    C->S: RECORD rtsp://example.com/media.mp4 RTSP/1.0
  2.  
    CSeq: 6
  3.  
    Session: 12345678
  4.  
     
  5.  
    S->C: RTSP/1.0 200 OK
  6.  
    CSeq: 6
  7.  
    Session: 12345678

以上就是RTSP中常用的命令及其实例介绍。最后,来看一段实际使用的RTSP命令交互过程,该过程是通过PC对海康摄像头视频流的拉取和播放,并通过Wireshark抓取客户端的数据得到的:

    1.  
      OPTIONS rtsp://10.3.8.202:554 RTSP/1.0
    2.  
      CSeq: 2
    3.  
      User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22)
    4.  
       
    5.  
      RTSP/1.0 200 OK
    6.  
      CSeq: 2
    7.  
      Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER
    8.  
      Date: Mon, Jan 29 2018 16:56:47 GMT
    9.  
       
    10.  
      DESCRIBE rtsp://10.3.8.202:554 RTSP/1.0
    11.  
      CSeq: 3
    12.  
      User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22)
    13.  
      Accept: application/sdp
    14.  
       
    15.  
      RTSP/1.0 401 Unauthorized
    16.  
      CSeq: 3
    17.  
      WWW-Authenticate: Digest realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", stale="FALSE"
    18.  
      Date: Mon, Jan 29 2018 16:56:47 GMT
    19.  
       
    20.  
      DESCRIBE rtsp://10.3.8.202:554 RTSP/1.0
    21.  
      CSeq: 4
    22.  
      Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554", response="3fc4b15d7a923fc36f32897e3cee69aa"
    23.  
      User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22)
    24.  
      Accept: application/sdp
    25.  
       
    26.  
      RTSP/1.0 200 OK
    27.  
      CSeq: 4
    28.  
      Content-Type: application/sdp
    29.  
      Content-Base: rtsp://10.3.8.202:554/
    30.  
      Content-Length: 551
    31.  
       
    32.  
      v=0
    33.  
      o=- 1517245007527432 1517245007527432 IN IP4 10.3.8.202
    34.  
      s=Media Presentation
    35.  
      e=NONE
    36.  
      b=AS:5050
    37.  
      t=0 0
    38.  
      a=control:rtsp://10.3.8.202:554/
    39.  
      m=video 0 RTP/AVP 96
    40.  
      c=IN IP4 0.0.0.0
    41.  
      b=AS:5000
    42.  
      a=recvonly
    43.  
      a=x-dimensions:2048,1536
    44.  
      a=control:rtsp://10.3.8.202:554/trackID=1
    45.  
      a=rtpmap:96 H264/90000
    46.  
      a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z00AMp2oCAAwabgICAoAAAMAAgAAAwBlCA==,aO48gA==
    47.  
      a=Media_header:MEDIAINFO=494D4B48010200000400000100000000000000000000000000000000000000000000000000000000;
    48.  
      a=appversion:1.0
    49.  
       
    50.  
      SETUP rtsp://10.3.8.202:554/trackID=1 RTSP/1.0
    51.  
      CSeq: 5
    52.  
      Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="ddfbf3e268ae954979407369a104a620"
    53.  
      User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22)
    54.  
      Transport: RTP/AVP;unicast;client_port=57844-57845
    55.  
       
    56.  
      RTSP/1.0 200 OK
    57.  
      CSeq: 5
    58.  
      Session: 1273222592;timeout=60
    59.  
      Transport: RTP/AVP;unicast;client_port=57844-57845;server_port=8218-8219;ssrc=5181c73a;mode="play"
    60.  
      Date: Mon, Jan 29 2018 16:56:47 GMT
    61.  
       
    62.  
      PLAY rtsp://10.3.8.202:554/ RTSP/1.0
    63.  
      CSeq: 6
    64.  
      Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="b5abf0b230de4b49d6c6d42569f88e91"
    65.  
      User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22)
    66.  
      Session: 1273222592
    67.  
      Range: npt=0.000-
    68.  
       
    69.  
      RTSP/1.0 200 OK
    70.  
      CSeq: 6
    71.  
      Session: 1273222592
    72.  
      RTP-Info: url=rtsp://10.3.8.202:554/trackID=1;seq=65373;rtptime=3566398668
    73.  
      Date: Mon, Jan 29 2018 16:56:47 GMT
    74.  
       
    75.  
      GET_PARAMETER rtsp://10.3.8.202:554/ RTSP/1.0
    76.  
      CSeq: 7
    77.  
      Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="bb2309dcd083b25991c13e165673687b"
    78.  
      User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22)
    79.  
      Session: 1273222592
    80.  
       
    81.  
      RTSP/1.0 200 OK
    82.  
      CSeq: 7
    83.  
      Date: Mon, Jan 29 2018 16:56:47 GMT
    84.  
       
    85.  
      TEARDOWN rtsp://10.3.8.202:554/ RTSP/1.0
    86.  
      CSeq: 8
    87.  
      Authorization: Digest username="admin", realm="IP Camera(10789)", nonce="6b9a455aec675b8db81a9ceb802e4eb8", uri="rtsp://10.3.8.202:554/", response="e08a15c27d3daac14fd4b4bcab424a5e"
    88.  
      User-Agent: LibVLC/2.2.8 (LIVE555 Streaming Media v2016.02.22)
    89.  
      Session: 1273222592
    90.  
       
    91.  
      RTSP/1.0 200 OK
    92.  
      CSeq: 8
    93.  
      Session: 1273222592
    94.  
      Date: Mon, Jan 29 2018 16:57:03 GMT
    95.  

RSTP协议简介的更多相关文章

  1. Fiddler--一、HTTP协议简介

    在学习Fiddler之前,最好先学习一下HTTP协议. HTTP协议简介 什么是HTTP协议 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端 ...

  2. MODBUS-RTU通讯协议简介

    MODBUS-RTU通讯协议简介   什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...

  3. JavaWeb:Web与HTTP协议简介

    JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...

  4. CC2540开发板学习笔记(九)—— BLE协议简介

    一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...

  5. HTTP 协议简介

    HTTP 协议简介 博客分类: acl开发--HTTP协议篇 网络协议http协议  一.TCP/IP 协议介绍 在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容.TCP/IP协议是 ...

  6. OAUTH协议简介

    OAUTH协议简介 原文来自:http://blog.csdn.net/hereweare2009/article/details/3968582 分类: Open API2009-03-08 12: ...

  7. GRE 协议简介

    1. 协议简介    gre(generic routing encapsulation,通用路由封装)协议是对某些网络层协议(如ip 和ipx)的数据报进行封装,使这些被封装的数据报能够在另一个网络 ...

  8. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  9. Tsung MQTT协议简介及MQTT xml文档配置介绍

    MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...

随机推荐

  1. 工具系列 | Docker基本概念小结

    ▍什么是Docker? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容 ...

  2. Acunetix 11 配置详解

    Acunetix 扫描配置 Full Scan– 使用Full Scan来发起一个扫描的话,Acunetix会检查所有可能得安全漏洞. High Rish Vulnerabilities–这个扫描选项 ...

  3. mumu模拟器手Q自动化配置

    { "platformName": "Android", "platformVersion": "6.0.1", &qu ...

  4. HTML横向滚动条和文本超出显示三个小圆点

    我们这次要说的就是:现在有很多的公司以及很多的app软件经常使用的两个方法横向滚动条和文本超出三个小圆点 横向滚动条:顾名思义嘛,就是能够一块内容可以横着滑动. 文本超出三个小圆点:文本超出就是当文本 ...

  5. 啊哈!C语言课后参考答案上

    最近看到一本好评量很高的的C语言入门书,课本真的很好,入门的话.专业性没有那么强,但入门足够了!!好评!看着看着就想把这本书的题课后习题都写出来,最后就有了这个小结.可能有的不是最好,不那么专业,但主 ...

  6. 个性化重排--Personalized Re-ranking for Recommendation

    推荐中的个性化重排--Personalized Re-ranking for Recommendation 这篇文章是阿里在ResSys'19发表的,主要贡献是在重排序阶段,引入了用户的相关信息,很符 ...

  7. Excel获取当前日期和时间

    在Excel中获取当前时间 1.第一种在空的单元格内输入函数“NOW()”回车即可获取当前时间如图 2.第二种选中空单元格“按住CTRL+:”回车即可获取当前时间 3.第一种在空的单元格内输入函数“t ...

  8. Time、Date拼接成TimeStamp

    Time.Date拼接成TimeStamp 有关于Time类型.Date类型的数据这里不再赘述,本文旨在讲解如何将数据库中的Time.Date类型取出来并转换成TimeStamp类型,话不多说,先看代 ...

  9. C语言关键字const作用及其应用

    只要学过C语言的,都有知道const这个关键字,知道是用来定义常量的,如果一个变量被const修饰,那么它的值就不能再被改变,那么还有什么其他作用呢? 一.const常用作用 1.修饰局部变量 con ...

  10. 【5min+】 秋名山的竞速。 ValueTask 和 Task

    系列介绍 简介 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的. ...