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

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

生活随笔

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

编程问答

jrtplib使用笔记

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

一、簡(jiǎn)述

RTP 是目前解決流媒體實(shí)時(shí)傳輸問(wèn)題的最好辦法,而JRTPLIB 是一個(gè)用C++語(yǔ)言實(shí)現(xiàn)的RTP庫(kù),包括UDP通訊。剛使用JRTPLIB,對(duì)JRTPLIB的理解還不夠深,當(dāng)做使用時(shí),積累的一些經(jīng)驗(yàn)寫個(gè)筆記吧。

二、RTP協(xié)議

實(shí)時(shí)傳送協(xié)議(Real-time Transport Protocol或簡(jiǎn)寫RTP,也可以寫成RTTP)是一個(gè)網(wǎng)絡(luò)傳輸協(xié)議,RTP協(xié)議詳細(xì)說(shuō)明了在互聯(lián)網(wǎng)上傳遞音頻和視頻的標(biāo)準(zhǔn)數(shù)據(jù)包格式。它一開始被設(shè)計(jì)為一個(gè)多播協(xié)議,但后來(lái)被用在很多單播應(yīng)用中。RTP協(xié)議常用于流媒體系統(tǒng)(配合RTCP協(xié)議或者RTSP協(xié)議)。因?yàn)镽TP自身具有Time stamp所以在ffmpeg 中被用做一種formate。

RTP協(xié)議的詳細(xì)介紹,請(qǐng)參考這篇文章http://www.360doc.com/content/11/1009/15/496343_154624612.shtml

三、RTPSession類

這里不介紹jrtplib的編譯安裝,這個(gè)很簡(jiǎn)單,網(wǎng)上很多地方都有講解。

jrtplib的使用中,主要是圍繞這個(gè)類來(lái)實(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>??
  • ??
  • //jrtplib應(yīng)用需鏈接的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轉(zhuǎn)成字符串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轉(zhuǎn)成整形ip??
  • 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);//必須設(shè)置??
  • ????????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包就會(huì)觸發(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;??
  • ????}??
  • ??
  • ????//隔段時(shí)間就會(huì)觸發(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

    [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使用笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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