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(…),参数都不用看,从函数名就知道这是我们想要了解的东西了。其实不知道这个也没关系,我们只需要调用上面那三个函数就可以在外面重新组包了。两瓶酒的时间分析结束。不过只是听说这个库写的不错,随手记下来看看,实在没兴趣动手用代码来实现了。有哪位兄弟能写出代码附上就好了。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • redis五大类型用法

    redis五大类型用法

  • .sln文件

    .sln文件VisualStudio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件。为解决方案资源管理器提供显示管理文件的图形接口所需的信息,从而在每次继续开发任务时,不会因开发环境而分散精力;*.sln:(VisualStudio.Solution)通过为环境提供对项目、项目项和解决方案项在磁盘上位置的引用,可将它们组织到解决方案中。比如是生成Debug模式,还是Release模式,是通用CPU还是专用的等.ps:…

  • java程序运行机制的特点_Java语言的特点

    java程序运行机制的特点_Java语言的特点特点一:面向对象1、两个基本概念:类、对象2、三大特性:封装、继承、多态特点二:健壮性吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制特点三:跨平台性跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。“Writeonce,RunAnywhere”原理:只要在需要运行java应用程序的操作系…

  • hibernate之二级缓存「建议收藏」

    hibernate之二级缓存「建议收藏」hibernate之二级缓存缓存的作用:通过缓存,可以减少与数据库的交互,提高数据库访问性能。即把需要的数据存储起来,不需要每次都请求,主要目地减少服务器压力。Hibernate缓存一般分三类:一级缓存(Session对象):Hibernate的内置缓存,必需的,默认启动,不能被卸载。由于Session对象的生命周期通常对应一个数据库事务,因此它的缓存是事务范围的缓存。在一级缓存中,持…

  • golang 大数据平台_golang 如何处理大数据[通俗易懂]

    golang 大数据平台_golang 如何处理大数据[通俗易懂]Golang被证明非常适合并发编程,goroutine比异步编程更易读、优雅、高效。本文提出一个适合由Golang实现的Pipeline执行模型,适合批量处理大量数据(ETL)的情景。想象这样的应用情景:(推荐学习:go)从数据库A(Cassandra)加载用户评论(量巨大,例如10亿条);根据每条评论的用户ID、从数据库B(MySQL)关联用户资料;调用…

  • 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api

    基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api

发表回复

您的电子邮箱地址不会被公开。

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