jrtplib java,jrtplib 分包处理

转载自:http://blog.csdn.net/sxcong/article/details/3736354听说jrtplib写的不错,终于找到时间下来看看。下载,直接用VC6编译,很容易。然后打开VC,建立工程,测试examples下那几个收发程序,的确用起来很简单。想想以前都是自己封装UDP,现在的程序员真幸福。不过,在发送视频数据时出了问题,跟踪进去看了一下,里面设置最大帧数据长度为140…

大家好,又见面了,我是你们的朋友全栈君。

转载自:http://blog.csdn.net/sxcong/article/details/3736354

听说jrtplib写的不错,终于找到时间下来看看。下载,直接用VC6编译,很容易。然后打开VC,建立工程,测试examples下那几个收发程序,的确用起来很简单。想想以前都是自己封装UDP,现在的程序员真幸福。不过,在发送视频数据时出了问题,跟踪进去看了一下,里面设置最大帧数据长度为1400。于是自己设置最大为32X1024,跟进去还不行。原来是内部没有分包处理,超过上限就不允许发了。随便搜了一个,有个叫SmartView的视频会议源码,是改写jrtplib的RTPSession的SendPacket,在这里分包。很不错的想法。不过又一想,jrtplib,本身是做为lib提供的,虽然可以改写其代码,但肯定与作者初衷不符。于是找到利用这个库的同作者写的开源项目emiplib,够复杂的,把ffmpeg也集进来了。先不管,直接搜索关键字RTPSession和SendPacket,发现他发送的是自己封装的一个类MIPRTPSendMessage,其父类是MIPMessage。看到这想都不用想,作者肯定是在发送之前先进行了处理,形成了自己定义格式的Message再发送。收到后在形成MIPRTPRecvMessage。这应该是是最正规的写法。不过,想想这个库,虽然没用过,但很多年前就听人说过,肯定考虑过这些问题。没有文件,就仔细看头文件,终于发现了SendPacketEx这个函数,一大堆英文说明,刚才没仔细看:/** Sends the RTP packet with payload /c data which has length /c len.*  The packet will contain a header extension with identifier /c hdrextID and containing data*  /c hdrextdata. The length of this data is given by /c numhdrextwords and is specified in a*  number of 32-bit words. The used payload type, marker and timestamp increment will be those that*  have been set using the /c SetDefault member functions.*/这回看清楚了吧,对,就是那个hdrextdata,是分包的数据,是长度,hdrextID是其ID。这样,发送数据的时候,先分好包,再调用SendPacketEx就行了。发送没问题了,再说接收。也不看类结构了,参考亚历山大方法,直接搜索recvfrom。在RTPUDPv4Transmitter::PollSocket这里找到了,然后紧接就是RTPRawPacket *pack;pack = RTPNew(….很好,收到后先封装成了RTPRawPacket。但是,最终和用户打交道的是RTPPacket,于是看它的头文件,一眼就看到:/** If a header extension is present, this function returns the extension identifier. */uint16_t GetExtensionID() const                                                        { return extid; }/** Returns the length of the header extension data. */uint8_t *GetExtensionData() const                                                    { return extension; }/** Returns the length of the header extension data. */size_t GetExtensionLength() const                                                    { return extensionlength; }对头,这就是我们需要的。但是,这三个值是怎么出现的呢?回头再看从RTPRawPacket–>RTPPacket.处理的过程看起来比较复杂,就先找外面的回调,应该在ProcessPolledData里面。然后,看到了ProcessRawPacket(…),参数都不用看,从函数名就知道这是我们想要了解的东西了。其实不知道这个也没关系,我们只需要调用上面那三个函数就可以在外面重新组包了。两瓶酒的时间分析结束。不过只是听说这个库写的不错,随手记下来看看,实在没兴趣动手用代码来实现了。有哪位兄弟能写出代码附上就好了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126500.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 适配器的作用计算机网络,网络适配器的作用

    适配器的作用计算机网络,网络适配器的作用网络适配器是计算机用来联网的一种设备,也就是网卡。一般这种设备就在主板的插槽中插着,它的工作原理就是通过网络介质来传输一些数据,并转为其他的格式,使这种格式能够被其他的设备所识别。网络适配器的技术参数有很多,例如带宽、电气接口方式等。网络适配器又称网卡或网络接口卡(NIC),英文名NetworkInterfaceCard。它是使计算机联网的设备。平常所说的网卡就是将PC机和LAN连接的网络适配器。…

    2022年6月1日
    59
  • np.zeros函数知识大全(numpy.zeros())「建议收藏」

    np.zeros函数知识大全(numpy.zeros())「建议收藏」np.zeros函数知识大全np.zeros函数的作用np.zeros函数的作用返回来一个给定形状和类型的用0填充的数组;zeros(shape,dtype=float,order=‘C’)shape:形状dtype:数据类型,可选参数,默认numpy.float64order:可选参数,c代表与c语言类似,行优先;F代表列优先importnumpyasnpprint…

    2025年8月11日
    1
  • 安捷伦频谱仪的使用方法图解_安捷伦E4402B频谱仪使用说明

    安捷伦频谱仪的使用方法图解_安捷伦E4402B频谱仪使用说明标签:安捷伦仪器使用说明安捷伦仪器使用说明本资料为安捷伦频谱仪器使用说明,资料用于学习交流不能以任何形式商用。文档内容节选AgilentE4402BESAESeriesSpectrumAnalyzer使用方法简介宁波之猫2009617…

    2022年8月11日
    6
  • opencv使用教程_opencv安装教程python

    opencv使用教程_opencv安装教程python视频教程链接:OpenCV4C++快速入门视频30讲-系列合集

    2025年11月11日
    3
  • 微服务链路追踪有哪些_微服务网关原理

    微服务链路追踪有哪些_微服务网关原理目录Sleuth简介相关术语使用Sleuth引入依赖创建服务product-serviceorder-service启动&测试Zipkin使用Zipkin参考文章Sleuth简介Sleuth是SpringCloud的组件之一,它为SpringCloud实现了一种分布式追踪解决方案,兼容Zipkin,HTrace和其他基于日志的追踪…

    2025年8月6日
    3
  • 编程题:分苹果_同学分苹果的小学题

    编程题:分苹果_同学分苹果的小学题题目描述n只奶牛坐在一排,每个奶牛拥有ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出-1。输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含一个整数n(1<=n<=100),接下来的一行包含n个整数ai(1&l…

    2022年10月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号