JRtplib開發筆記(三):JRtplib庫程式設計使用說明
原博主部落格地址:https://blog.csdn.net/qq21497936
本文章部落格地址:https://blog.csdn.net/qq21497936/article/details/84957120
《JRtplib開發筆記(一):JRtplib簡介、JThread庫編譯》: https://blog.csdn.net/qq21497936/article/details/84785284
《JRtplib開發筆記(二):JRtplib庫編譯、示例演示》: https://blog.csdn.net/qq21497936/article/details/84785593
《JRtplib開發筆記(三):JRtplib庫程式設計使用說明
《JRtplib開發筆記(四):JRtplib的VS開發環境搭建以及Demo》: https://blog.csdn.net/qq21497936/article/details/84957708
JRtplib開發筆記(三):JRtplib的使用說明
前話
前面編譯了jthread,jrtplib以及解析了原始碼自帶示例,接下來介紹jrtplib的使用。
JRtplib使用說明
步驟一:使用JRtplib類需要先引入命令空間,如下:
using namespcace jrtplib;
步驟二:使用JRtplib需要建立一個RTPSession物件,類似於全域性上下文控制代碼
RTPSession rtpSession;
步驟三:建立會話,您必須呼叫Create成員函式,該函式有兩個引數:
- 第一個引數是RTPSessionParams型別,並指定會話的常規選項。必須顯式設定此類的一個引數,否則將無法成功建立會話,此引數是要傳送的資料的時間戳單位,可以通過將某個時間間隔(以秒為單位)除以該時間間隔內的樣本數來計算,還可以設定是否接收資料包;
RTPSessionParams sessionparams;
// 時間戳:1秒鐘8000個樣本
sessionParams.SetOwnTimestampUnit(1.0/8000.0)
// 設定是否接收屬於本身的資料,true-接收,false-不接收
sessionParams.SetAcceptOwnPackets(true)
- 第二個引數是指向RTPTransimissionParams例項的指標,並描述傳輸元件的引數,預設情況下,使用UDP over IPv4傳送器,對於此特定傳送其,傳輸引數應為RTPUDPv4RransmissionParams型別。
RTPUDPv4TransmissionParams transparams;
// 設定本地接收的埠號
transparams.SetPortbase(8000)
如果庫是使用JThread支援編譯的,則傳入的資料將在後臺處理。如果在編譯時未啟用JThread支援,或者如果您在會話引數中指定不應使用輪詢執行緒,則必須定期呼叫RTPSession成員函式Poll來處理傳入資料並在必要時傳送RTCP資料。
步驟四:加入監聽地址列表
加入地址(包括ip地址和埠號),
- 傳送端
若是傳送端則是傳送的目標地址,點對點發送與多播(組播)傳送操作程式碼不區分:
char destIp [16] = “224.0.0.1”;
int destPort = 10000;
RTPIPv4Address addr(ntohl(inet_addr(destIp)), destPort);
status = sess.AddDestination(addr);
if (status < 0)
{
std::cerr << RTPGetErrorString(status) << std::endl;
exit(-1);
}
- 接收端
若是接收端則是設定本地監聽目標地址,一般是“127.0.0.1”和埠號:
char destIp [16] = “127.0.0.1”;
int destPort = 10000;
RTPIPv4Address addr(ntohl(inet_addr(destIp)), destPort);
status = session.AddDestination(addr);
if (status < 0)
{
std::cerr << RTPGetErrorString(status) << std::endl;
exit(-1);
}
組播則是組播地址+埠號,並且加入組播地址
char groupIp[16] = “224.0.0.1”;
int port = 10000;
RTPIPv4Address addr(ntohl(inet_addr(groupIp)), port);
_rtpSession.JoinMulticastGroup(addr);
步驟五:開始接收/傳送
先使用GotoFirstSourceWidthData獲取收到的資料來源,然後開始迴圈接收,定義資料包的指標RTPpacket,然後進入迴圈接收是否有資料包GetNextPacket有的畫返回非NULL,獲取資料長度和收到的資料,可對資料進行處理,這裡特別注意每次接收完成後需要呼叫DeletePacket對資料包進行刪除,結合了傳送和接收的程式碼如下:
// 開始接收資料
_rtpSession.BeginDataAccess();
if (_rtpSession.GotoFirstSourceWithData())
{
do {
// 資料包指標
RTPPacket *packet;
while ((packet = _rtpSession.GetNextPacket()) != NULL)
{
// 獲取接收資料長度
unsigned int recvSize = packet->GetPayloadLength();
// 獲取接收資料
unsigned char * recvData = (unsigned char *)packet->GetPayloadData();
// 刪除資料包
_rtpSession.DeletePacket(packet);
// 獲取下一個有資料的資料來源(rtp加入監聽地址的源)
} while (_rtpSession.GotoNextSourceWithData());
}
// 關閉接收資料
_rtpSession.EndDataAccess();
// 睡眠100ms
RTPTime::Wait(RTPTime(0, 100));
}
步驟六:退出傳送或者接收
傳送退出記得釋放記憶體即可,但是接收退出有兩點要注意:
第一點是若是開始接收資料BeginDataAccess一定要呼叫EndDataAccess否則不會關掉jthread執行緒,不會馬上退出,退出不了也就無法重新Create
第二點是接收了資料包則一定要呼叫DeletePacket資料包,然後呼叫銷燬和等待退出,只要呼叫了EndDataAccess,AboutWait基本上是立即返回的,秒開秒關。
_rtpSession.Destroy();
_rtpSession.AbortWait();
JRtplib模組化
編譯的靜態庫,不然在呼叫該庫執行的時候根據windows sdk版本問題,導致直接執行無反應,避免這些坑直接使用靜態庫,帶”_d”的是debug版本的庫。
《JRtplib開發筆記(一):JRtplib簡介、JThread庫編譯》: https://blog.csdn.net/qq21497936/article/details/84785284
《JRtplib開發筆記(二):JRtplib庫編譯、示例演示》: https://blog.csdn.net/qq21497936/article/details/84785593
《JRtplib開發筆記(三):JRtplib庫程式設計使用說明》: https://blog.csdn.net/qq21497936/article/details/84957120
《JRtplib開發筆記(四):JRtplib的VS開發環境搭建以及Demo》: https://blog.csdn.net/qq21497936/article/details/84957708
原博主部落格地址:https://blog.csdn.net/qq21497936
本文章部落格地址:https://blog.csdn.net/qq21497936/article/details/84957120