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;
} 文章出處:
基於jrtplib的rtp資料傳送
1.1 初始化 在使用jrtplib進行實時流 資料傳輸之前,首先應該生成rtpsession類的乙個例項來表示此次rtp會話,然後呼叫create 方法來對其進行初始化操作。rtpsession類的create 方法只有乙個引數,用來指明此次rtp會話所採用的埠號。1給出了乙個最簡單的初始化框架,...
基於jrtplib的rtp資料傳送
1.1 初始化 在使用jrtplib進行實時流 資料傳輸之前,首先應該生成rtpsession類的乙個例項來表示此次rtp會話,然後呼叫create 方法來對其進行初始化操作。rtpsession類的create 方法只有乙個引數,用來指明此次rtp會話所採用的埠號。1給出了乙個最簡單的初始化框架,...
JRTPLIB庫arm交叉編譯詳解
系統平台 ubuntu 16.04 開發板 gec6818 arm jrtplib庫 libjrtp.so.3.11.1.tar.gz jthread版本 libjthread.so.1.3.3.tar.gz 本交叉編譯是將rtp接收端放在arm開發板上執行,rtp傳送端在ubuntu系統上執行。由...