JRtplib开发笔记(三):JRtplib库编程使用说明
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84957120
《JRtplib開(kāi)發(fā)筆記(一):JRtplib簡(jiǎn)介、JThread庫(kù)編譯》:?https://blog.csdn.net/qq21497936/article/details/84785284
《JRtplib開(kāi)發(fā)筆記(二):JRtplib庫(kù)編譯、示例演示》:?https://blog.csdn.net/qq21497936/article/details/84785593
《JRtplib開(kāi)發(fā)筆記(三):JRtplib庫(kù)編程使用說(shuō)明》:?https://blog.csdn.net/qq21497936/article/details/84957120
《JRtplib開(kāi)發(fā)筆記(四):JRtplib的VS開(kāi)發(fā)環(huán)境搭建以及Demo》:?https://blog.csdn.net/qq21497936/article/details/84957708
?
? ? ? ? ? JRtplib開(kāi)發(fā)筆記(三):JRtplib的使用說(shuō)明
?
前話(huà)
? ? ? ? 前面編譯了jthread,jrtplib以及解析了源碼自帶示例,接下來(lái)介紹jrtplib的使用。
?
JRtplib使用說(shuō)明
步驟一:使用JRtplib類(lèi)需要先引入命令空間,如下:
using namespcace jrtplib;步驟二:使用JRtplib需要?jiǎng)?chuàng)建一個(gè)RTPSession對(duì)象,類(lèi)似于全局上下文句柄
RTPSession rtpSession;步驟三:創(chuàng)建會(huì)話(huà),您必須調(diào)用Create成員函數(shù),該函數(shù)有兩個(gè)參數(shù):
- 第一個(gè)參數(shù)是RTPSessionParams類(lèi)型,并指定會(huì)話(huà)的常規(guī)選項(xiàng)。必須顯式設(shè)置此類(lèi)的一個(gè)參數(shù),否則將無(wú)法成功創(chuàng)建會(huì)話(huà),此參數(shù)是要發(fā)送的數(shù)據(jù)的時(shí)間戳單位,可以通過(guò)將某個(gè)時(shí)間間隔(以秒為單位)除以該時(shí)間間隔內(nèi)的樣本數(shù)來(lái)計(jì)算,還可以設(shè)置是否接收數(shù)據(jù)包;
- 第二個(gè)參數(shù)是指向RTPTransimissionParams實(shí)例的指針,并描述傳輸組件的參數(shù),默認(rèn)情況下,使用UDP over IPv4發(fā)送器,對(duì)于此特定發(fā)送其,傳輸參數(shù)應(yīng)為RTPUDPv4RransmissionParams類(lèi)型。
? ? ? 如果庫(kù)是使用JThread支持編譯的,則傳入的數(shù)據(jù)將在后臺(tái)處理。如果在編譯時(shí)未啟用JThread支持,或者如果您在會(huì)話(huà)參數(shù)中指定不應(yīng)使用輪詢(xún)線程,則必須定期調(diào)用RTPSession成員函數(shù)Poll來(lái)處理傳入數(shù)據(jù)并在必要時(shí)發(fā)送RTCP數(shù)據(jù)。
?
步驟四:加入監(jiān)聽(tīng)地址列表
加入地址(包括ip地址和端口號(hào)),
- 發(fā)送端
若是發(fā)送端則是發(fā)送的目標(biāo)地址,點(diǎn)對(duì)點(diǎn)發(fā)送與多播(組播)發(fā)送操作代碼不區(qū)分:
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); }- 接收端
若是接收端則是設(shè)置本地監(jiān)聽(tīng)目標(biāo)地址,一般是“127.0.0.1”和端口號(hào):
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); }組播則是組播地址+端口號(hào),并且加入組播地址
char groupIp[16] = “224.0.0.1”; int port = 10000; RTPIPv4Address addr(ntohl(inet_addr(groupIp)), port); _rtpSession.JoinMulticastGroup(addr);步驟五:開(kāi)始接收/發(fā)送
? ? ? ? 先使用GotoFirstSourceWidthData獲取收到的數(shù)據(jù)源,然后開(kāi)始循環(huán)接收,定義數(shù)據(jù)包的指針RTPpacket,然后進(jìn)入循環(huán)接收是否有數(shù)據(jù)包GetNextPacket有的畫(huà)返回非NULL,獲取數(shù)據(jù)長(zhǎng)度和收到的數(shù)據(jù),可對(duì)數(shù)據(jù)進(jìn)行處理,這里特別注意每次接收完成后需要調(diào)用DeletePacket對(duì)數(shù)據(jù)包進(jìn)行刪除,結(jié)合了發(fā)送和接收的代碼如下:
// 開(kāi)始接收數(shù)據(jù) _rtpSession.BeginDataAccess(); if (_rtpSession.GotoFirstSourceWithData()) {do {// 數(shù)據(jù)包指針RTPPacket *packet;while ((packet = _rtpSession.GetNextPacket()) != NULL){// 獲取接收數(shù)據(jù)長(zhǎng)度unsigned int recvSize = packet->GetPayloadLength();// 獲取接收數(shù)據(jù)unsigned char * recvData = (unsigned char *)packet->GetPayloadData();// 刪除數(shù)據(jù)包_rtpSession.DeletePacket(packet);// 獲取下一個(gè)有數(shù)據(jù)的數(shù)據(jù)源(rtp加入監(jiān)聽(tīng)地址的源)} while (_rtpSession.GotoNextSourceWithData());}// 關(guān)閉接收數(shù)據(jù)_rtpSession.EndDataAccess();// 睡眠100msRTPTime::Wait(RTPTime(0, 100)); }步驟六:退出發(fā)送或者接收
? ? ? ? 發(fā)送退出記得釋放內(nèi)存即可,但是接收退出有兩點(diǎn)要注意:
? ? ? ?第一點(diǎn)是若是開(kāi)始接收數(shù)據(jù)BeginDataAccess一定要調(diào)用EndDataAccess否則不會(huì)關(guān)掉jthread線程,不會(huì)馬上退出,退出不了也就無(wú)法重新Create
? ? ? ? 第二點(diǎn)是接收了數(shù)據(jù)包則一定要調(diào)用DeletePacket數(shù)據(jù)包,然后調(diào)用銷(xiāo)毀和等待退出,只要調(diào)用了EndDataAccess,AboutWait基本上是立即返回的,秒開(kāi)秒關(guān)。
_rtpSession.Destroy(); _rtpSession.AbortWait();?
JRtplib模塊化
? ? ??
?????? 編譯的靜態(tài)庫(kù),不然在調(diào)用該庫(kù)運(yùn)行的時(shí)候根據(jù)windows sdk版本問(wèn)題,導(dǎo)致直接運(yùn)行無(wú)反應(yīng),避免這些坑直接使用靜態(tài)庫(kù),帶”_d”的是debug版本的庫(kù)。
?
《JRtplib開(kāi)發(fā)筆記(一):JRtplib簡(jiǎn)介、JThread庫(kù)編譯》:?https://blog.csdn.net/qq21497936/article/details/84785284
《JRtplib開(kāi)發(fā)筆記(二):JRtplib庫(kù)編譯、示例演示》:?https://blog.csdn.net/qq21497936/article/details/84785593
《JRtplib開(kāi)發(fā)筆記(三):JRtplib庫(kù)編程使用說(shuō)明》:?https://blog.csdn.net/qq21497936/article/details/84957120
《JRtplib開(kāi)發(fā)筆記(四):JRtplib的VS開(kāi)發(fā)環(huán)境搭建以及Demo》:?https://blog.csdn.net/qq21497936/article/details/84957708
?
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84957120
?
總結(jié)
以上是生活随笔為你收集整理的JRtplib开发笔记(三):JRtplib库编程使用说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java集合试题_java集合练习题及答
- 下一篇: 转录组:STAR-Fusion融合基因