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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jrtplib使用注意事项

發(fā)布時間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jrtplib使用注意事项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、說明

RTP 現(xiàn)在的問題是要解決的流媒體的實時傳輸?shù)膯栴}的最佳方法。和JRTPLIB 是一個用C++語言實現(xiàn)的RTP庫。包含UDP通訊。剛使用JRTPLIB,對JRTPLIB的理解還不夠深,當做使用時,積累的一些經(jīng)驗寫個筆記吧。

二、RTP協(xié)議

實時傳送協(xié)議(Real-time Transport Protocol或簡寫RTP,也能夠寫成RTTP)是一個網(wǎng)絡傳輸協(xié)議,RTP協(xié)議具體說明了在互聯(lián)網(wǎng)上傳遞音頻和視頻的標準數(shù)據(jù)包格式。它一開始被設計為一個多播協(xié)議。但后來被用在非常多單播應用中。

RTP協(xié)議經(jīng)常使用于流媒體系統(tǒng)(配合RTCP協(xié)議或者RTSP協(xié)議)。由于RTP自身具有Time stamp所以在ffmpeg 中被用做一種formate。

RTP協(xié)議的具體介紹,請參考這篇文章http://www.360doc.com/content/11/1009/15/496343_154624612.shtml

三、RTPSession類

這里不介紹jrtplib的編譯安裝。這個非常easy,網(wǎng)上非常多地方都有解說。

jrtplib的使用中,主要是環(huán)繞這個類來實現(xiàn)的,因此大家有必要去查看源代碼,看這類的實現(xiàn)。為了方便使用,我在這做了RTPSession的繼承封裝。以下直接貼代碼了。

RTPSessionUtils.h

#include "rtpsession.h" #include "rtppacket.h" #include "rtpudpv4transmitter.h" #include "rtpipv4address.h" #include "rtpsessionparams.h" #include "rtperrors.h" #ifndef WIN32 #include <netinet/in.h> #include <arpa/inet.h> #else #include <winsock2.h> #endif // WIN32 #include "rtpsourcedata.h" #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string>//jrtplib應用需鏈接的lib #pragma comment(lib,"ws2_32.lib") #pragma comment(lib, "jrtplib_d.lib") #pragma comment(lib,"jthread_d.lib")namespace jrtplib {class RTPSessionUtils : public RTPSession{typedef RTPSession base_type;public:RTPSessionUtils();~RTPSessionUtils();int AddDestination(const std::string& ip, uint16_t port);int DeleteDestination(const std::string& ip, uint16_t port);int CreateDefault(uint16_t port);protected:void OnNewSource(RTPSourceData *dat);void OnBYEPacket(RTPSourceData *dat);void OnRemoveSource(RTPSourceData *dat);void OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime,const RTPAddress *senderaddress);void OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,const RTPAddress *senderaddress);void OnPollThreadStep();private:int GetAddrFromSource(RTPSourceData *dat, uint32_t& ip, uint16_t& port);}; }//整形的ip轉成字符串ip static std::string IPToString(const unsigned int iIP) {struct in_addr inaddr;inaddr.s_addr = htonl(iIP);return std::string(inet_ntoa(inaddr)); }//字符串ip轉成整形ip static unsigned int IPToInt(const std::string& sIP) {return inet_addr(sIP.c_str()); }
RTPSessionUtils.cpp

#include "RTPSessionUtils.h"namespace jrtplib{RTPSessionUtils::RTPSessionUtils(){ #ifdef WIN32WSADATA dat;WSAStartup(MAKEWORD(2,2),&dat); #endif // WIN32}RTPSessionUtils::~RTPSessionUtils(){ #ifdef WIN32WSACleanup(); #endif // WIN32}int RTPSessionUtils::CreateDefault(uint16_t port){RTPUDPv4TransmissionParams transparams;RTPSessionParams sessparams;sessparams.SetOwnTimestampUnit(1.0/10.0);//必須設置transparams.SetPortbase(port);//port必須是偶數(shù)return base_type::Create(sessparams, &transparams);base_type::SetDefaultPayloadType(0);base_type::SetDefaultTimestampIncrement(0);base_type::SetDefaultMark(false);}int RTPSessionUtils::AddDestination(const std::string& ip, uint16_t port){return base_type::AddDestination(RTPIPv4Address(ntohl(inet_addr(ip.c_str())), port));}int RTPSessionUtils::DeleteDestination(const std::string& ip, uint16_t port){return base_type::DeleteDestination(RTPIPv4Address(ntohl(inet_addr(ip.c_str())), port));}int RTPSessionUtils::GetAddrFromSource(RTPSourceData *dat, uint32_t& ip, uint16_t& port){if (dat->IsOwnSSRC())return -1;if (dat->GetRTPDataAddress() != 0){const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTPDataAddress());ip = addr->GetIP();port = addr->GetPort();}else if (dat->GetRTCPDataAddress() != 0){const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTCPDataAddress());ip = addr->GetIP();port = addr->GetPort()-1;}return 0;}void RTPSessionUtils::OnNewSource(RTPSourceData *dat){uint32_t ip;uint16_t port;if (GetAddrFromSource(dat, ip, port))return;RTPIPv4Address dest(ip,port);base_type::AddDestination(dest);std::cout << "OnNewSource Adding destination " << IPToString(ip) << ":" << port << std::endl;}void RTPSessionUtils::OnRemoveSource(RTPSourceData *dat){if (dat->ReceivedBYE())return;uint32_t ip;uint16_t port;if (GetAddrFromSource(dat, ip, port))return;RTPIPv4Address dest(ip,port);base_type::DeleteDestination(dest);std::cout << "OnRemoveSource Deleting destination " << IPToString(ip) << ":" << port << std::endl;}void RTPSessionUtils::OnBYEPacket(RTPSourceData *dat){uint32_t ip;uint16_t port;if (GetAddrFromSource(dat, ip, port))return;RTPIPv4Address dest(ip,port);base_type::DeleteDestination(dest);std::cout << "OnBYEPacket Deleting destination " << IPToString(ip) << ":" << port << std::endl;}//僅僅要有rtp包就會觸發(fā)void RTPSessionUtils::OnRTPPacket(RTPPacket *pack,const RTPTime &receivetime,const RTPAddress *senderaddress){std::cout << "OnRTPPacket: data:" << pack->GetPayloadData() << std::endl;}//收到rtcp包觸發(fā)void RTPSessionUtils::OnRTCPCompoundPacket(RTCPCompoundPacket *pack,const RTPTime &receivetime,const RTPAddress *senderaddress){std::cout << "OnRTCPCompoundPacket: data:" << pack->GetCompoundPacketData() << std::endl;}//隔段時間就會觸發(fā),也能夠用于收包回調(diào)函數(shù)//void RTPSessionUtils::OnPollThreadStep()//{// BeginDataAccess();// // check incoming packets// if (GotoFirstSourceWithData())// {// do// {// RTPPacket *pack;// RTPSourceData *srcdat;// srcdat = GetCurrentSourceInfo();// while ((pack = GetNextPacket()) != NULL)// {// std::cout << "Got packet " << pack->GetExtendedSequenceNumber() << " from SSRC " << srcdat->GetSSRC() << std::endl;// DeletePacket(pack);// }// } while (GotoNextSourceWithData());// }// EndDataAccess();//} }
server.cpp

#include <iostream> #include "RTPSessionUtils.h" using namespace jrtplib; void main() {int status;RTPSessionUtils sess;status = sess.CreateDefault(8888);if(status){std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;return;}while (1){std::string buf;std::cout << "Input send data:" ;std::cin >> buf;sess.SendPacket((void*)buf.c_str(), buf.length(), 0, false, 0);if(status){std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;continue;}}system("pause"); }

client.cpp

#include <iostream> #include "RTPSessionUtils.h" using namespace jrtplib;void main() {int status;RTPSessionUtils sess;status = sess.CreateDefault(6666);if(status){std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;return;}status = sess.AddDestination("127.0.0.1", 8888);if(status){std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;return;}while (1){std::string buf;std::cout << "Input send data:" ;std::cin >> buf;sess.SendPacket((void*)buf.c_str(), buf.length(), 0, false, 0);if(status){std::cout << "RTP error:" << RTPGetErrorString(status) << std::endl;continue;}}system("pause"); }

轉載于:https://www.cnblogs.com/hrhguanli/p/4565530.html

總結

以上是生活随笔為你收集整理的jrtplib使用注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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