開源RTP庫JRTPLIB 深入淺出2

2021-06-16 07:12:18 字數 4224 閱讀 8561

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系統上執行。由...