发明内容
为克服无线视频传统传输接收处理方式以上缺点,本发明提出一种基于公共数字移动通信网络的视频包多链路接收方法,其特征在于包括如下步骤:
步骤A、建立多个套接字(socket)接收视频数据包;
步骤B、任意套接字收到视频数据包,判断是否是正确的数据包,如果是跳转到步骤C;否则丢弃该包数据,并跳转步骤E;
步骤C、启动插包子过程,对I帧包的分包以及非I帧包进行插包缓存,形成正常的数据帧;
步骤D、通知播放线程有视频分包插入链表,跳转步骤E;
步骤E、判断套接字是否已关闭,如果没有关闭,跳转至步骤B;否则跳转步骤F;
步骤F、结束;
其中所述插包子过程包括:
步骤C1、比较待插入帧的包序号与下一播放帧包序号(nNextFrameNo)的差值,如果差值小于预定阈值跳转到步骤C2;
步骤C2、检查动态链表的视频包总个数,如果小于链表最大长度值,则将丢包标志标记为FALSE,跳转到步骤C3;
步骤C3、生成一个新的视频包结构,根据插入帧的包序号查找插入位置,直接插入到动态有序链表中,并将动态有序链表个数加1。
其中,步骤C2中如果视频包个数大于等于链表最大长度值则将丢包标志标记为TRUE,并且动态链表丢包子过程,该动态链表丢包子过程包括:
步骤C21、分析动态链表中的最小序号包,如果最小序号包是I帧分包,若包序号大于等于nNextFrameNo,将nNextFrameNo标记为该包序号加1;否则nNextFrameNo保持不变,删除链表中所有已经到达的该I帧分包,同时链表中元素个数减该已经到达的该I帧分包的数目,标记丢包标志为TRUE,跳转到步骤C22;
如果最小序号包是非I帧包,若包序号大于等于nNextFrameNo,则将nNextFrameNo标记为该包序号加1;否则nNextFrameNo保持不变,并将该包从链表中删除,同时链表中元素个数减1,标记bCropFrame为TRUE;
步骤C22分析动态顺序链表,如果最小序号包是非I帧包,若该包包序号大于等于nNextFrameNo,则将nNextFrameNo标记为该包序号加1;否则nNextFrameNo保持不变,并将该包从链表中删除,同时链表中元素个数减1,标记丢包标记为TRUE,跳转到步骤C23;
如果最小序号包是I帧包,标记丢包标记为FALSE;
步骤C23、动态链表丢包子过程结束。
本发明还提出一种相应的对多路接收的数据进行播放的方法,包括:
步骤a判断是否收到有视频包插入的通知,是的话跳转步骤b,否则跳转步骤f;
步骤b进行播放设置的初始化,其中,下一播放帧包序号(nNextFrameNo)初始化为0,同时标记播放标志为TRUE;丢包标志为FALSE;
步骤c如果播放标记为FALSE,清空动态顺序链表,跳转步骤f;如果播放标记为TRUE,跳转步骤C;
步骤d从动态链表中读取包序号为nNextFrameNo的数据,判断读取的该帧的包个数,执行步骤e;
步骤e如果返回包个数为1,则数据帧可能是非I帧包或者分包总数是1的一个I帧包,将该包直接进行播放跳转到步骤d;
如果返回包个数大于1,则数据帧是I帧,将这几个包顺序进行播放,跳转到步骤d;
如果返回包个数为0,则数据帧为空,跳转步骤f;
步骤f停止本轮次播放。
上述方法实现完整视频数据帧的多个分包通过多链路传输后的接收处理功能,解决无线视频图像马赛克现象和流畅性问题,并保证视频的实时性,相对于现有技术具有显著的进步。
具体实施方式
以下结合附图,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用以限定本发明。
在本具体实施例中,各方法以及子过程可以采用程序模块的形式由嵌入式的计算机系统实现.
设置如下的常量参数:
动态有序链表最大包数目:MAXLISTELEMENT=50;其用于限制链表的最大大小;
清空视频包缓存门限值:THRESHOLCREMOVEALL=100;
上述设置仅仅用于说明本实施例,本领域技术人员可以根据需要在使用方法时设置上述动态有序链表最大包数目、清空视频包缓存门限值为其它值。
为便于进行说明,用nNextFrameNo代表下一个播放帧的包序号;用bCropFrame代表丢包标志,其可被设为TRUE或FAULSE;用bPlay代表播放标志。
在本实施例的接收方法中,由于I帧单帧数据量大,所以在传输过程中需要进行分包处理,其它类型的帧单帧数据量不大,不需要分包处理。
采用带头结点的动态有序链表作为视频数据包缓存结构,该动态有序链表最大长度不能超过MAXLISTELEMENT个,一旦新到达的包因缓存使链表最大长度超过MAXLISTELEMENT个,则启动丢包程序。
由于多链路同时接收数据包,因此,在对动态链表如果有数据变动操作时应该进行互斥上锁操作。
对任何收到的视频包都要先动态生成一个链表元素,如果是非I帧包,则按照包序号大小顺序插入到动态链表中,如果是I帧分包,则按照包序号大小以及分包序号大小顺序插入到动态链表中;
在本实施例的播放方法中,从动态有序链表中读取数据时,直接查找链表中序号为nNextFrameNo的包,如果是非I帧,直接取出该包元素,并返回读取的包数目为1;如果是I帧分包,先判断该I帧的所有分包是否已经全部到达,若没有全部到达则直接退出,并返回包数目为0,否则先取出全部该I帧分包,并返回读取的包数目为该I帧分包总数。
基于公共数字移动通信网络的视频多链路接收算法实现原理:
步骤101建立多个套接字(socket)接收视频数据包;
步骤102任意套接字收到视频数据包,判断是否是正确的数据包,如果是跳转到步骤103;否则丢弃该包数据,并跳转步骤105;
步骤103启动插包子过程,对I帧包的分包以及非I帧包进行插包缓存,形成正常的数据帧;如果该包是非I帧包,则按照包序号大小顺序插入到动态链表中,如果是I帧分包,则按照包序号大小以及分包序号大小顺序插入到动态链表中;
步骤104通知播放线程有视频分包插入链表,跳转步骤105;
步骤105判断套接字是否已关闭,如果没有关闭,跳转至步骤102;否则跳转步骤106;
步骤106过程结束。
图2示出了多路接收视频帧插包子过程,该过程应该对链表上锁以避免多个线程同时操作链表导致数据出错;
步骤201若bCropFrame为TRUE跳转到步骤202,否则跳转到步骤207;
步骤202检查待插入帧的包类型,如果是非I帧,直接丢弃该帧,结束插入过程;否则跳转到步骤203;
步骤203比较待插入帧的包序号与nNextFrameNo的值,如果差值达到THRESHOLCREMOVEALL,直接清空整个有序链表,并将所有播放相关元素标记为初始值;否则跳转到步骤204;
步骤204若待插入帧包序号小于nNextFrameNo,直接跳转步骤211;否则跳转到步骤205;
步骤205检查动态有序链表的视频包总个数,如果大于等于MAXLISTELEMENT,先将bCropFrame标记为TRUE,调用动态缓存链表丢包过程,跳转到步骤201;否则将bCropFrame标记为FALSE,跳转到步骤206;
步骤206生成一个新的视频包结构,查找插入位置,直接插入到动态有序链表中,并将动态有序链表个数加1,跳转步骤211;
步骤207比较待插入帧的包序号与nNextFrameNo的值,如果差值达到THRESHOLCREMOVEALL,直接清空整个有序链表,并将所有播放相关元素标记为初始值;
步骤208若待插入帧包序号小于nNextFrameNo,直接跳转到步骤211;
步骤209检查动态有序链表的视频包总个数,如果大于等于MAXLISTELEMENT,先将bCropFrame标记为TRUE,调用动态缓存链表丢包子过程,跳转到步骤201;
步骤210生成一个新的视频包结构,调用动态缓存链表数据包定位子过程,查找插入位置,直接插入到动态有序链表中,并将动态有序链表个数加1;
步骤211退出处理算法。
图3示出了动态缓存链表丢包子过程,该过程只在动态顺序链表插入过程中使用:
步骤301如果bCropFrame的值为TRUE,分析动态链表中最小包序号的包;如果bCropFrame的值为FALSE,则停止丢包,跳转到步骤306。
步骤302如果最小序号包是I帧分包,若该包包序号大于等于nNextFrameNo,将nNextFrameNo标记为该包序号加1;否则nNextFrameNo保持不变,删除链表中所有已经到达的该I帧分包(假定已经到达的该I帧的分包数目为m个),同时链表中元素个数减m,标记bCropFrame为TRUE,跳转到步骤304;
步骤303分析动态顺序链表,如果最小序号包是非I帧包,若该包包序号大于等于nNextFrameNo,则将nNextFrameNo标记为该包序号加1;否则nNextFrameNo保持不变,并将该包从链表中删除,同时链表中元素个数减1,标记bCropFrame为TRUE;
步骤304分析动态顺序链表,如果最小序号包是非I帧包,若该包包序号大于等于nNextFrameNo,则将nNextFrameNo标记为该包序号加1;否则nNextFrameNo保持不变,并将该包从链表中删除,同时链表中元素个数减1,标记bCropFrame为TRUE,跳转到步骤306;
步骤305如果最小序号包是I帧包,标记bCropFrame为FALSE;
步骤306丢包子过程结束。
图4是出了动态缓存链表数据包定位子过程,该过程不上锁,采用其他的公知的链表搜索方法也能够对其进行替代。
步骤401初始化,取当前结点pstTemp=动态顺序链表(带头结点)头结点,待返回结点位置pstLocation=空;
步骤402如果pstTemp->next为空,则pstLocation=pstTemp,跳转步骤8;否则先pstLocation=pstTemp,然后pstTemp=pstTemp->next;
步骤403如果pstTemp不空而且待查找元素包序号大于pstTemp结点包序号,则先pstLocation=pstTemp,然后pstTemp=pstTemp->next,跳转步骤403;
步骤404如果pstTemp为空,则跳转步骤408;
步骤405如果待查找结点包序号大于pstTemp结点包序号,则跳转步骤408;
步骤406如果待查找结点帧类型为I帧并且pstTemp结点帧类型也为I帧,则跳转步骤407;否则返回空,跳转步骤409;
步骤407如果pstTemp不为空,查找结点包序号等于pstTemp结点包序号且待查找结点分包序号大于pstTemp结点分包序号,则先pstLocation=pstTemp,然后pstTemp=pstTemp->next,跳转步骤407;
步骤408返回pstLocation;
步骤409退出查找子过程。
图5示出了本实施例的视频帧播放方法。
步骤501判断是否收到有视频包插入的通知,是的话跳转步骤502,否则跳转步骤506;
步骤502进行播放设置的初始化,其中,nNextFrameNo初始化为0,同时标记播放标志为TRUE;丢包标志bCropFrame为FALSE;
步骤503;如果播放标记bPlay为FALSE,停止该轮次播放,并清空动态顺序链表;如果播放标记为TRUE,当收到视频数据插入动态有序链表(无论成功与否)的通知时开始播放;
步骤504从动态链表中读取包序号为nNextFrameNo的数据,判断读取的该帧的包个数,执行步骤505;
步骤505如果返回包个数为1,则数据帧可能是非I帧包或者分包总数是1的一个I帧包,将该包直接进行播放跳转到步骤504;
如果返回包个数大于1,则数据帧是I帧,将这几个包顺序进行播放,跳转到步骤
504;如果返回包个数为0,则数据帧为空,跳转步骤506;
步骤506停止本轮次播放。
图6是出了动态缓存链表取包子过程,该过程应该上锁,输入数据为待取包序号,返回数据为所取包个数、包类型、以及所有取到的包。
步骤601检查输入的待取包的包序号(nNextFrameNo),如果包序号为0,跳转到步骤602;否则跳转到步骤605;
步骤602检查动态有序链表,如果链表包总数为0,则返回所取包个数为0,跳转到步骤609;
步骤603分析第一个包(包序号最小),如果该包为非I帧,取出该包,将动态顺序链表包总数减1,并返回所取包数为1,同时nNextFrameNo等于该包包序号加1,跳转到步骤609;
步骤604分析该I帧(包括分包总数m、包序号和包类型),看其所有分包是否全部到达,如果全部到达,顺序取出全部该I帧分包,将动态顺序链表包总数减m,并返回所取包数为m,同时nNextFrameNo等于该包包序号加1,跳转到步骤609;否则返回所取包个数为0,跳转到步骤609.
步骤605如果待取包序号不为0,检查链表中是否存在该序号的包,如果不存在,则返回所取包个数为0,跳转到步骤609;
步骤606如果存在,分析该包,如果该包包序号大于nNextFrameNo,则返回所取包个数为0,跳转到步骤609;
步骤607如果该包包序号等于nNextFrameNo,分析该包,如果该包为非I帧,取出该包,将动态顺序链表包总数减1,并返回所取包数为1,nNextFrameNo加1,跳转到步骤609;
步骤608如果该该包为I帧分包,看其所有分包是否全部到达,如果全部到达,顺序取出全部该I帧分包,将动态顺序链表包总数减m,并返回所取包数为m,nNextFrameNo加1;否则返回所取包个数为0;
步骤609取包算法结束。
以上所述仅为本发明的较佳实施例,并不用于限制本发明,凡在本发明精神和原则之内所做的任何修改、等同替换和改进等,均包含于本发明的保护范围之内。