RTP、RTCP和RTSP協議基礎

jopen 8年前發布 | 27K 次閱讀 網絡技術

1 RTSP概述

1.1 RTSP概念   

    RTSP(Real-Time Stream Protocol )是一種基于文本的應用層協議,在語法及一些消息參數等方面,RTSP協議與HTTP協議類似。

    RTSP被用于建立的控制媒體流的傳輸,它為多媒體服務扮演“網絡遠程控制”的角色。RTSP本身并不用于傳送媒體流數據。媒體數據的傳送可通過RTP/RTCP等協議來完成。

1.2 基本的RTSP操作過程

   首先,客戶端連接到流服務器并發送一個OPTIONS命令查詢服務器提供的方法收到服務器的回應后,發送DESCRIBE命令查詢某個媒體文件的SDP信息。流服務器通過一個SDP描述來進行回應,回應信息包括流數量、媒體類型等信息。客戶端分析該SDP描述,并為會話中的每一個流發送一個SETUP命令,SETUP命令告訴服務器客戶端用于接收媒體數據的端口。流媒體連接建立完成后,客戶端發送一個PLAY命令,服務器就開始傳送媒體流數據。在播放過程中客戶端還可以向服務器發送PAUSE等其他命令控制流的播放。通信完畢,客戶端可發送TERADOWN命令來結束流媒體會話。

1.3 RTSP與HTTP的區別

        可以發現RTSP協議的格式與http協議很類似,都是基于文本的協議,語法也基本相同。但是它們并不相同,有以下主要差別:

       首先,方法名稱不同。RTSP新增了DESCRIBESETUPPLAY等方法。

       其次,HTTP協議是無狀態的協議,方法之間的發送并無明顯的次序關系。而RTSP是有狀態的協議,各方法存在次序關系。

在者,HTTP協議可以以內帶載荷數據的方式傳送數據,如網頁數據。而RTSP僅僅提供流播放的控制,并不傳送流媒體數據。流媒體數據可以通過RTP/RTCP的方式傳送。

1.4 RTSP以及RTP等在TCP/IP協議簇中位置


2 RTSP消息

2.1 RTSP消息格式

2.1.1 RTSP請求消息格式

方法名稱 URL RTSP版本   回車換行     
     header   回車換行  回車換行
     body     回車換行

注意:方法名稱 包括OPTIONSDESCRIBESETUPPLAYTEARDOWN等。

    URL 是接受方的地址,如:rtsp://192.168.0.1/video1.3gp

    RTSP版本一般是RTSP/1.0

    消息的每一行都會以回車換行結尾,為了便于定位識別,消息頭header的最后一行有兩個回車換行。

    消息體body有時是可選的。

2.1.2 RTSP響應消息格式

RTSP版本  狀態碼  對應文本解釋  回車換行    
    header  回車換行  回車換行
    body    回車換行

注音:  RTSP版本 一般為RTSP/1.0

    狀態碼 表示對應消息的執行結果。

    部分狀態碼與文本解釋對應列表如下:

   狀態碼       文本解釋                      含義

  “200         OK                              執行成功

  “400         Bad Request                 錯誤請求

  “404        Not Found                  未找到

  “500        Internal Server Error   服務器內部錯誤

2.2 RTSP中各方法詳細介紹

2.2.1 OPTIONS

Client用OPTIONS來查詢Server提供的方法。Server在響應消息的public字段給出自己提供的方法集合。

注意:

1 OPTIONS方法并非必須,Client可以繞過OPTIONS,而直接向server發送其他消息。

2 OPTIONS可以再任何時間發送。有的客戶端會定時向服務器發送OPTION消息。而服務器也可以通過是否定時收到OPTIONS消息來判斷客戶端是否在線。但并不是所有客戶端和服務器都這樣做。


Server給Client的響應消息的各個字段的含義:

A CSeq字段 請求的序號

客戶端的每一個請求都會被賦值一個序號。每個請求消息也會對應一個同樣序號的回應消息。

B Public字段 Server給出自己提供的方法的集合。

Client給Server的請求消息的各個字段含義:

A UserAgent字段 用戶標識不同公司或是不同的客戶端

該域用于用戶標識不同公司或是不同的客戶端。不同客戶端發出的消息中的這個域的內容都不大相同。有時會指明客戶端的版本號、型號等等。

Clinet------>Server:
OPTIONS rtsp://10.34.3.80/D:/a.264 RTSP/1.0

CSeq: 2                                                                                              //請求序號

User-Agent: LibVLC/2.0.7 (LIVE555 Streaming Media v2012.12.18)

Server------>Client:
RTSP/1.0 200 OK

CSeq: 2                                                                                              //回復序號

Date: Tue, Jul 22 2014 02:41:21 GMT

Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER

2.2.2 DESCRIBE

     DESCRIBE消息是由客戶端發送到服務器端,用于客戶端得到請求鏈接中指定的媒體文件的相關描述,一般是SDP信息。

      Server把SDP放在RTSP的響應消息中發給Client。 SDPSession Description Protocol)包含了會話的描述、媒體編碼類型、媒體的碼率等信息。對于流媒體服務而言,以下幾個域是在SDP中一定要包含的。

“a=control:”
“a=range:”
“a=rtpmap:”
“a=fmtp:”

     當一個錄像中即包含音頻又包含視頻時,會有多個上述結構。每個媒體描述以m開始。m行又稱媒體行,描述了發送方所支持的媒體類型等信息,需要詳細說明下a行為媒體的屬性行,以屬性的名稱:屬性值的方式表示。

音頻的m行的格式:

    m=audio 3458  RTP/AVP  0   96   97       第一個參數audio為媒體名稱:表明支持音頻類型。
    第二個參數3488為端口號,表明UE在本地端口為3458上發送音頻流。
    第三個參數RTP/AVP為傳輸協議,表示基于UDP的RTP協議。
    第四到七個參數為所支持的四種凈荷類型編號。
    a=rtpmap:0   PCMU
    a=rtpmap:96  G726-32/8000
    a=rtpmap:97  AMR-WB
    a行為媒體的屬性行,以屬性的名稱:屬性值的方式表示。
   格式為:a=rtpmap:<凈荷類型><編碼名稱> 
   凈荷類型0固定分配給了PCMU,
   凈荷類型96對應的編碼方案為G.726,為動態分配的。
   凈荷類型97對應的編碼方式為自適應多速率寬帶編碼(AMR-WB),為動態分配的。

視頻的m行的格式:

   m=video 3400 RTP/AVP 98  99   第一個參數video為媒體名稱:表明支持視頻類型。
   第二個參數3400為端口號,表明UE在本地端口為3400上發送視頻流。
   第三個參數RTP/AVP為傳輸協議,表示RTP over UDP。
   第四、五參數給出了兩種凈荷類型編號
   a=rtpmap:98  MPV
   a=rtpmap:99  H.261
   凈荷類型98對應的編碼方案為MPV,為動態分配的。
   凈荷類型97對應的編碼方式為H.261,為動態分配的。


Server給Client的響應消息的各個字段的含義:

A Content-Base字段   指明對某個媒體的描述信息

B Content-Typte字段   請求類型

C Content-Length字段  SDP的長度(因為這里的body中)

Client給Server的請求消息的各個字段含義:

A Accept字段  用于指定客戶端可以接受的媒體描述信息類型,此處為SDP信息。

2.2.3 SETUP

SETUP消息用于確定轉輸機制,建立RTSP會話。

注意:客戶端也可以在建立RTSP后再次發出一個SETUP請求為正在播放的媒體流改變傳輸參數,服務器可能同意這些參數。若不同意,會回應 "455 Method Not Valid In This State"


Server給Client的響應消息的各個字段的含義:

A Transport字段  由服務器確認后的傳輸參數

Client給Server的請求消息的各個字段含義:

A Transport字段  客戶端可接受的數據傳輸參數

如果該請求不包含SessionID,則服務器會產生一個SessionID

例子1:使用RTP over UDP方式

Client-------------->Server:
SETUP rtsp://10.34.3.80/D:/a.264/track1 RTSP/1.0   //track1表示對1號通道進行設置

CSeq: 4

User-Agent: LibVLC/2.0.7 (LIVE555 Streaming Media v2012.12.18)   //客戶端版本信息

Transport: RTP/AVP;unicast;client_port=60094-60095       //約定傳輸參數 RTP/AVP表示采用RTP over UDP, unicast表示單播,用以區別組播。Client_port約定客戶端RTP端口為60094,RTCP端口為60095

Server-------------->Client:
RTSP/1.0 200 OK

CSeq: 4

Date: Tue, Jul 22 2014 02:41:25 GMT

Transport: RTP/AVP;unicast;destination=10.34.3.80;source=10.34.3.80;client_port=60094-60095;server_port=6970-6971 //服務器端所指定的傳輸參數
這里要注意:RTP用偶數端口,RTCP為相鄰的奇數端口
Session: 54DAFD56;timeout=65    //SessionID

例子2: 使用RTP over TCP方式

CLient--------------->Server: request 消息
SETUP rtsp://10.34.3.80/D:/a.264/track1 RTSP/1.0   //track1表示對1號通道進行設置
CSeq: 4
User-Agent: LibVLC/2.0.7 (LIVE555 Streaming Media v2012.12.18)  
Transport: RTP/AVP/TCP;unicast;interleaved= 0-1
SETUP命令的Transport字段為RTP/AVP/TCP,同時多了一個interleaved=0-1字段。
由于RTP over TCP將RTP包和RTCP包發至同一個TCP端口,
因此使用interleaved的值來區分到底是RTP還是RTCP包。I
nterleaved=0表示RTP包,interleaved=1表示RTCP包。

Server--------------->Client:response 消息
RTSP/1.0 200 OK
CSeq: 4
Date: Tue, Jul 22 2014 02:41:25 GMT
Transport: RTP/AVP/TCP;interleaved=0-1
Session: 54DAFD56;timeout=65

2.2.4 PLAY

PLAY方法通知服務器按照SETUP中指定的機制開始傳送數據。服務器會從PLAY消息指定范圍的開始時間開始傳送數據,直到該范圍結束。

注意:服務器可能會將PLAY請求放到隊列中,后一個PLAY請求需要等待前一個PLAY請求完成才能得到執行。


Client給Server的請求消息的各個字段含義:

A Range字段 指定了播放開始的時間。

如果在這個指定時間后收到消息,那么播放立即開始。不含Range頭的PLAY請求也是合法的,此時將從媒體流開始位置播放,直到媒體流被暫停。如果媒體流通過PAUSE暫停,媒體流傳輸將在暫停點繼續傳輸。如果媒體流正在播放,那么該PLAY請求將不起作用。客戶端可以利用此來測試服務器是否存活。


例子:

Client----------->Server:
PLAY rtsp://10.34.3.80/D:/a.264/ RTSP/1.0
CSeq: 5
User-Agent: LibVLC/2.0.7 (LIVE555 Streaming Media v2012.12.18)
Session: 54DAFD56                 //SessionID,SETUP回應中返回
Range: npt=0.000-   /                /指定開始播放的時間
Server----------->Client:
RTSP/1.0 200 OK
CSeq: 5
Date: Tue, Jul 22 2014 02:41:25 GMT
Range: npt=0.000- 
Session: 54DAFD56
RTP-Info: url=rtsp://10.34.3.80/D:/a.264/track1;seq=10244;rtptime=2423329550  //RTP信息
Url字段為RTP參數對應的流媒體鏈接地址,seq字段為流媒體第一個包的序列號,rtptime為range域對應的RTP時間戳

2.2.5 PAUSE

PAUSE消息通知服務器暫停流傳輸的傳輸。

如果請求URL中指定了具體的媒體流,那么只有該媒體流的播放被暫停。可以指定僅暫停音頻,此后的播放將會靜音。

如果請求URL指定了一組流,那么在該組中的所有流的傳輸將被暫停。

注意:服務器有可能不支持PAUSE消息。例如,實時流就有可能不支持暫停。當一個服務器不支持某一個消息時,會回應給客戶端“501 Not Implemented”


Client給Server的請求消息的各個字段含義:

A Range字段(可選)  用來指定媒體流暫停的時間點,稱之為暫停點。

這里的Range頭必須包含一個精確的值,而不是一個時間范圍。如果Range頭指定了一個時間超出了PLAY請求的范圍,服務器將將返回"457 Invalid Range" 。如果Range頭缺失,那么在收到暫停消息后媒體流傳輸立即暫停,并將暫停點設置成當前播放時間。

2.2.6 TEARDOWN

TEARDOWN請求終止了給定URL的媒體流傳輸,并釋放了與該媒體流相關的資源。

3 RTP、RTCP協議

3.1 RTP協議

1 RTP概述

RTP是實時傳輸協議(Real-Time Transport Protocol)的縮寫,是針對多媒體數據流的實時傳輸協議。

通常建立在UDP協議之上,也可以建立在TCP協議之上。有人將其歸為應用層協議,也有人將其歸為傳輸層協議,這都是可以的。

Rtp協議提供了時間戳和序列號。發送端在采樣時設置時間戳,接收端收到后,會按照時間戳依次播放。RTP本身只保證實時數據的傳輸,并不能為按順序傳送的數據包提供可靠的傳送機制,也不提供流量和擁塞控制,它依靠RTCP來提供這些服務。

2 RTP報文格式

   版本號(V):0-1  2b 用來標識使用的RTP版本。

    填充位(P):2  1b 如果該位被置為1,則RTP包的尾部會跟附加的填充字節。

    擴展位(X):3 1b 如果該位被置為1,則RTP包的尾部會跟附加擴展幀頭。

    CSRC計數器(CC): 4-7 4b 固定頭部后跟著的CSRC數目。

    標記位(M): 8 1b 該位的解釋由配置文檔解釋。

    載荷類型(PT):9-15 7b標識RTP載荷的類型。

    序列號(SN): 16- 31 16b發送方在發送完每一個RTP包后會將該域 的值加1,接收方可以通過檢測序列號來判斷是否出現RTP丟包現象。注意:序列號的初始值是隨機的。

    時間戳:32 32b 該包中第一個字節的采樣時刻。時間戳有一個初始值,隨著時間的流逝而不斷增加。即使此時沒有包被發出,時間戳也會不段增加。時間戳是實現去除抖動和實現同步必不可少的。

    SSRC:同步源標識符: 32b  RTP包的來源,在同一個RTP會話中不能 有兩個相同的SSRC值。該字段是根據一定的算法隨機生成。

    CSRC List:貢獻源列表 0-15個,每項32b 用來標識對一個RTP混合器產生的新包有貢獻的所有RTP包的源。

3.2 RTCP協議

1 RTCP協議概述

RTCP是實時控制協議(Real-Time Control Protocol)的縮寫。RTCP通常與RTP配合使用,用以管理傳輸質量在當前進程之間的交換信息。

在RTP會話期間,各參與者周期性的傳送RTCP包,RTCP包中包含已發送數據包的數量、丟失的數據包的數量等統計資料。服務器可以利用這些信息動態的改變傳輸速率,甚至改變有效載荷的類型。

RTP和RTCP配合使用,可以有效且以最小的開銷達到最佳傳輸效率,非常適合傳送實時流。

2 RTCP協議的端口以及五種包

RTSP通常使用RTP協議來傳送實時流,RTP一般使用偶數端口,而RTCP使用相鄰的奇數端口,即RTP端口號+1。

在RTCP通信控制中,RTCP協議的功能是通過不同類型的RTCP包來實現的。RTCP也是基于UDP包來傳送的,主要有五種類型的封包:

    1.SR:發送端報告,由發送RTP數據報的應用程序或中端發出的。

    2.RR:接收端報告,由接受但不發送RTP數據報的應用程序或中端發出。

    3.SDES: 源描述,傳遞與會話成員有關的標識信息的載體,如用戶名、郵件、電話等。

   4.BYE: 通知離開,通知回話中的其他成員將退出會話。

   5.APP: 由應用程序自己定義,作為RTCP協議的擴展。

3 RTCP協議報文格式

    版本(V):同RTP包頭部

    填充(P) :同RTP包頭部。

    接收報告計數器(RC:5b SR包中接收的報告塊的數目。

    包類型(PT): 8bit SR包類型為200

    長度(length):SR包以32bit1單位的長度減1

    同步源(SSRC):SR包發送的同步源標識符。與對應RTP包中的SSRC一樣。

    NTP時間戳(Network Time Protocol:SR包發送時的絕對時間。用于同步不同的流。

    RTP時間戳:與NTP時間戳對應,與RTP包中的時間戳具有相同的初始值。

    Send’s Packet count:從開始發包到產生這個SR包的這段時間內發送者發送的有效數據的總字節數,不包括頭部和填充,發送者改變SSRC時,該域要清零。

    同步源nSSRC標識符:該報告中包含的是從該源接收到的包的統計信息。

    丟失率:表明從上一個SRRR包發出依來從同步源n發送的RTP包的丟失率。

    累計丟失數據:從開始接受SSRC_n的包到發送SR這個時間段內SSRC_n發送的RTP丟失的總數目。

    收到的擴展最大序列號:從SSRC_n收到的從RTP數據包中的最大序列號。

    接收抖動(Interarrival jitter):RTP數據包接收時間的統計方差估計。

    上次SR時間戳(Last SR):取最近從SSRC_n收到的SR包中的NTP時間戳中的中間32bit。如果還未收到SR包,則為0

    上次依賴SR延遲(Delay since Last SR):從上次SSRC_n收到SR包到發送本包的延遲

4 音視頻同步

傳送的音頻和視頻流位于兩個不同的RTP會話中,每個RTP包均有自己的時間戳,同時RTCP包中的NPT字段(Network Protocol Time)保存的絕對時間可以用來將音視頻映射到同一時間軸上,從而實現音視頻同步。


來自: http://blog.csdn.net/ithzhang/article/details/38346557

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!