VS2010编译jrtp.docx_第1页
VS2010编译jrtp.docx_第2页
VS2010编译jrtp.docx_第3页
VS2010编译jrtp.docx_第4页
VS2010编译jrtp.docx_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

随笔- 180 文章- 0 评论- 260【流媒體】jrtplibVS2010 下RTP开源协议库JRTPLIB3.9.1编译【流媒體】jrtplibVS2010下RTP开源协议库JRTPLIB3.9.1编译SkySeraph Apr7th 2012Email: QQ:452728574一、JRTPLIB简介老外用C+编写的开源RTP协议库,用来进行实时数据传输,可以运行在 Windows、Linux、 FreeBSD、Solaris、Unix和VxWorks 等多种操作系统上,主页为:http:/research.edm.uhasselt.be/jori/page/index.php?n=Main.HomePage二、相关下载jrtplib:http:/research.edm.uhasselt.be/jori/page/index.php?n=CS.Jrtplibjthread: http:/research.edm.uhasselt.be/jori/page/index.php?n=CS.Jthreadcmake:/cmake/resources/software.html三、 编译步骤1下载jrtplib和jthread并解压缩。阅读README。2编译jthread生成jthread.lib和jthread_d.lib。 打开cmake,添加好输入(where.)和输出路径(where to.),完成configure配置(选visual studio 10),配置结果如下图: 点击generate,生成VS2010工程文件 打开工程文件并编译,在debug和release下分别生成jthread.lib和jthread_d.lib编译的具体方法为:选择Solution Explorer里的 Solutionjthread,点右键,运行Rebuild Solution;如编译无错误,再选择INSTALL项目,运行Build。 如果编译成功(如下图),会在C:Program Filesjthread的includejthread下生成头文件;在lib下生成lib和cmake文件 温馨提示:在win7下,你必须拥有管理者权限,否则编译不会通过,因为无法在C:Program Files创建jthread文件,当然你可以手动创建。3 编译jrtplib生成jrtplib.lib和jrtplib_d.lib。 同2-,其中configure会稍微麻烦一些,详细配置结果如下: 点击generate,生成VS2010工程文件 打开工程文件并编译,在debug和release下分别生成jrtplib_d.lib和jrtplib.lib编译成功(如下图),在C:Program Filesjrtplib下includejrtplib3下会生成一堆头文件;在lib下会生成jrtplib_d.lib和jrtplib.lib以及cmake文件说明:网上提到的一些用VS2008和VC6.0方法中提到了两个细节: 一是要把jmutex.h和jthread.h两个头文件放入jrtplib/src目录下,二是要把src文件夹下所有头文件中的和语句修改为jmutex.h和jthread.h。 我在编译时没有处理这两个细节成功了,后续调试出现相应问题相应修改一下即可。四、 使用实例1添加库步骤一:方法1. 将编译生成的jrtplib.lib和jthread.lib库拷贝到“*:Program FilesMicrosoft Visual Studio 10.0VClib”下面方法2. 将编译生成的四个lib库库拷贝到当前工程的cpp文件下步骤二:方法1. 菜单“项目-属性-配置属性-连接器-输入-附加依赖项”里填写“jrtplib.lib;jthread.lib;WS2_32.lib”方法2. pragma方式,在stdafx.h文件中 添加#ifdef DEBUG #pragma comment(lib, jrtplib_d.lib) #pragma comment(lib,jthread_d.lib) #pragma comment(lib,WS2_32.lib)#else #pragma comment(lib, jrtplib.lib) #pragma comment(lib,jthread.lib) #pragma comment(lib,WS2_32.lib)#endif2添加头文件步骤一:将所有的.h文件放到一起,如myJRTPLIBHeader里面,再添加include步骤二:方法1.“项目-属性-配置属性-C/C+-常规-附加包含目录”方法2.“工具-选项-项目和解决方案-C+ 目录”,选择对应平台,然后添加所需“包括文件”目录(此法VS2010不通)3 测试代码(sample1)cpp文件:/ jrtplibTest.cpp : 定义控制台应用程序的入口点。/#include stdafx.h/ 头文件#include rtpsession.h#include rtpudpv4transmitter.h#include rtpipv4address.h#include rtpsessionparams.h#include rtperrors.h#ifndef WIN32#include #include #else#include #endif / WIN32#include #include #include #include using namespace jrtplib;/ This function checks if there was a RTP error. If so, it displays an error/ message and exists./void checkerror(int rtperr) if (rtperr 0) std:cout ERROR: RTPGetErrorString(rtperr) std:endl; exit(-1); / The main routine/int main(void)#ifdef WIN32 WSADATA dat; WSAStartup(MAKEWORD(2,2),&dat);#endif / WIN32 RTPSession sess; uint16_t portbase,destport; uint32_t destip; std:string ipstr; int status,i,num; / First, well ask for the necessary information std:cout Enter local portbase: portbase; std:cout std:endl; std:cout Enter the destination IP address ipstr; / 获得接收端的IP地址和端口号 destip = inet_addr(ipstr.c_str(); if (destip = INADDR_NONE) std:cerr Bad IP address specified std:endl; return -1; / The inet_addr function returns a value in network byte order, but / we need the IP address in host byte order, so we use a call to / ntohl destip = ntohl(destip); std:cout Enter the destination port destport; std:cout std:endl; std:cout Number of packets you wish to be sent: num; / Now, well create a RTP session, set the destination, send some / packets and poll for incoming data. RTPUDPv4TransmissionParams transparams; RTPSessionParams sessparams; / IMPORTANT: The local timestamp unit MUST be set, otherwise / RTCP Sender Report info will be calculated wrong / In this case, well be sending 10 samples each second, so well / put the timestamp unit to (1.0/10.0) sessparams.SetOwnTimestampUnit(1.0/10.0); sessparams.SetAcceptOwnPackets(true); transparams.SetPortbase(portbase); / 创建RTP会话 status = sess.Create(sessparams,&transparams); checkerror(status); RTPIPv4Address addr(destip,destport); / 指定RTP数据接收端 status = sess.AddDestination(addr); checkerror(status); for (i = 1 ; i = num ; i+) printf(nSending packet %d/%dn,i,num); / send the packet status = sess.SendPacket(void *)1234567890,10,0,false,10); checkerror(status); sess.BeginDataAccess(); / check incoming packets if (sess.GotoFirstSourceWithData() do RTPPacket *pack; while (pack = sess.GetNextPacket() != NULL) / You can examine the data here printf(Got packet !n); / we dont longer need the packet, so / well delete it sess.DeletePacket(pack); while (sess.GotoNextSourceWithData(); sess.EndDataAccess();#ifndef RTP_SUPPORT_THREAD status = sess.Poll(); checkerror(status);#endif / RTP_SUPPORT_THREAD RTPTime:Wait(RTPTime(1,0); sess.BYEDestroy(RTPTime(10,0),0,0);#ifdef WIN32 WSACleanup();#endif / WIN32 return 0;4 下载在VS2010+Win7下编译好的JRTPLIB库及相关头文件下载:(刚传CSDN,现在打不开,等等,明天补上.)补充:下载(猛击)Ref/Related1http:/research.edm.uhasselt.be/jori/page/index.php?n=CS.Jrtplib2http:/research.edm.uhasselt.be/jori/jrtplib/documentation/index.html3/nickche300/article/details/64080994/sunloverain2/article/details/53986945/aaronalan/article/details/5153604作者:skyseraph出处:/skyseraph/Email/GTalk: QQ:452728574本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。关于开源的RTPjrtplib的使用(2)分类:DirectShow2007-07-13 18:448456人阅读评论(12)收藏举报关于开源的RTPjrtplib的使用(2)这段时间在研究RTP,好几天了,今天又来总结一下。关于jrtplib环境的建立,可以见我以前写的总结,现在我主要来谈谈jrtplib3.71下的几个example的学习。一、sample是一个简单的IPv4的列子,它实现了RTP在本机上的数据的传输。1、初始化。我们知道RTP是通常是使用UDP协议来实现数据的传输,在windows环境下,当然要用到我们熟悉的套接字的使用,所以我们先要进行初始化,加载套接字库。cppview plaincopyprint?1. #ifdefWIN322. WSADATAdat;3. WSAStartup(MAKEWORD(2,2),&dat);4. #endif/WIN325. RTPSessionsess;6. 7. /当然在我们程序结束的时候,我们要清理套接字库。8. #ifdefWIN329. WSACleanup();10. #endif/WIN3211. 12. /还有关于头文件,我们需要用到以下一些:13. #includertpsession.h/定义了RTPSession14. #includertppacket.h/定义了RTPPacket数据包15. #includertpudpv4transmitter.h/定义了RTPSession的第二个参数16. /RTPUDPv4TransmissionParams17. #includertpipv4address.h/定义了rtpipv4address18. #includertpsessionparams.h/定义了RTPSession的第一个参数19. /RTPSessionParams20. #includertperrors.h/定义了RTP中的错误信息21. 22. /获得出错信息,我们在使用时不可避免地要出错,故我们可以通过/jrtplib的函数来获得我们出错的信息,方法如下:23. voidcheckerror(intrtperr)24. 25. if(rtperr0)26. 27. std:coutERROR:RTPGetErrorString(rtperr)std:endl;28. exit(-1);29. 30. 函数RTPGetErrorString()根据出错返回的一个负数来判断,利用jrtplib采用的统一出错机制返回的是一个C+中标准的字符串std:string,表示出错的信息,比喻我们指定的Portbase不是一个偶数。(为什么,以下要讲)2、关于RTPSession对象设置由于要使用套接字,故我们在使用之前一定要为我们的监听socket指定一个监听端口,也就是这里的portbase的值。我们可以通过调用RTPSession的第二个参数RTPUDPv4TransmissionParams的成员函数来设定, transparams.SetPortbase(portbase);还有就是我们要通过RTPSession的第一个参数来设定以下一些值:sessparams.SetOwnTimestampUnit(1.0/10.0);/注意这个值我们一定要设置,The local timestamp unit MUST be set, otherwise/RTCP Sender Report info will be calculated wrong, In this case, well be sending/10 samples each second, so well put the timestamp unit to (1.0/10.0)/设置时间戳是一件很重要的事情,是RTP会话初始化过程所要进行的另外一项重要工/作,他的单位是秒,如:当使用RTP会话传输8000Hz采样的音频数据时,由于时戳/每秒钟将递增8000,所以时戳单元相应地应该被设置成1/8000:sessparams.SetAcceptOwnPackets(true);/通过这个函数我们可以设置是不是接收我们自定义的数据包。3、数据发送我想当我们要想建立连接的时候,我们就要让发送端知道要发送到的主机的IP地址,在jrtplib中我们可以通过RTPSession成员函数AddDestination()、DeleteDestination()和 ClearDestinations()来完成。如下面是将数据发送给本机的6000号端口:unsigned long addr = ntohl(inet_addr();sess.AddDestination(addr, 6000);当然我们还可以这样来完成加入一个客户端,RTPIPv4Address addr(destip,destport);/destip为客户端IP地址,destport为客户端/端口号status = sess.AddDestination(addr);checkerror(status);目标地址全部指定之后,接着就可以调用RTPSession类的SendPacket()方法,向所有的目标地址发送流媒体数据。SendPacket()是RTPSession类提供的一个重载函数,它具有下列多种形式:int SendPacket(void *data,int len)int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc)int SendPacket(void *data,int len,unsigned short hdrextID,void *hdrextdata,int numhdrextwords)int SendPacket(void *data,int len,unsigned char pt,bool mark,unsigned long timestampinc,unsigned short hdrextID,void *hdrextdata,int numhdrextwords)SendPacket()最典型的用法是类似于下面的语句,其中第一个参数是要被发送的数据,而第二个参数则指明将要发送数据的长度,再往后依次是RTP负载类型、标识和时戳增量。如下所示:status = sess.SendPacket(void *)1234567890,10,0,false,10);checkerror(status);对于同一个RTP会话来讲,负载类型、标识和时戳增量通常来讲都是相同的,JRTPLIB允许将它们设置为会话的默认参数,这是通过调用 RTPSession类的SetDefaultPayloadType()、SetDefaultMark()和 SetDefaultTimeStampIncrement()方法来完成的。为RTP会话设置这些默认参数的好处是可以简化数据的发送,例如,如果为 RTP会话设置了默认参数:session.SetDefaultPayloadType(96);/注意这个参数不能随便设置,参考RFC3551session.SetDefaultMark(false);session.SetDefaultTimestampIncrement(160);在设置了以上的值后,我们可以这样来发送数据:status = sess.SendPacket(void *)1234567890,10);3、数据接收对于流媒体数据的接收端,首先需要调用RTPSession类的PollData()方法来接收发送过来的RTP或者RTCP数据报。由于同一个 RTP会话中允许有多个参与者(源),你既可以通过调用RTPSession类的GotoFirstSource()和GotoNextSource() 方法来遍历所有的源,也可以通过调用RTPSession类的GotoFirstSourceWithData()和 GotoNextSourceWithData()方法来遍历那些携带有数据的源。在从RTP会话中检测出有效的数据源之后,接下去就可以调用 RTPSession类的GetNextPacket()方法从中抽取RTP数据报,当接收到的RTP数据报处理完之后,一定要记得及时释放。下面的代码示范了该如何对接收到的RTP数据报进行处理:cppview plaincopyprint?1. session.BeginDataAccess();2. if(session.GotoFirstSource()3. do4. RTPPacket*packet;5. while(packet=session.GetNextPacket()!=0)6. coutGotpacketwithextendedsequencenumber7. GetExtendedSequenceNumber()8. fromSSRCGetSSRC()endl;9. session.DeletePacket(packet);10. 11. while(session.GotoNextSource();12. 13. session.EndDataAccess();JRTPLIB为RTP数据报定义了三种接收模式,其中每种接收模式都具体规定了哪些到达的RTP数据报将会被接受,而哪些到达的RTP数据报将会被拒绝。通过调用RTPSession类的SetReceiveMode()方法可以设置下列这些接收模式:RECEIVEMODE_ALL缺省的接收模式,所有到达的RTP数据报都将被接受; RECEIVEMODE_IGNORESOME除了某些特定的发送者之外,所有到达的RTP数据报都将被接受,而被拒绝的发送者列表可以通过调用AddToIgnoreList()、ClearIgnoreList()和DeleteFromIgnoreList()方法来进行设置; RECEIVEMODE_ACCEPTSOME除了某些特定的发送者之外,所有到达的RTP数据报都将被拒绝,而被接受的发送者列表可以通过调用AddToAcceptList ()、ClearAcceptList ()和eleteFromAcceptList方法来进行设置。4、运行程序在运行程序之前,我们要知道,这是基于UDP协议的数据报服务。我们的example1是在本机上实现的RTP传输,并且只有一个RTPSession对象,所以我们的监听和接收的端口是同一个,所以此时我们的portBase要和我们加入到RTPSession对象中的客户端的端口一致,如上面我们可以都设置成6000.但是如果是在两个线程中,我们就要注意了,服务器端口和客户端口一定不一样,这也是基本的知识,用的时候要注意,多思考。开源RTP库JRTPLIB初学转(2008-12-10 18:58:00)转载标签:it分类:技术无限RTP是一个实时通讯网络协议,网络上的音视频传输可以用它来做,像QQ的语音聊天等都是使用这个。real 开发 的在线rm文件播放协议 rstp也是基于RTP协议,可以自己搜索一下, 在网上可找到“RTP 实时网络协议rfc3550.pdf” 文档,有详细介绍。JRTPLIB 是一个开源的 RTP协议实现库,支持Windows和unix平台,应该也很多人用了,封装的类方式很不错。他的主页是http:/research.edm.uhasselt.be/jori/page/index.php?n=CS.Jrtplib,帮助文档:http:/research.edm.uhasselt.be/jori/jrtplib/documentation/index.htmlRTPSession Class Referencehttp:/research.edm.uhasselt.be/jori/jrtplib/documentation/classRTPSession.html从他主页上下载完整的 JRTPLIB源码包下来解压就行了,不过JRTPLIB 用到了他的JThread库,在主页上可以找到,也把JThread 库下载下来就行了。解压之后再examples 目录下有几个例子,我试了一下,example2.cpp 和example4.cpp 两个,刚好一个可以作为客户端,一个作为服务器端,在vc2003 中测试了一下。首先建一个win32 console 项目,把 把JRTPLIB example2.cpp和 example4.cpp 加进了,再把JRTPLIB和JThread 添加到工程中来。 在 include 目下中指定JRTPLIB和JThread 的src源码目录。下一步把工程属性中把 “Runtime Library” 改成“Multi-threaded Debug DLL (/MDd)” ,需要改成这个JThread 才能编译通过。最后包含一个 Ws2_32.lib 这个lib库,我是直接在example2.cpp 和example4.cpp 前面添加 #pragma comment (lib, Ws2_32.lib) 这一句了,在工程属性修改应该一样的。两个例子的代码如下也贴一下吧:#pragma comment (lib, Ws2_32.lib)#include rtpsession.h#include rtppacket.h#include rtpudpv4transmitter.h#include rtpipv4address.h#include rtpsessionparams.h#include rtperrors.h#ifndef WIN32#include #include #else#include #endif / WIN32#include rtpsourcedata.h#include #include #include #include #ifdef RTP_SUPPORT_THREADThis function checks if there was a RTP error. If so, it displays an errormessage and exists.void checkerror(int rtperr)if (rtperr 0)std:cout ERROR: RTPGetErrorString(rtperr) std:endl;exit(-1);The new class routineclass MyRTPSession : public RTPSessionprotected:void OnPollThreadStep();void ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack);void MyRTPSession:OnPollThreadStep()BeginDataAccess();check incoming packetsif (GotoFirstSourceWithData()doRTPPacket *pack;RTPSourceData *srcdat;srcdat = GetCurrentSourceInfo();while (pack = GetNextPacket() != NULL)ProcessRTPPacket(*srcdat,*pack);DeletePacket(pack); while (GotoNextSourceWithData();EndDataAccess();void MyRTPSession:ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack)You can inspect the packet and the sources info herestd:cout Got packet rtppack.GetExtendedSequenceNumber() from SSRC srcdat.GetSSRC() std:endl;The main routineint main(void)#ifdef WIN32WSADATA dat;WSAStartup(MAKEWORD(2,2),&dat);#endif / WIN32MyRTPSession sess;uint16_t portbase;std:string ipstr;int status,num;First, well ask for the necessary informationstd:cout Enter local portbase: portbase;std:cout std:endl;std:cout std:endl;std:cout Number of seconds you wish to wait: num;Now, well create a RTP session, set the destinationand poll for incoming data.RTPUDPv4TransmissionParams transparams;RTPSessionParams sessparams;IMPORTANT: The local timestamp unit MUST be set, otherwiseRTCP Sender Report info will be calculated wrongIn this case, well be just use 8000 samples per second.sessparams.SetOwnTimestampUnit(1.0/8000.0);transparams.SetPortbase(portbase);status = sess.Create(sessparams,&transparams);checkerror(status);Wait a number of secondsRTPTime:Wait(RTPTime(num,0);sess.BYEDestroy(RTPTime(10,0),0,0);#ifdef WIN32WSACleanup();#endif / WIN32return 0;#elseint main(void)std:cerr Thread support is required for this example std:endl;return 0;#endif / RTP_SUPPORT_THREAD=#pragma comment (lib, Ws2_32.lib)#include rtpsession.h#include rtpsessionparams.h#include rtpudpv4transmitter.h#include rtpipv4address.h#include rtptimeutilities.h#include rtppacket.h#include #include int main(void)#ifdef WIN32WSADATA dat;WSAStartup(MAKEWORD(2,2),&dat);#endif / WIN32RTPSession session;RTPSessionParams sessionparams;sessionparams.SetOwnTimestampUnit(1.0/8000.0);RTPUDPv4TransmissionParams transparams;transparams.SetPortbase(8000);int status = session.Create(sessionparams,&transparams);if (status 0)std:cerr RTPGetErrorString(status) std:endl;exit(-1);uint8_t localip=127,0,0,1;RTPIPv4Address addr(localip,9000);status = session.AddDestination(addr);if (status 0)std:cerr RTPGetErrorString(status) std:endl;exit(-1);session.SetDefaultPayloadType(96);session.SetDefaultMark(false);session.SetDefaultTimestampIncrement(160);uint8_t silencebuffer160;for (int i = 0 ; i 160 ; i+)silencebufferi = 128;/RTPTime delay(0.020);RTPTime delay(3.000);RTPTime starttime = RTPTime:CurrentTime();bool done = false;while (!done)status = session.SendPacket(silencebuffer,160);if (status 0)std:cerr RTPGetErrorString(status) std:endl;exit(-1);session.BeginDataAccess();if (session.GotoFirstSource()doRTPPacket *packet;while (packet = session.GetNextPacket() != 0)std:cout Got packet with extended sequence

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论