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庫編程使用說明》:?https://blog.csdn.net/qq21497936/article/details/84957120
《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類型,并指定會話的常規選項。必須顯式設置此類的一個參數,否則將無法成功創建會話,此參數是要發送的數據的時間戳單位,可以通過將某個時間間隔(以秒為單位)除以該時間間隔內的樣本數來計算,還可以設置是否接收數據包;
- 第二個參數是指向RTPTransimissionParams實例的指針,并描述傳輸組件的參數,默認情況下,使用UDP over IPv4發送器,對于此特定發送其,傳輸參數應為RTPUDPv4RransmissionParams類型。
? ? ? 如果庫是使用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();// 睡眠100msRTPTime::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
?
總結
以上是生活随笔為你收集整理的JRtplib开发笔记(三):JRtplib库编程使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java集合试题_java集合练习题及答
- 下一篇: 转录组:STAR-Fusion融合基因