1、初始化
在使用 jrtplib 進行實時流**資料傳輸之前,首先應該生成 rtpsession 類的乙個例項來表示此次 rtp 會話。然後呼叫 create() 方法來對其進行初始化操作
rtpsessionparams sessparams;
rtpudpv4transmissionparams transparams;
sessparams.setowntimestampunit(1.0/10.0); //設定時戳傳送頻率
sessparams.setacceptownpackets(true); //設定引數為ture,可以接收自己傳送的流**資料
transparams.setportbase(portbase); //設定進行流**資料傳輸或接收的本主機埠
sess.create(sessparams, &transparams); //建立rtp任務
2、資料傳送
(1)、指定目標位址
rtpipv4address addr(destip, destport); //宣告rtpv4address的物件addr,並初始化(設定目標位址)
sess.adddestination(addr); //指定目標位址
(2)傳送流**資料
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);
(3)、設定傳送資料預設引數
對於同乙個 rtp 會話來講,負載型別、標識和時戳增量通常來講都是相同的,jrtplib 允許將它們設定為會話的預設引數,這是通過呼叫 rtpsession 類的setdefaultpayloadtype()、setdefaultmark() 和 setdefaulttimestampincrement() 方法來完成的。為 rtp 會話設定這些預設引數的好處是可以簡化資料的傳送,例如,如果為 rtp 會話設定了預設引數:
sess.setdefaultpayloadtype(0);
sess.setdefaultmark(false);
sess.setdefaulttimestampincrement(10);
之後在進行資料傳送時只需指明要傳送的資料及其長度就可以了:
sess.sendpacket(buffer, 5);
3、接收或傳送延時
rtptime::wait(rtptime(1,0)); //延時10s;
4、資料接收
(1)、接收函式
對於流**資料的接收端,首先需要呼叫 rtpsession 類的 polldata() 方法來接收傳送過來的 rtp 或者 rtcp 資料報。由於同乙個 rtp 會話中允許有多個參與者(源),你既可以通過呼叫 rtpsession 類的 gotofirstsource() 和 gotonextsource() 方法來遍歷資料來源中的所有資料,也可以通過呼叫 rtpsession 類的 gotofirstsourcewithdata() 和 gotonextsourcewithdata() 方法來遍歷那些攜帶有資料的源。在從 rtp 會話中檢測出有效的資料來源之後,接下去就可以呼叫 rtpsession 類的 getnextpacket() 方法從中抽取 rtp 資料報,當接收到的 rtp 資料報處理完之後,一定要記得及時釋放。下面的**示範了該如何對接收到的 rtp 資料報進行處理:
sess.begindataaccess(); //上鎖,開始接收rtp資料
if (sess.gotofirstsourcewithdata())
} while (sess.gotonextsourcewithdata());
}(2)、接收設定
通過呼叫 rtpsession 類的 setreceivemode() 方法可以設定哪些到達的 rtp 資料報將會被接受或拒絕,其引數有:
receivemode_all 預設的接收模式,所有到達的 rtp 資料報都將被接受;
receivemode_ignoresome 除了某些特定的傳送者之外,所有到達的 rtp 資料報都將被接受,而被拒絕的傳送者列表可以通過呼叫 addtoignorelist()、deletefromignorelist() 和 clearignorelist() 方法來進行設定;
receivemode_acceptsome 除了某些特定的傳送者之外,所有到達的 rtp 資料報都將被拒絕,而被接受的傳送者列表可以通過呼叫 addtoacceptlist ()、deletefromacceptlist 和 clearacceptlist () 方法來進行設定。
6、以下是我根據示例寫的傳送端個接收端的**
傳送端:
#include
#include
#include
#include
using namespace std;
#include "../include/jrtplib3/rtpsession.h"
#include "../include/jrtplib3/rtpudpv4transmitter.h"
#include "../include/jrtplib3/rtpsessionparams.h"
#include "../include/jrtplib3/rtpipv4address.h"
#include "../include/jrtplib3/rtperrors.h"
#include "../include/jrtplib3/rtppacket.h"
int checkerror(int err)
sess.byedestroy(rtptime(10,0),0,0);
return 0;
} 接收端:
#include
#include
#include
#include
using namespace std;
#include "../include/jrtplib3/rtpsession.h"
#include "../include/jrtplib3/rtpudpv4transmitter.h"
#include "../include/jrtplib3/rtpsessionparams.h"
#include "../include/jrtplib3/rtpipv4address.h"
#include "../include/jrtplib3/rtperrors.h"
#include "../include/jrtplib3/rtppacket.h"
int checkerror(int err)
} while (sess.gotonextsourcewithdata());
}sess.enddataaccess();
#ifndef rtp_support_thread
val = sess.poll();
checkerror(val);
#endif // rtp_support_thread
// rtptime::wait(rtptime(1,0));
}sess.byedestroy(rtptime(10,0),0,0);
return 0;
}
rtp程式設計(2)
rtp程式設計 2 半個菸頭 3.3 資料傳送 當rtp會話成功建立起來之後,接下去就可以開始進行流 資料的實時傳輸了。首先需要設定好資料傳送的目標位址,rtp協議允許同一會話存在多個目標位址,這可以通過呼叫rtpsession類的adddestination deletedestination 和...
Linux下RTP程式設計
順序流傳輸 實時流傳輸 實時傳輸協議 real time transport protocol,prt 是在internet上處理多 資料流的一種網路協議,利用它能夠在一對一 unicast,單播 或者一對多 multicast,多播 的網路環境中實現傳流 資料的實時傳輸。rtp通常使用udp來進行...
linux網路程式設計之RTP協議
以下內容取自 本機通訊 協議傳輸 協議傳輸 非本機 關於伺服器ip的傳輸方法 其中的python檔案用於獲取到rtp協議的字段的值,vlc上的流設定 根據獲取到的值來為c程式設計中模擬rtp協議頭 80解析為1000 0000,也就是v 10 也就是值為2 p 0,x 0,cc 0。第四列為遞增的,...