日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JRtplib开发笔记(三):JRtplib库编程使用说明

發(fā)布時(shí)間:2024/8/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JRtplib开发笔记(三):JRtplib库编程使用说明 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原博主博客地址: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ù)包;
RTPSessionParams sessionparams; // 時(shí)間戳:1秒鐘8000個(gè)樣本 sessionParams.SetOwnTimestampUnit(1.0/8000.0) // 設(shè)置是否接收屬于本身的數(shù)據(jù),true-接收,false-不接收 sessionParams.SetAcceptOwnPackets(true)
  • 第二個(gè)參數(shù)是指向RTPTransimissionParams實(shí)例的指針,并描述傳輸組件的參數(shù),默認(rèn)情況下,使用UDP over IPv4發(fā)送器,對(duì)于此特定發(fā)送其,傳輸參數(shù)應(yīng)為RTPUDPv4RransmissionParams類(lèi)型。
RTPUDPv4TransmissionParams transparams; // 設(shè)置本地接收的端口號(hào) transparams.SetPortbase(8000)

? ? ? 如果庫(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)用了EndDataAccessAboutWait基本上是立即返回的,秒開(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。