Linux下RTP程式設計

2021-08-25 13:39:11 字數 3035 閱讀 7335

順序流傳輸

實時流傳輸

實時傳輸協議(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資料協議

2.2 rtcp控制協議

rtcp 控制協議需要與rtp資料協議一起配合使用,當應用程式啟動乙個rtp會話時將同時占用兩個埠,分別供rtp 和rtcp使用。rtp本身並不能為按序傳輸資料報提供可靠的保證,也不提供流量控制和擁塞控制,這些都由rtcp來負責完成。通常rtcp會採用與 rtp相同的分發機制,向會話中的所有成員周期性地傳送控制資訊,應用程式通過接收這些資料,從中獲取會話參與者的相關資料,以及網路狀況、分組丟失概率等反饋資訊,從而能夠對服務質量進行控制或者對網路狀況進行診斷。

rtcp協議的功能是通過不同的rtcp資料報來實現的,主要有如下幾種型別:

在乙個典型的應用場合下,傳送**流的應用程式將周期性地產生傳送端報告sr,該rtcp資料報含有不同**流間的同步資訊,以及已經傳送的資料報和位元組的計數,接收端根據這些資訊可以估計出實際的資料傳輸速率。另一方面,接收端會向所有已知的傳送端傳送接收端報告rr,該rtcp資料報含有已接收資料報的最大序列號、丟失的資料報數目、延時抖動和時間戳等重要資訊,傳送端應用根據這些資訊可以估計出往返時延,並且可以根據資料報丟失概率和時延抖動情況動態調整傳送速率,以改善網路擁塞狀況,或者根據網路狀況平滑地調整應用程式的服務質量。

2.3 rtsp實時流協議

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請求也可以交由**、通道或者快取來進行處理。

rtp 是目前解決流**實時傳輸問題的最好辦法,如果需要在linux平台上進行實時流**程式設計,可以考慮使用一些開放源**的rtp庫,如librtp、 jrtplib等。jrtplib是乙個物件導向的rtp庫,它完全遵循rfc 1889設計,在很多場合下是乙個非常不錯的選擇,下面就以jrtplib為例,講述如何在linux平台上運用rtp協議進行實時流**程式設計。

3.1 環境搭建

[root@linuxgam src]# bzip2 -dc jrtplib-2.7b.tar.bz2 | tar xvf -

接下去需要對jrtplib進行配置和編譯:

[root@linuxgam src]# cd jrtplib-2.7

[root@linuxgam jrtplib-2.7b]# ./configure

[root@linuxgam jrtplib-2.7b]# make

最後再執行如下命令就可以完成jrtplib的安裝:

[root@linuxgam jrtplib-2.7b]# make install

3.2 初始化

在使用jrtplib進行實時流**資料傳輸之前,首先應該生成rtpsession類的乙個例項來表示此次rtp會話,然後呼叫create()方法來對其進行初始化操作。rtpsession類的create()方法只有乙個引數,用來指明此次rtp會話所採用的埠號。清單1給出了乙個最簡單的初始化框架,它只是完成了rtp會話的初始化工作,還不具備任何實際的功能。

#include "rtpsession.h"

int main(void)

如果rtp會話建立過程失敗,create()方法將會返回乙個負數,通過它雖然可以很容易地判斷出函式呼叫究竟是成功的還是失敗的,但卻很難明白出錯的原因到底什麼。jrtplib採用了統一的錯誤處理機制,它提供的所有函式如果返回負數就表明出現了某種形式的錯誤,而具體的出錯資訊則可以通過呼叫 rtpgeterrorstring()函式得到。rtpgeterrorstring()函式將錯誤**作為引數傳入,然後返回該錯誤**所對應的錯誤資訊。清單2給出了乙個更加完整的初始化框架,它可以對rtp會話初始化過程中所產生的錯誤進行更好的處理:

#include

#include "rtpsession.h"

int main(void)

設定恰當的時戳單元,是rtp會話初始化過程所要進行的另外一項重要工作,這是通過呼叫rtpsession類的 settimestampunit()方法來實現的,該方法同樣也只有乙個引數,表示的是以秒為單元的時戳單元。例如,當使用rtp會話傳輸8000hz 取樣的音訊資料時,由於時戳每秒鐘將遞增8000,所以時戳單元相應地應該被設定成1/8000:

sess.settimestampunit(1.0/8000.0);

RTP程式設計

1 初始化 在使用 jrtplib 進行實時流 資料傳輸之前,首先應該生成 rtpsession 類的乙個例項來表示此次 rtp 會話。然後呼叫 create 方法來對其進行初始化操作 rtpsessionparams sessparams rtpudpv4transmissionparams tr...

linux網路程式設計之RTP協議

以下內容取自 本機通訊 協議傳輸 協議傳輸 非本機 關於伺服器ip的傳輸方法 其中的python檔案用於獲取到rtp協議的字段的值,vlc上的流設定 根據獲取到的值來為c程式設計中模擬rtp協議頭 80解析為1000 0000,也就是v 10 也就是值為2 p 0,x 0,cc 0。第四列為遞增的,...

rtp程式設計(2)

rtp程式設計 2 半個菸頭 3.3 資料傳送 當rtp會話成功建立起來之後,接下去就可以開始進行流 資料的實時傳輸了。首先需要設定好資料傳送的目標位址,rtp協議允許同一會話存在多個目標位址,這可以通過呼叫rtpsession類的adddestination deletedestination 和...