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)


相关推荐

  • 小程序uv访客怎么刷_微信小程序获取访客数据-使用攻略

    小程序uv访客怎么刷_微信小程序获取访客数据-使用攻略一、使用场景企业希望有更多机会获取微信小程序访客的数据,以便精准快速地和客户取得联系、把握并转化商机。二、如何获取微信访客数据2.1可设置在特定场景下,触发授权请求,获取访客的微信头像昵称或手机号。如果访客已经授权了微信头像昵称或手机号后,则不会再要求访客授权。(注:获取手机号功能需要先授权“非个人”主体的微信小程序才可使用。)2.2授权请求分为两种:引导授权、强制授权。引导授权:显示弹窗,引…

  • allocatememory(an out of memory)

    仅作为记录,大佬请跳过。仅需减小batchsize展示:即可运行。注博主的这个程序减小batchsize就行了,可能不同的博友们的程序不一样,也有的大佬博主使用不计算梯度或释放内存的方式不计算梯度——传送门withtorch.no_grad()释放内存——传送门ifhasattr(torch.cuda,’empty_cache’): torch.cuda.empty_cache()…

  • 开源库TinyXML2简介及使用

    开源库TinyXML2简介及使用TinyXML2是一个开源、简单、小巧、高效的C++XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(DocumentObjectModel,DOM)。它不能解析DTD(DocumentTypeDefinitions,文档类型定义)或XSL(eXtensibleStylesheetLan…

  • SQL SERVER 2000数据库置疑 紧急模式

    SQL SERVER 2000数据库置疑 紧急模式SQLSERVER2000数据库,服务重启之后系统库以外的其它库都会出现置疑(置疑之前没有备份的库。除非是置疑前一秒刚备份完,或者是备份完没有再使用,可以直接恢复):1、停掉SQLSERVER服务(开始–控制面板–管理工具–服务–MSSQLSERVER–右键停止)2、找到置疑库的数据文件mdf和ldf存放位置,备份此文件到其它文件夹3、重启SQLSERVER服务

  • MFC控件 — 进度条【案例】「建议收藏」

    MFC控件 — 进度条【案例】「建议收藏」打开游戏或者其他一些软件时,时常会看到刚开始时有一个进度条在加载,有点酷炫的感觉。对于MFC进度条的使用,下面用一个案例介绍一下。案例:进度条单步加载和自动连续加载步骤:1.按下图在对话框中添加一个进度条,一个编辑框,和3个按钮,并为进度条添加一个控件变量进度条变量:m_Progress2.在初始化函数中对进度条进行初始化,代码如下:BOOLCSpinDlg::OnInitDia…

  • 数字电子技术课程设计八路抢答器报告_八路抢答器课程设计参考

    数字电子技术课程设计八路抢答器报告_八路抢答器课程设计参考数字电子技术课程设计-八路抢答器有错误请指正

    2022年10月20日

发表回复

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

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