即時串流協定

實時串流協議（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