RTP協議學習大總結從原理到代碼
from:http://wenku.baidu.com/view/aaad3d136edb6f1aff001fa5.html
一、流媒體概念
流媒體包含廣義和狹義兩種內涵:廣義上的流媒體指的是使音頻和視頻形成穩定和連續的傳輸流和回放流的一系列技術、方法和協議的總稱,即流媒體技術;狹義上 的流媒體是相對于傳統的下載-回放方式而言的,指的是一種從Internet上獲取音頻和視頻等多媒體數據的新方法,它能夠支持多媒體數據流的實時傳輸和 實時播放。通過運用流媒體技術,服務器能夠向客戶機發送穩定和連續的多媒體數據流,客戶機在接收數據的同時以一個穩定的速率回放,而不用等數據全部下載完 之后再進行回放。
二、流媒體協議
實時傳輸協議(Real- time Transport Protocol,PRT)是在Internet上處理多媒體數據流的一種網絡協議,利用它能夠在一對一(unicast,單播)或者一對多 (multicast,多播)的網絡環境中實現傳流媒體數據的實時傳輸。RTP通常使用UDP來進行多媒體數據的傳輸,但如果需要的話可以使用TCP或者 ATM等其它協議,整個RTP協議由兩個密切相關的部分組成:RTP數據協議和RTP控制協議。實時流協議(Real Time Streaming Protocol,RTSP)最早由Real Networks和Netscape公司共同提出,它位于RTP和RTCP之上,其目的是希望通過IP網絡有效地傳輸多媒體數據。
2.1 RTP數據協議
RTP數據協議負責對流媒體數據進行封包并實現媒體流的實時傳輸,每一個RTP數據報都由頭部(Header)和負載(Payload)兩個部分組成,其中頭部前12個字節的含義是固定的,而負載則可以是音頻或者視頻數據。RTP數據報的頭部格式如圖1所示:
圖1 RTP頭部格式
其中比較重要的幾個域及其意義如下:
CSRC記數(CC) 表示CSRC標識的數目。CSRC標識緊跟在RTP固定頭部之后,用來表
示RTP數據報的來源,RTP協議允許在同一個會話中存在多個數據源,它們可以 通過RTP混合器合并為一個數據源。例如,可以產生一個CSRC列表來表示一個電話會議,該會議通過一個 RTP混合器將所有講話者的語音數據組合為一個RTP數據源。
負載類型(PT) 標明RTP負載的格式,包括所采用的編碼算法、采樣頻率、承載通道等。例如,類型2表明該RTP數據包中承載的是用ITU G.721算法編碼的語音數據,采樣頻率為8000Hz,并且采用單聲道。
序列號 用來為接收方提供探測數據丟失的方法,但如何處理丟失的數據則是應用程序自己的事情,RTP協議本身并不負責數據的重傳。
時間戳 記錄了負載中第一個字節的采樣時間,接收方根據時間戳能夠確定數據的到達是否受到了延遲抖動的影響,但具體如何來補償延遲抖動則是應用程序自己的事情。
從RTP 數據報的格式不難看出,它包含了傳輸媒體的類型、格式、序列號、時間戳以及是否有附加數據等信息,這些都為實時的流媒體傳輸提供了相應的基礎。RTP協議 的目的是提供實時數據(如交互式的音頻和視頻)的端到端傳輸服務,因此在RTP中沒有連接的概念,它可以建立在底層的面向連接或面向非連接的傳輸協議之 上;RTP也不依賴于特別的網絡地址格式,而僅僅只需要底層傳輸協議支持組幀(Framing)和分段(Segmentation)就足夠了;另外RTP 本身還不提供任何可靠性機制,這些都要由傳輸協議或者應用程序自己來保證。在典型的應用場合下,RTP一般是在傳輸協議之上作為應用程序的一部分加以實現的,如圖2所示:
圖2 RTP與各種網絡協議的關系
2.2 RTCP控制協議
RTCP 控制協議需要與RTP數據協議一起配合使用,當應用程序啟動一個RTP會話時將同時占用兩個端口,分別供RTP和RTCP使用。RTP本身并不能為按序傳輸數據包提供可靠的保證,也不提供流量控制和擁塞控制,這些都由RTCP來負責完成。通常RTCP會采用與RTP相同的分發機制,向會話中的所有成員周期性地發送控制信息,應用程序通過接收這些數據,從中獲取會話參與者的相關資料,以及網絡狀況、分組丟失概率等反饋信息,從而能夠對服
務質量進行控制或者對網絡狀況進行診斷。
RTCP協議的功能是通過不同的RTCP數據報來實現的,主要有如下幾種類型:
SR 發送端報告,所謂發送端是指發出RTP數據報的應用程序或者終端,發送端同時也可以是接收端。
RR 接收端報告,所謂接收端是指僅接收但不發送RTP數據報的應用程序或者終端。 SDES 源描述,主要功能是作為會話成員有關標識信息的載體,如用戶名、郵件地址、電話號碼等,此外還具有向會話成員傳達會話控制信息的功能。
BYE 通知離開,主要功能是指示某一個或者幾個源不再有效,即通知會話中的其他成員自己將退出會話。
APP 由應用程序自己定義,解決了RTCP的擴展性問題,并且為協議的實現者提供了很大的靈活性。
RTCP數據報攜帶有服務質量監控的必要信息,能夠對服務質量進行動態的調整,并能夠對網絡擁塞進行有效的控制。由于RTCP數據報采用的是多播方式,因此會話中的所有成員都可以通過RTCP數據報返回的控制信息,來了解其他參與者的當前情況。
在一個典型的應用場合下,發送媒體流的應用程序將周期性地產生發送端報告SR,該RTCP數據報含有不同媒體流間的同步信息,以及已經發送的數據報和字節的計數,接收端根據這些信息可以估計出實際的數據傳輸速率。另一方面,接收端會向所有已知的發送端發送接收端報告RR,該RTCP數據報含有已接收數據報的最大序列號、丟失的數據報數目、延時抖動和時間戳等重要信息,發送端應用根據這些信息可以估計出往返時延,并且可以根據數據報丟失概率和時延抖動情況動態調整發送速率,以改善網絡擁塞狀況,或者根據網絡狀況平滑地調整應用程序的服務質量。
2.3 RTSP實時流協議
作為一個應用層協議,RTSP提供了一個可供擴展的框架,它的意義在于使得實時流媒體數據的受控和點播變得可能。總的說來,RTSP是一個流媒體表示協議, 主要用來控制具有實時特性的數據發送,但它本身并不傳輸數據,而是必須依賴于下層傳輸協議所提供的某些服務。RTSP可以對流媒體提供諸如播放、暫停、快進等操作,它負責定義具體的控制消息、操作方法、狀態碼等,此外還描述了與RTP間的交互操作。
RTSP在制定時較多地參考了 HTTP/1.1協議,甚至許多描述與HTTP/1.1完全相同。RTSP之所以特意使用與HTTP/1.1類似的語法和操作,在很大程度上是為了兼容現 有的Web基礎結構,正因如此,HTTP/1.1的擴展機制大都可以直接引入到RTSP中。
由RTSP控制的媒體流集合可以用表示描述 (Presentation Description)來定義,所謂表示是指流媒體服務器提供給客戶機的一個或者多個媒體流的集合,而表示描述則包含了一個表示中各個媒體流的相關信息,如數據編碼/解碼算法、網絡地址、媒體流的內容等。
雖然RTSP服務器同樣也使用標識符來區別每一流連接會話(Session),但 RTSP連接并沒有被綁定到傳輸層連接(如TCP等),也就是說在整個RTSP連接期間,RTSP用戶可打開或者關閉多個對RTSP服務器的可靠傳輸連接 以發出RTSP 請求。此外,RTSP連接也可以基于面向無連接的傳輸協議(如UDP等)。
RTSP協議目前支持以下操作:
檢索媒體 允許用戶通過HTTP或者其它方法向媒體服務器提交一個表示描述。如表示是組播的,則表示描述就包含用于該媒體流的組播地址和端口號;如果表示是單播的,為了安全在表示描述中應該只提供目的地址。
邀請加入 媒體服務器可以被邀請參加正在進行的會議,或者在表示中回放媒體,或者在表示中錄制全部媒體或其子集,非常適合于分布式教學。
添加媒體 通知用戶新加入的可利用媒體流,這對現場講座來講顯得尤其有用。與HTTP/1.1類似,RTSP請求也可以交由代理、通道或者緩存來進行處理。
參考文檔
三、JRTPlib3.7.1在windows下的編譯步驟
編譯設置過程:
1.解壓jrtplib-3.7.1和jthread-1.2.1 2.用VC打開工程文件jthread.dsw
3. 編譯jrtplib.lib和jthread.lib需要注意VC6要求安裝Vs6sp6,在編譯jrtplib.lib和jthread.lib前,在 project——settings——C/C++——Code generation:use run-time library中,對于debug,選擇:Debug Multithreaded DLL,對于release,則選擇:Multithreaded DLL。
4.首先編譯jthread庫,然后將jthread-1.2.1\src內的"jmutex.h"和"jthread.h"兩個頭文件放入jrtplib-3.7.1\src目錄下,然后將jrtplib-3.7.1\src文件夾下所有頭文件中的<jmutex.h>和<jthread.h>語句修改為"jmutex.h"和"jthread.h",需要修改的文件為rtpudpv4transmitter.h、rtpsession.h和rtppollthread.h。編譯時注意編譯方式和jthread.lib一致。
5.編譯生成的jthread.lib和jrtplib.lib拷貝到系統目錄:C:\Program Files\Microsoft Visual Studio\VC98\Lib下,將jrtplib-3.7.1\src下所有的.h頭文件復制到C:\Program Files\Microsoft Visual Studio\VC98\Include,以便以后使用。
6.現在我們就可以編譯jrtplib-3.7.1\examples下的實例程序了。建立VC工程,打開example1.c,在Project Settings的link頁添加jthread.lib jrtplib.lib ws2_32.lib,在project——settings——C/C++——Code generation:use run-time library中,對于debug,選擇:Debug Multithreaded DLL,對于release,則選擇:Multithreaded DLL。 7.編譯源程序,運行就OK啦
四、JRTPLIB 庫的使用方法及程序實現 (1)JRTPLIB 函數的使用
a、在使用 JRTPLIB 進行實時流媒體數據傳輸之前,首先應該生成 RTPSession 類的一個實例來表示此次 RTP會話,然后調用 Create() 方法來對其進行初始化操作。JRTPLIB-3.7中的Create方法為
Create (sessparams,&transparams)。其中的兩個參數需要如下先定義: RTPUDPv4TransmissionParams transparams; RTPSessionParams sessparams;
sessparams.SetOwnTimestampUnit(1.0/8000.0);/*設置時間戳,1/8000表示1秒鐘采樣8000次,即錄音時的8KHz*/ sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(portbase);/*本地通訊端口*/ b、設置恰當的時戳單元,是 RTP 會話初始化過程所要進行的另外一項重要工作,這是通過調用 RTPSession類的 SetTimestampUnit() 方法來實現的,前面已經提過。
c、當 RTP 會話成功建立起來之后,接下去就可以開始進行流媒體數據的實時傳輸了。首先需要設置好數據發送的目標地址,RTP 協議允許同一會話存在多個目標地址,這可以通過調用 RTPSession 類的AddDestination()、DeleteDestination() 和 ClearDestinations() 方法來完成。例如,下面的語句表示的是讓 RTP 會話將數據發送到本地主機的 6000 端口:
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成