即时串流协定

实时串流协议（Real Time Streaming Protocol，RTSP）是一种网络应用协议，专为娱乐和通信系统的使用，以控制流媒体服务器。该协议用于建立和控制终端之间的媒体会话。媒体服务器的客户端发布VCR命令，例如播放，录制和暂停，以便于实时控制从服务器到客户端（视频点播）或从客户端到服务器（语音录音）的媒体流。

流数据本身的传输不是RTSP的任务。大多数RTSP服务器使用实时传输协议（RTP）和实时传输控制协议（RTCP）结合媒体流传输。然而，一些供应商实现专有传输协议。例如，RealNetworks公司的RTSP服务器软件也使用RealNetworks的专有实时数据传输（RDT）。

RTSP由RealNetworks公司，Netscape公司 和哥伦比亚大学开发，第一稿于1996年提交给IETF。由互联网工程任务组（IETF）的多方多媒体会话控制工作组（MMUSIC WG）进行了标准化，并于1998年发布为RFC 2326。RTSP 2.0 于2016年发布为RFC 7826，作为RTSP 1.0的替代品。RTSP 2.0基于RTSP 1.0，但除了基本的版本协商机制之外不向后兼容。

## 协议指令

虽然在某些方面与HTTP类似，RTSP定义了控制多媒体播放控制顺序。虽然HTTP是无状态的，但RTSP具有状态; 当需要跟踪并发会话时使用标识符。像HTTP一样，RTSP使用TCP来维护端到端连接，而大多数RTSP控制消息由客户端发送到服务器，一些命令沿着另一个方向（即从服务器到客户端）传播。

这里提供了基本的RTSP请求。一些典型的HTTP请求，如OPTIONS请求也可用。默认传输端口为554，该端口同时应用于TCP和UDP，但后者很少用于控制请求。

OPTIONS 请求：OPTIONS请求返回服务器将接受的请求类型。(C 代表客户端 S 代表服务端)

```
C->S:  OPTIONS rtsp://example.com/media.mp4 RTSP/1.0
       CSeq: 1
       Require: implicit-play
       Proxy-Require: gzipped-messages

S->C:  RTSP/1.0 200 OK
       CSeq: 1
       Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
```

DESCRIBE 请求：DESCRIBE请求包括RTSP URL（rtsp:// ...）以及可以处理的回复数据类型。该回复包括呈现描述，通常以会话描述协议（SDP）格式。其中，演示文稿描述列出了使用汇总网址控制的媒体流。在典型的情况下，每个音频和视频都有一个媒体流。

```
C->S: DESCRIBE rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 2

S->C: RTSP/1.0 200 OK
      CSeq: 2
      Content-Base: rtsp://example.com/media.mp4
      Content-Type: application/sdp
      Content-Length: 460

      m=video 0 RTP/AVP 96
      a=control:streamid=0
      a=range:npt=0-7.741000
      a=length:npt=7.741000
      a=rtpmap:96 MP4V-ES/5544
      a=mimetype:string;"video/MP4V-ES"
      a=AvgBitRate:integer;304018
      a=StreamName:string;"hinted video track"
      m=audio 0 RTP/AVP 97
      a=control:streamid=1
      a=range:npt=0-7.712000
      a=length:npt=7.712000
      a=rtpmap:97 mpeg4-generic/32000/2
      a=mimetype:string;"audio/mpeg4-generic"
      a=AvgBitRate:integer;65790
      a=StreamName:string;"hinted audio track"
```

SETUP 请求：SETUP请求指定如何传输单个媒体流。这必须在发送PLAY请求之前完成。请求包含媒体流URL和传输说明符。该说明符通常包括用于接收RTP数据（音频或视频）的本地端口，另一个用于RTCP数据（元信息）。服务器回复通常会确认所选参数，并填写缺少的部分，例如服务器选择的端口。必须在发送聚合播放请求之前，使用SETUP配置每个媒体流。

```
C->S: SETUP rtsp://example.com/media.mp4/streamid=0 RTSP/1.0
      CSeq: 3
      Transport: RTP/AVP;unicast;client_port=8000-8001

S->C: RTSP/1.0 200 OK
      CSeq: 3
      Transport: RTP/AVP;unicast;client_port=8000-8001;server_port=9000-9001;ssrc=1234ABCD
      Session: 12345678
```

Play 播放请求：Play 播放请求 将导致播放一个或所有媒体流。可以通过发送多个播放请求来堆叠播放请求。URL可以是聚合URL（播放所有媒体流）或单个媒体流URL（仅播放该流）。可以指定范围。如果没有指定范围，流将从头开始播放，并播放到最后，或者如果流暂停，则在暂停点恢复播放。

```
C->S: PLAY rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 4
      Range: npt=5-20
      Session: 12345678

S->C: RTSP/1.0 200 OK
      CSeq: 4
      Session: 12345678
      RTP-Info: url=rtsp://example.com/media.mp4/streamid=0;seq=9810092;rtptime=3450012
```

PAUSE 暂停请求：PAUSE 暂停请求 暂时停止一个或所有媒体流，因此稍后可以通过播放请求恢复。请求包含聚合或媒体流URL。PAUSE请求中的范围参数指定何时暂停。当省略范围参数时，暂停会立即无限期地发生。

```
C->S: PAUSE rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 5
      Session: 12345678

S->C: RTSP/1.0 200 OK
      CSeq: 5
      Session: 12345678
```

RECORD 记录请求：RECORD 该方法根据呈现描述开始记录一系列媒体数据。时间戳反映开始和结束时间（UTC）。如果没有给定时间范围，请使用演示文稿描述中提供的开始或结束时间。如果会话已经开始，请立即开始录制。服务器决定是否将记录的数据存储在请求URI或其他URI下。如果服务器不使用请求URI，则响应应为201，并包含描述请求状态并引用新资源的实体以及Location头。

```
C->S: RECORD rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 6
      Session: 12345678

S->C: RTSP/1.0 200 OK
      CSeq: 6
      Session: 12345678
```

ANNOUNCE 发布请求：ANNOUNCE 发布方法有两个目的：

从客户端发送到服务器时，ANNOUNCE将请求URL标识的演示文稿或媒体对象的描述发布到服务器。当从服务器发送到客户端时，ANNOUNCE会实时更新会话描述。如果新的媒体流被添加到演示文稿中（例如，在实时演示中），则应该再次发送整个演示文稿描述，而不仅仅是附加的组件，以便可以删除组件。(下面邮箱'#'号替换成'@')

```
C->S: ANNOUNCE rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 7
      Date: 23 Jan 1997 15:35:06 GMT
      Session: 12345678
      Content-Type: application/sdp
      Content-Length: 332

      v=0
      o=mhandley 2890844526 2890845468 IN IP4 126.16.64.4
      s=SDP Seminar
      i=A Seminar on the session description protocol
      u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
      e=mjh#isi.edu (Mark Handley)
      c=IN IP4 224.2.17.12/127
      t=2873397496 2873404696
      a=recvonly
      m=audio 3456 RTP/AVP 0
      m=video 2232 RTP/AVP 31

S->C: RTSP/1.0 200 OK
      CSeq: 7
```

TEARDOWN 停止发布流请求：TEARDOWN 请求用于终止会话。它停止所有媒体流，并释放所有与会话相关的数据在服务器上。

```
C->S: TEARDOWN rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 8
      Session: 12345678

S->C: RTSP/1.0 200 OK
      CSeq: 8
```

GET_PARAMETER 获取参数请求：GET_PARAMETER 请求检索在URI中指定的呈现或流的参数的值。答复和回复的内容留给实施。没有实体的GET_PARAMETER可能用于测试客户端或服务器活动（“ping”）。

```
S->C: GET_PARAMETER rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 9
      Content-Type: text/parameters
      Session: 12345678
      Content-Length: 15

      packets_received
      jitter

C->S: RTSP/1.0 200 OK
      CSeq: 9
      Content-Length: 46
      Content-Type: text/parameters

      packets_received: 10
      jitter: 0.3838
```

SET_PARAMETER 设置参数请求：SET_PARAMETER 此方法请求设置由URI指定的演示文稿或流的参数值。

```
C->S: SET_PARAMETER rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 10
      Content-length: 20
      Content-type: text/parameters

      barparam: barstuff

S->C: RTSP/1.0 451 Invalid Parameter
      CSeq: 10
      Content-length: 10
      Content-type: text/parameters

      barparam
```

REDIRECT 重定向请求：REDIRECT 请求通知客户端它必须连接到另一个服务器位置。它包含强制性头文件位置，表示客户端应发出该URL的请求。它可能包含参数Range，它指示重定向何时生效。如果客户端希望继续发送或接收此URI的媒体，则客户端必须向指定的主机发出针对当前会话的TEARDOWN请求和新会话的SETUP。

```
S->C: REDIRECT rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 11
      Location: rtsp://bigserver.com:8001
      Range: clock=19960213T143205Z-
```

嵌入式（交错式）二进制数据：某些防火墙设计和其他情况可能会强制服务器交叉RTSP方法和流数据。通常应避免这种交错，除非有必要，因为它会使客户端和服务器操作复杂化，并增加额外的开销。交叉二进制数据只能在RTSP通过TCP传输时使用。诸如RTP数据包之类的流数据由ASCII码符号（24个十六进制）封装，后跟一个字节的信道标识符，后面是封装二进制数据的长度，以二进制字节为单位，以网络字节顺序排列。流数据紧随其后，没有CRLF，但包括上层协议头。每个$块只包含一个上层协议数据单元，例如一个RTP包。

```
C->S: SETUP rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 3
      Transport: RTP/AVP/TCP;interleaved=0-1

S->C: RTSP/1.0 200 OK
      CSeq: 3
      Date: 05 Jun 1997 18:57:18 GMT
      Transport: RTP/AVP/TCP;interleaved=0-1
      Session: 12345678

C->S: PLAY rtsp://example.com/media.mp4 RTSP/1.0
      CSeq: 4
      Session: 12345678

S->C: RTSP/1.0 200 OK
      CSeq: 4
      Session: 12345678
      Date: 05 Jun 1997 18:59:15 GMT
      RTP-Info: url=rtsp://example.com/media.mp4;
      seq=232433;rtptime=972948234

S->C: $\000{2 byte length}{"length" bytes data, w/RTP header}
S->C: $\000{2 byte length}{"length" bytes data, w/RTP header}
S->C: $\001{2 byte length}{"length" bytes  RTCP packet}
```

## 速率适配

使用RTP和RTCP的RTSP允许实现速率适配。

## 已经成功实现的

### 服务端

- Darwin Streaming Server: Open-sourced version of QuickTime Streaming Server maintained by Apple.
- Erlyvideo has RTSP client and can restream video to other protocols.
- Feng: Lean and mean streaming server with focus on rfc compliance.
- FFmpeg: includes ffserver a GPL or LGPL RTSP streaming server.
- GStreamer based RTSP Server and client.
- Helix DNA Server: RealNetworks' streaming server. Comes in both open-source and proprietary flavors.
- Helix Universal Server: RealNetworks commercial streaming server for RTSP, RTMP, iOS, Silverlight and HTTP streaming media clients
- LEADTOOLS Media Streaming Server SDK from LEAD Technologies supports RTSP/RTP, RTSP/RTP (MPEG-2 Transport), RTSP/RTP over HTTP.
- LIVE555 liveMedia / openRTSP: Open source C++ server and client libraries used in well-known clients like VLC and mplayer.
- Managed Media Aggregation : .NET C# RFC compliant implementation of RTSP written in completely managed code.
- Nimble Streamer supports RTSP pull and announce input with TCP interleaved playback output.
- pvServer: Formerly called PacketVideo Streaming Server, this is Alcatel-Lucent's streaming server product.
- QuickTime Streaming Server: Apple's closed-source streaming server that ships with Mac OS X Server.
- SharpRTSP : Open sourceC# RTSP streaming server.
- ViaMotion: Integrated RTSP server for Video On Demand by Anevia
- VideoLAN: Open source media player and streaming server.
- VX30: Streaming video server and embedded Java client from Maui X-Stream.
- Windows Media Services: Microsoft streaming server previously included with Windows Server that uses RTSP modified with Windows Media extensions
- Wowza Streaming Engine: Multi-format streaming server for RTSP/RTP, RTMP, MPEG-TS, ICY, HTTP (HTTP Live Streaming, HTTP Dynamic Streaming, Smooth Streaming, MPEG-DASH), WebRTC
- Xenon Streaming Server: 来自Vidiator Technology（US）Inc.的移动流服务器
- YouTube: 在桌面上通过移动HTTPS版本查看网站时，可以使用流媒体选项。

### 客户端

- Astra
- cURL (从7.20.0版本2010年2月9日 )
- FFmpeg
- GStreamer
- JetAudio
- LIVE555 liveMedia / openRTSP:开源，C++服务器和客户端库，如VLC和mplayer等知名客户端使用。
- Media Player Classic
- MPlayer
- MythTV via Freebox
- Managed Media Aggregation : .NET C# RFC compliant implementation of RTSP written in completely managed code.
- omxplayer
- QuickTime
- RealPlayer
- SharpRTSP : 开源，C＃ 编写的RTSP流客户端。
- Skype
- Spotify
- VLC media player
- Winamp
- Windows Media Player
- xine