jrtplib 分包处理

简介:
听说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(...),参数都不用看,从函数名就知道这是我们想要了解的东西了。其实不知道这个也没关系,我们只需要调用上面那三个函数
     就可以在外面重新组包了。
     
     两瓶酒的时间分析结束。不过只是听说这个库写的不错,随手记下来看看,实在没兴趣动手用代码来实现了。有哪位兄弟能写出代码附上就好了。
目录
相关文章
|
5月前
|
C++
jrtplib开源库系列之一:jrtplib介绍、安装和测试(window 10环境介绍)
关于jrtplib库网上已经有很多介绍,而且目前jrtplib作者已经停止更新(Apr 18, 2020),最新版本为v3.11.2。本系列内容也以该版本进行介绍。 相信你已经对RTP/RTCP协议有一定的了解,并想更深入的了解RTP协议的具体实现,jrtplib就是使用使用C++实现的RTP/RTCP协议。具体标准为RFC3550,如果想仔细阅读原文,但是对英文又有点吃力,可以参考我的博客RTP/RTCP中英文对照,在博客的后面有百度链接,是对RFC3550的中文翻译,可能很多地方不太准确,有些内容是自己添加进去的,希望不会影响你的阅读。
98 0
|
小程序 JavaScript
最新微信小程序反编译工具,完美解决分包问题
看了很多反编译、找回微信小程序源码很多教程,各种问题导致都没法正常使用。微信版本升级后,会遇到各种报错, 以及无法获取到wxss分包无法反编译的问题。于是寻找资料,也买过别人的破解工具,最终解决文件缺失和分包问题,而且无意中发现还能获取小游戏的源码,于是和大家分享下。
最新微信小程序反编译工具,完美解决分包问题
|
2月前
|
存储 小程序 Java
【小程序分包】小程序包大于2M,来这教你分包啊
本文介绍了如何通过分包解决uniapp小程序包体积过大的问题。由于版本升级导致包体积超过2M,即使压缩静态资源也无法满足发布要求。文章详细讲解了分包的原因、步骤及注意事项,并提供了实操示例,帮助读者理解并实现小程序分包,从而减小主包大小
96 1
【小程序分包】小程序包大于2M,来这教你分包啊
|
3月前
|
小程序 UED
uniapp 添加分包页面,配置分包预下载
uniapp 添加分包页面,配置分包预下载
51 2
|
5月前
uniapp怎么实现分包
uniapp怎么实现分包
111 1
|
5月前
|
小程序 前端开发 UED
详细讲解uniapp转小程序分包教程!!!
详细讲解uniapp转小程序分包教程!!!
|
5月前
|
小程序 开发者
【微信小程序】-- 分包 - 独立分包 & 分包预下载(四十五)
【微信小程序】-- 分包 - 独立分包 & 分包预下载(四十五)
|
5月前
|
开发者
uniapp如何分包加载
uniapp如何分包加载
166 1
|
5月前
|
API 数据安全/隐私保护
jrtplib开源库系列之三:jrtplib发送接收数据流程
前面2篇文章主要说明了如何安装jrtplib库,以及对example1进行了说明,这篇文章主要说下jrtplib库数据的收发流程。
195 0
|
5月前
jrtplib开源库系列之二:jrtplib库example1分析说明
这个官方example还是比较简单的,主要是测试发一个数据包,然后自己接收发出的包,注意,这里需要注意将目的地址的端口和基端口(portbase)设置为相同,同时需要将这个参数设置为真sessparams.SetAcceptOwnPackets(true);
91 0