即時串流協定

即時串流協議（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 date=20180109033607 : .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 date=20201111210709 : 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 date=20170925192045 - 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 date=20180109033607 : .NET C# RFC compliant implementation of RTSP written in completely managed code.- omxplayer- QuickTime- RealPlayer-  SharpRTSP date=20201111210709 : 開源，C＃ 編寫的RTSP流客戶端。- Skype- Spotify- VLC media player- Winamp- Windows Media Player- xine

**參考**

**外部鏈接**
  有關RTSP更詳細的介紹 date=20130531061033 -  關於RTSP的RFC文件-  RTSP RTP RTCP相關資料 date=20180514054853