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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 编程中的卫语句

    什么是卫语句在《阿里巴巴Java开发手册》中提到,多层条件语句建议使用卫语句、策略模式、状态模式等方式重构。那么,什么是卫语句呢?在中文维基百科中是这样介绍的在计算机程序设计中,卫(guard)是布尔表达式,其结果必须为真,程序才能执行下去。卫语句(guardcode或guardclause)用于检查先决条件。卫语句的用途,例如:引用(reference)使用前检查是否为空引用;处置模式使用一个布尔域,使得释放资源操作成为幂等运算,即多次释放资源等效于只释放一次。卫语句可用于子进程的提前

    2022年4月7日
    328
  • 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)「建议收藏」

    解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)「建议收藏」解剖SQLSERVER第十四篇Vardecimals存储格式揭秘(译)http://improve.dk/how-are-vardecimals-stored/在这篇文章,我将深入研究vardecimals是怎麽存储在磁盘上的。作为一般的介绍vardecimals是怎样的,什么时候应该使用,怎样使用,参考这篇文章vardecimal存储格式启用了吗…

    2022年7月20日
    16
  • XOOPS模块开发快速入门中文翻译(二)

    XOOPS模块开发快速入门中文翻译(二)由于这两天一直研究XOOPS的模块,所以找到了这篇很好的模块开发快速入门。看了以后,就兴致勃勃的来开发模块了,可是开发的过程中遇到一些问题。应该是我看的太快了,要学而时习之啊。因此翻译在这里。=

    2022年7月2日
    23
  • MySQL的Illegal mix of collationsy异常原因和解决方法

    MySQL的Illegal mix of collationsy异常原因和解决方法

    2021年10月15日
    75
  • SCSA考试大纲[通俗易懂]

    SCSA考试大纲[通俗易懂]认证考试形式和结构一、试卷满分及时间试卷满分为120分,考试时间为80分钟,80分通过二、考试形式在线考试三、答题方式闭卷四、试卷内容知识结构试题比例网络基础15%信息安全基础5%数据传输安全15%上网行为安全30%边界安全20%…

    2022年6月20日
    34
  • Java解析XML字符串「建议收藏」

    Java解析XML字符串「建议收藏」在网上找了很多Java语言解析XML字符串的资料,很多内容写得很繁复,没有普适性,遂自己动手写了一个用Java解析XML的工具类。话不多说,直接看下面代码:XML解析工具类:importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Node;importorg.dom4j.io.SAXReader;importjava.io.ByteArrayInputStream;importjava.

    2022年6月4日
    183

发表回复

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

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