天天看點

深入刨析網絡流媒體協定之——RTSP協定

RTSP(Real-Time Stream Protocol)協定是一個基于文本的多媒體播放控制協定,屬于應用層。 是由Real Network和Netscape共同提出的如何有效地在IP網絡上傳輸流媒體資料的應用層協定。RTSP提供一種可擴充的架構,能夠提供可控制的,按需 傳輸的實時資料,比如音頻和視訊檔案。源資料可以包括現場資料的回報和存儲的檔案。RTSP對流媒體提供了諸如暫停,快進等控制,而它本身并不傳輸數 據,RTSP的作用相當于流媒體伺服器的遠端控制。傳輸資料可以通過傳輸層的TCP/UDP協定,RTSP也提供了基于RTP傳輸機制的一些有效的方法。該标準由IETF指定,對應的協定是RFC2326。

RTSP作為一個應用層協定,提供了一個可供擴充的架構,使得流媒體的受控和點播變得可能,它主要用來控制具有實時特性的資料的發送,但其本身并不用于傳送流媒體資料,而必須依賴下層傳輸協定(如RTP/RTCP)所提供的服務來完成流媒體資料的傳送。RTSP負責定義具體的控制資訊、操作方法、狀态碼,以及描述與RTP之間的互動操作。RTSP媒體服務協定架構如下:

深入刨析網絡流媒體協定之——RTSP協定

RTSP包含Normal RTSP(資料通過RTP傳輸,應用廠商有蘋果和微軟等),以及Real-RTSP(資料通過RDT傳輸)。本篇我們主要講Normal RTSP。

RTSP傳輸的一般是TS、MP4格式的流,其傳輸一般需要2~3個通道,指令和資料通道分離。使用RTSP協定傳輸流媒體資料需要有專門的媒體播放器和媒體伺服器,也就是需要支援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:[email protected]:554/h264/ch1/main/av_stream

rtsp://admin:[email protected]/mpeg4/ch1/sub/av_stream

RTSP封包

對RTSP協定的使用有了一個大概的了解之後,我們來看一下RTSP封包結構。

RTSP是一種基于文本的協定,用CRLF(回車換行)作為每一行的結束符,其好處是,在使用過程中可以友善地增加自定義參數,也友善抓包分析。從消息傳送方向上來分,RTSP的封包有兩類:請求封包和響應封包。請求封包是指從用戶端向伺服器發送的請求(也有少量從伺服器向用戶端發送的請求),響應封包是指從伺服器到用戶端的回應。

RTSP請求封包的常用方法與作用:

深入刨析網絡流媒體協定之——RTSP協定

1.OPTIONS

目的是得到伺服器提供的可用方法:

OPTIONS rtsp://192.168.22.136:5000/v0 RTSP/1.0

CSeq: 1 //每個消息都有序号來标記,第一個包通常是OPTIONS請求消息

User-Agent: bestilyq //自定義的字元串

伺服器的回應資訊包括提供的一些方法。例如:

RTSP/1.0 200 OK

Cseq: 1         //每個回應消息的cseq數值和請求消息的cseq相對應

Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY //伺服器提供的可用的方法

2.DESCRIBE

C向S發起DESCRIBE請求,為了得到會話描述資訊(SDP):

DESCRIBE rtsp://192.168.20.136:5000/v0 RTSP/1.0

CSeq: 2

Accept: application/sdp

Authorization: Basic YWRtaW46YWRtaW4= //有認證,不需要認證時不需要該字段

User-Agent: bestilyq

伺服器回應一些對此會話的描述資訊(sdp):

RTSP/1.0 200 OK

Cseq: 2

Date: Sat Feb  5 22:49:39 2009 GMT

Content-Type: application/sdp

Content-Length: 182

v=0                     //以下都是sdp資訊

o=- 0 0 IN IPV4 127.0.0.1

t=0 0

s=No Name

a=tool:libavformat

m=video 0 RTP/AVP 96 //m表示媒體描述,下面是對會話中視訊通道的媒體描述

b=AS:2000

a=rtpmap:96 MP4V-ES/90000

a=fmtp:96 profile-level-id=1

a=control:streamid=0 //streamid=0表示視訊流用的是通道0

3.SETUP

用戶端提醒伺服器建立會話,并确定傳輸模式:

(1)TCP模式

SETUP rtsp://192.168.20.136:5000/v0/streamid=0 RTSP/1.0    

CSeq: 3

Authorization: Basic YWRtaW46YWRtaW4=

Transport: RTP/AVP/TCP;unicast;interleaved=0-1      

User-Agent: bestilyq

(2)UDP模式

SETUP rtsp://192.168.20.136:5000/v0/streamid=0 RTSP/1.0

CSeq: 3

Transport: RTP/AVP;unicast;client_port=3008-3009

Authorization: Basic YWRtaW46YWRtaW4=

User-Agent: bestilyq

    URI中帶有streamid=0,表示對該通道進行設定。

    Transport參數設定了傳輸模式。RTP/AVP/TCP表示通過TCP傳輸RTP包,RTP/AVP表示使用UDP傳輸RTP包。unicast表示單點傳播。interleaved 值有兩個:0和1,0表示RTP包,1表示RTCP包,接收端根據interleaved的值來差別是哪種資料包。client_port值有3008和 3009,3008表示用戶端接收RTP包的端口,3009表示用戶端接收RTCP包的端口,服務端要分别将RTP包和RTCP包發送到這兩個端口。

伺服器回應資訊:

(1)TCP模式

RTSP/1.0 200 OK

CSeq: 3

Date: Sat Feb  5 22:35:27 2009 GMT

Session: a522bbb4335617db

Transport: RTP/AVP/TCP;interleaved=0-1

(2)UDP模式

RTSP/1.0 200 OK

CSeq: 3

Date: Sat Feb  5 22:49:39 2009 GMT

Session: 01fa4ca2566a6301      //伺服器回應的會話辨別符

Transport: RTP/AVP/UDP;unicast;client_port=3008-3009;server_port=1024-1025

4.PLAY

用戶端發送播放請求:

PLAY rtsp://192.168.20.136:5000/v0 RTSP/1.0

CSeq: 4

Session: a522bbb4335617db      //SETUP傳回的會話辨別符

Range: npt=0.000-              //設定播放時間的範圍

User-Agent: bestilyq

伺服器回應資訊:

RTSP/1.0 200 OK

CSeq: 4

Date: Sat Feb  5 22:49:39 2009 GMT

Session: a522bbb4335617db

5.TEARDOWN

用戶端發起關閉請求:

TEARDOWN rtsp://192.168.20.136:5000/v0 RTSP/1.0

CSeq: 5

Session: a522bbb4335617db

User-Agent: bestilyq

伺服器回應:

RTSP/1.0 200 OK

Cseq: 5

Date: Sat Feb  5 22:49:47 2009 GMT

Session: a522bbb4335617db

    以上方法都是互動過程中最為常用的,其它還有一些重要的方法如GET_PARAMETER,SET_PARAMETER,PAUSE,REDIRECT等等。

一次基本的RTSP互動過程:

C表示RTSP用戶端,S表示RTSP服務端

1.C->S:OPTIONS request    //詢問S有哪些方法可用

1.S->C:OPTIONS response   //S回應資訊中包括提供的所有可用方法

2.C->S:DESCRIBE request   //要求得到S提供的媒體初始化描述資訊

2.S->C:DESCRIBE response  //S回應媒體初始化描述資訊,主要是sdp

3.C->S:SETUP request      //設定會話的屬性,以及傳輸模式,提醒S建立會話

3.S->C:SETUP response     //S建立會話,傳回會話辨別符,以及會話相關資訊

4.C->S:PLAY request       //C請求播放

4.S->C:PLAY response      //S回應該請求的資訊

S->C:發送流媒體資料

5.C->S:TEARDOWN request   //C請求關閉會話

5.S->C:TEARDOWN response  //S回應該請求

首先用戶端連接配接到流媒體伺服器并發送一個RTSP描述請求(DESCRIBE request),伺服器通過一個SDP(Session DescriptionProtocol)描述來進行回報(DESCRIBEresponse),回報資訊包括流數量、媒體類型等資訊。用戶端分析該SDP描述,并為會話中的每一個流發送一個RTSP連接配接建立請求(SETUPrequest),該指令會告訴伺服器用于接收媒體資料的端口,伺服器響應該請求(SETUP response)并建立連接配接之後,就開始傳送媒體流(RTP包)到用戶端。在播放過程中用戶端還可以向伺服器發送請求來控制快進、快退和暫停等。最後,用戶端可發送一個終止請求(TEARDOWN request)來結束流媒體會話。

繼續閱讀