博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jrtplib 分包处理
阅读量:6570 次
发布时间:2019-06-24

本文共 1944 字,大约阅读时间需要 6 分钟。

听说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(...),参数都不用看,从函数名就知道这是我们想要了解的东西了。其实不知道这个也没关系,我们只需要调用上面那三个函数

     就可以在外面重新组包了。

     

     两瓶酒的时间分析结束。不过只是听说这个库写的不错,随手记下来看看,实在没兴趣动手用代码来实现了。有哪位兄弟能写出代码附上就好了。

转载地址:http://krvjo.baihongyu.com/

你可能感兴趣的文章
Map集合案例
查看>>
RequireJS进阶(二)
查看>>
Flex创建带有空间信息的椭圆(Polygon)
查看>>
python3 在不同操作系统安装第三方库方法
查看>>
spark shuffle:分区原理及相关的疑问
查看>>
Laravel5.5 使用第三方Vendor添加注册验证码
查看>>
mysql优化
查看>>
Gradle -help
查看>>
css3做的nav
查看>>
css选择器顺序的小技巧
查看>>
互联网架构师必备技术 Docker仓库与Java应用服务动态发布那些事
查看>>
Intellij IDEA 2018.2 搭建Spring Boot 应用
查看>>
SNMP AGENT函数介绍
查看>>
Git提交到多个远程仓库(多看两个文档)
查看>>
期末大作业
查看>>
[Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
查看>>
极客学院职业路径图课程视频下载-爬虫
查看>>
slice,substr和substring的区别
查看>>
课堂练习(续)
查看>>
对于数据库连接池的一些思考和MyBatis的集成与使用
查看>>