1. 程式人生 > >JRtplib開發筆記(三):JRtplib庫程式設計使用說明

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型別,並指定會話的常規選項。必須顯式設定此類的一個引數,否則將無法成功建立會話,此引數是要傳送的資料的時間戳單位,可以通過將某個時間間隔(以秒為單位)除以該時間間隔內的樣本數來計算,還可以設定是否接收資料包;
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資料包,然後呼叫銷燬和等待退出,只要呼叫了EndDataAccessAboutWait基本上是立即返回的,秒開秒關。

_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