生活随笔
收集整理的這篇文章主要介紹了
jrtplib使用笔记
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、簡述
RTP 是目前解決流媒體實(shí)時傳輸問題的最好辦法,而JRTPLIB 是一個用C++語言實(shí)現(xiàn)的RTP庫,包括UDP通訊。剛使用JRTPLIB,對JRTPLIB的理解還不夠深,當(dāng)做使用時,積累的一些經(jīng)驗(yàn)寫個筆記吧。
二、RTP協(xié)議
實(shí)時傳送協(xié)議(Real-time Transport Protocol或簡寫RTP,也可以寫成RTTP)是一個網(wǎng)絡(luò)傳輸協(xié)議,RTP協(xié)議詳細(xì)說明了在互聯(lián)網(wǎng)上傳遞音頻和視頻的標(biāo)準(zhǔn)數(shù)據(jù)包格式。它一開始被設(shè)計(jì)為一個多播協(xié)議,但后來被用在很多單播應(yīng)用中。RTP協(xié)議常用于流媒體系統(tǒng)(配合RTCP協(xié)議或者RTSP協(xié)議)。因?yàn)镽TP自身具有Time stamp所以在ffmpeg 中被用做一種formate。
RTP協(xié)議的詳細(xì)介紹,請參考這篇文章http://www.360doc.com/content/11/1009/15/496343_154624612.shtml
三、RTPSession類
這里不介紹jrtplib的編譯安裝,這個很簡單,網(wǎng)上很多地方都有講解。
jrtplib的使用中,主要是圍繞這個類來實(shí)現(xiàn)的,因此大家有必要去查看源碼,看這類的實(shí)現(xiàn)。為了方便使用,我在這做了RTPSession的繼承封裝,下面直接貼代碼了。
RTPSessionUtils.h
[cpp] ?view plaincopyprint?
#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> ?? ?? ?? #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);?? ????};?? }?? ?? ?? static ?std::string?IPToString( const ?unsigned? int ?iIP)?? {?? ????struct ?in_addr?inaddr;?? ????inaddr.s_addr?=?htonl(iIP);?? ????return ?std::string(inet_ntoa(inaddr));?? }?? ?? ?? static ?unsigned? int ?IPToInt( const ?std::string&?sIP)?? {?? ????return ?inet_addr(sIP.c_str());?? }??
RTPSessionUtils.cpp
[cpp] ?view plaincopyprint?
#include?"RTPSessionUtils.h" ?? ?? namespace ?jrtplib{?? ????RTPSessionUtils::RTPSessionUtils()?? ????{?? #ifdef?WIN32 ?? ????????WSADATA?dat;?? ????????WSAStartup(MAKEWORD(2,2),&dat);?? #endif?//?WIN32 ?? ????}?? ?? ????RTPSessionUtils::~RTPSessionUtils()?? ????{?? #ifdef?WIN32 ?? ????????WSACleanup();?? #endif?//?WIN32 ?? ????}?? ?? ????int ?RTPSessionUtils::CreateDefault(uint16_t?port)?? ????{?? ????????RTPUDPv4TransmissionParams?transparams;?? ????????RTPSessionParams?sessparams;?? ????????sessparams.SetOwnTimestampUnit(1.0/10.0);?? ????????transparams.SetPortbase(port);?? ????????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;?? ????}?? ?? ?????? ????void ?RTPSessionUtils::OnRTPPacket(RTPPacket?*pack, const ?RTPTime?&receivetime,?? ????????const ?RTPAddress?*senderaddress)?? ????{?? ????????std::cout?<<?"OnRTPPacket:?data:" ?<<?pack->GetPayloadData()?<<?std::endl;?? ????}?? ?? ?????? ????void ?RTPSessionUtils::OnRTCPCompoundPacket(RTCPCompoundPacket?*pack, const ?RTPTime?&receivetime,?? ????????const ?RTPAddress?*senderaddress)?? ????{?? ????????std::cout?<<?"OnRTCPCompoundPacket:?data:" ?<<?pack->GetCompoundPacketData()?<<?std::endl;?? ????}?? ?? ?????? ?????? ?????? ?????? ?? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?? ?????? ?? ?????? ?????? ?????? ?????? ?????? ?????? ?????? ?? ?????? ?????? }??
server.cpp
[cpp] ?view plaincopyprint?
#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
[cpp] ?view plaincopyprint?
#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" );?? } ?
總結(jié)
以上是生活随笔 為你收集整理的jrtplib使用笔记 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。