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 找不到一些標準的最 基本的...