本篇文章咱們將要開始介紹第一個應用層的流通訊協議 RTSP,別忘了上一篇介紹的 RTP 是傳輸層。
RTSP 協議
本篇文章將會分成幾個章節來理解 RTSP 協議:
它是被設計出來為,為了控制串流媒體 Sever 的協議 (ex. 快轉、暫停影片之類)
RTSP 它被設計出來是為了可以控制串流媒體伺服器的協議 (所以他是 C/S 架構),例如我們先發送一個觀看影片的請求給 Server,然後它就開始以串流型式來傳輸影片,然後這時我們可以用 RTSP 所提供的一些方法,來進行影片的快轉或暫停,為了能控制串流就是它被設計出來的原理。
就如同下圖所示,RTSP 讓我們可以操控串流媒體。
那它要如何控制呢串流呢 ?
它定義了控制的方法與參數
就如同 HTTP 一樣,它定義了一些方法可以給我們控制,例如 Play 這個動作,當串流 Server 看到這個動詞後,就會開始傳輸影片給請求者。
我們直接去使用網路上所提供的 RTSP 進行請求看看。這個連結你可以使用 ffplay 來開啟 (ffplay 之後會提)。
rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov
接下來我們下面說明,如果 client 端發送一條 rtsp 請求後,實際上的封包產生流程會長的什麼樣子 ?
C -> S
CSeq: 1
Request: OPTIONS rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov RTSP/1.0
S -> C
CSeq: 1
Response: RTSP/1.0 200 OK
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD, GET_PARAMETER
C -> S
Request: DESCRIBE rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov RTSP/1.0
Accept: application/sdp
CSeq: 2
S -> C
Response: RTSP/1.0 200 OK
CSeq: 2
Server: Wowza Streaming Engine 4.7.5.01 build21752
Cache-Control: no-cache
Expires: Sat, 25 Aug 2018 14:16:23 UTC
Content-length: 589
Content-Base: rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov
Date: Sat, 25 Aug 2018 14:16:23 UTC
Content-type: application/sdp
Session: 1305852487;timeout=60
包在 RTSP 封包的 SDP
Session Description Protocol Version (v): 0
Owner/Creator, Session Id (o): - 1305852487 1305852487 IN IP4 184.72.239.149
Session Name (s): BigBuckBunny_115k.mov
Session Attribute (a): range:npt=0- 596.48
Time Description, active time (t): 0 0
Media Description, name and address (m): audio 0 RTP/AVP 96
Media Attribute (a): rtpmap:97 H264/90000
Media Attribute (a): fmtp:96 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1490
C -> S
Request: SETUP rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov/trackID=1 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=22610-22611
CSeq: 3
Session: 1305852487
S -> C
Response: RTSP/1.0 200 OK
Transport: RTP/AVP/UDP;unicast;client_port=22610-22611;source=184.72.239.149;server_port=8880-8881;ssrc=372D3B76
Session: 1305852487;timeout=60
C ->
Request: PLAY rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov/ RTSP/1.0\r\n
Range: npt=0.000-
CSeq: 5
Session: 1305852487
S -> C
Response: RTSP/1.0 200 OK
RTP-Info: url=rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov/trackID=1;seq=1;rtptime=0,url=rtsp://184.72.239.149:554/vod/mp4:BigBuckBunny_115k.mov/trackID=2;seq=1;rtptime=0
CSeq: 5
Range: npt=0.0-596.48
Session: 1305852487;timeout=60
最後來說明一下 RTSP 的幾個特點。
最後這裡問個問題。
這個問題事實上有點兒不算問題。
基本上不是看它可不可以支持,而是看傳輸層的協議可不以支持,像如果使用 RTP 那基本上大部份都可以,因為 RTP 會將這些編碼自動轉成 RTP 容器,然後接受端在收到 RTP 時就可以根據他的表頭來知道它是什麼編碼,然後在解碼播歌。