基於jrtplib的rtp資料傳送

2021-06-02 09:59:26 字數 2435 閱讀 4601

1.1 初始化

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

**1:initial.cpp

#include "rtpsession.h" int main(void)

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

**2:framework.cpp

#include #include "rtpsession.h" int main(void)

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

sess.settimestampunit(1.0/8000.0);

1.2 資料傳送

當rtp會話成功建立起來之後,接下去就可以開始進行流**資料的實時傳輸了。首先需要設定好資料傳送的目標位址,rtp協議允許同一會話存在多個目標位址,這可以通過呼叫rtpsession類的adddestination()、deletedestination()和cleardestinations()方法來完成。例如,下面的語句表示的是讓rtp會話將資料傳送到本地主機的6000埠:

unsigned long addr = ntohl(inet_addr("127.0.0.1")); sess.adddestination(addr, 6000);

目標位址全部指定之後,接著就可以呼叫rtpsession類的sendpacket()方法,向所有的目標位址傳送流**資料。sendpacket()是rtpsession類提供的乙個過載函式,它具有下列多種形式:

int sendpacket(void *data,int len) int sendpacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc) int sendpacket(void *data,int len,unsigned short hdrextid,void *hdrextdata,int numhdrextwords) int sendpacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc, unsigned short hdrextid,void *hdrextdata,int numhdrextwords)

sendpacket()最典型的用法是類似於下面的語句,其中第乙個引數是要被傳送的資料,而第二個引數則指明將要傳送資料的長度,再往後依次是rtp負載型別、標識和時戳增量。

sess.sendpacket(buffer, 5, 0, false, 10);

對於同乙個rtp會話來講,負載型別、標識和時戳增量通常來講都是相同的,jrtplib允許將它們設定為會話的預設引數,這是通過呼叫rtpsession類的setdefaultpayloadtype()、setdefaultmark()和setdefaulttimestampincrement()方法來完成的。為rtp會話設定這些預設引數的好處是可以簡化資料的傳送,例如,如果為rtp會話設定了預設引數:

sess.setdefaultpayloadtype(0); sess.setdefaultmark(false); sess.setdefaulttimestampincrement(10);

之後在進行資料傳送時只需指明要傳送的資料及其長度就可以了:

sess.sendpacket(buffer, 5);

基於jrtplib的rtp資料傳送

1.1 初始化 在使用jrtplib進行實時流 資料傳輸之前,首先應該生成rtpsession類的乙個例項來表示此次rtp會話,然後呼叫create 方法來對其進行初始化操作。rtpsession類的create 方法只有乙個引數,用來指明此次rtp會話所採用的埠號。1給出了乙個最簡單的初始化框架,...

開源RTP庫JRTPLIB 深入淺出2

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

linux下基於jrtplib庫的實時傳送實現

cc c cflags incl o 表示目標的完整名字 表示第乙個依賴檔案的名字 b 編譯 假設傳送和接收程式分別放在 tmp send和 tmp receive目錄下 cd tmp send make cd tmp receive make 四 易出錯誤及注意問題 1 找不到一些標準的最 基本的...