一种支持实时视频缓存多路读取的帧调整方法与流程

文档序号:17608705发布日期:2019-05-07 20:55阅读:684来源:国知局
一种支持实时视频缓存多路读取的帧调整方法与流程

本发明属于缓存技术领域,尤其是一种支持实时视频缓存多路读取的帧调整方法。



背景技术:

现有技术中,在系统内存中缓冲一定长度的视频帧,当网络不好的时候,数据积累过多,导致缓冲buff溢出后,新的视频序列无法写入,只有当缓冲视频帧读取后,才将新的视频序列放入内存缓冲中。其缺点在于:1、数据共享性差,当多路读取视频源的时候,一路读取较慢的话,影响其他路的读取,不利于用户体验;2、如果每一路都开辟该队列,数据重复复制,浪费内存,牺牲效率。



技术实现要素:

本发明所解决的技术问题在于提供一种支持实时视频缓存多路读取的帧调整方法,引入以主缓存为主、二级缓存为辅的数据共享缓存机制,避免因一个读者读取速度较慢而导致整体速度降低的情况,保证视频帧读取的完整性,同时兼顾不同读者对视频实时性和流畅性的要求。

实现本发明目的的技术解决方案为:

一种支持实时视频缓存多路读取的帧调整方法,包括以下步骤:

步骤1:根据数据源的信息和设备内存信息,设置主缓存链表的数目阈值;

步骤2:将每一路数据源的每一个帧拆分为若干个含有该帧信息的有序数据包,再将数据包按顺序写入主缓存的数据链表中;

步骤3:针对主缓存的每一路读请求依次分配不同的读者ID,当读者读取某一个数据包的时候,将该包标识为该读者正在使用,读取完毕后,清除该读者的使用标识;

步骤4:判断主缓存队列的数目是否大于阈值,若是,则转到步骤5,若否,则转到步骤9;

步骤5:从主缓存的数据链表头部依次将没有读者使用的数据包按顺序放入空闲链表,直到有读者正在读取的数据包;

步骤6:将正在读取的数据包以及其后与其同属一个视频帧的数据包转移到二级缓存链表中;

步骤7:继续调整主缓存的数据链表,将没有读者使用的数据包依次放入空闲链表,直到下一个关键帧的头包或者一个正在读取的数据包;

步骤8:判断主缓存队列的数目是否大于阈值,若是,则转到步骤5,若否,则转到步骤9;

步骤9:当读者读取到链表的最后一个数据包时,判断该读者读取的是否为二级缓存数据链表,若是,则将该读者移至主缓存中最新的关键帧处继续读取,将无读者读取的二级缓存的数据包放入空闲链表中,若否,则等待读取主缓存中最新的数据。

进一步的,本发明的支持实时视频缓存多路读取的帧调整方法,步骤3中当读者读取数据包的时候,将读者ID标记入数据包中,表示该数据包正在使用,读者使用完毕后在数据包中清除该读者ID,表示该读者已使用完毕。

进一步的,本发明的支持实时视频缓存多路读取的帧调整方法,所述主缓存的数据链表为媒体数据缓存链表。

进一步的,本发明的支持实时视频缓存多路读取的帧调整方法,所述二级缓存链表为主缓存数据链表的补充链表。

进一步的,本发明的支持实时视频缓存多路读取的帧调整方法,所述空闲链表为内存池,用于为主缓存链表提供内存资源。

进一步的,本发明的支持实时视频缓存多路读取的帧调整方法,步骤2中将数据包按顺序写入主缓存的数据链表中具体为:从空闲链表中获取节点并写入数据,依次插入到主缓存链表中。

进一步的,本发明的支持实时视频缓存多路读取的帧调整方法,步骤9中主缓存中最新的数据利用以下方式获取:从空闲链表中获取节点并写入数据,依次插入到主缓存链表中,并将主缓存中使用过的节点归还给空闲链表。

本发明采用以上技术方案与现有技术相比,具有以下技术效果:

1、本发明的方法能够快速进行帧调整,保证主缓存是有序队列,保证视频帧读取的完整性;

2、本发明的方法采用二级缓存,避免因一个读者读取速度较慢而导致整体速度降低的情况,兼顾不同读者对视频实时性和流畅性的要求;

3、本发明的方法能够保证不同读者共享一个视频源的数据,同时采用小包缓存等机制,避免内存浪费。

附图说明

图1是本发明的支持实时视频缓存多路读取的帧调整方法流程图;

图2是本发明的调整前的主缓存队列示意图;

图3是本发明的调整后的主缓存队列示意图;

图4是本发明的调整后的二级缓存示意图。

具体实施方式

下面详细描述本发明的实施方式,所述实施方式的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施方式是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。

一种支持实时视频缓存多路读取的帧调整方法,创建三个管理链表,一个为主缓存数据链表,一个为二级缓存链表,一个为空闲链表,具体包括以下步骤:

步骤1:根据数据源的信息和设备内存信息,设置主缓存链表的数目阈值。

步骤2:对每一路数据源,采用小包缓存机制,将每一路数据源的每一个帧拆分为若干个含有该帧信息的有序数据包,从空闲链表中获取节点并写入数据,再将数据包按顺序插入主缓存的数据链表中。所述主缓存的数据链表为媒体数据缓存链表,每次打包都从空闲链表中获取节点并写入数据,插入到主缓存链表中。

步骤3:针对主缓存的每一路读请求依次分配不同的读者ID,当读者读取某一个数据包的时候,将读者ID标记入数据包中,标志该数据包正在使用,读者读取完毕后在数据包中清除该读者ID,标志该读者已使用完毕。

步骤4:判断主缓存队列的数目是否大于阈值,若是,则转到步骤5,若否,则转到步骤9。

步骤5:从主缓存的数据链表头部依次将没有读者使用的数据包按顺序放入空闲链表,直到有读者正在读取的数据包。所述空闲链表为内存池,用于为主缓存链表提供内存资源。

步骤:6:将正在读取的数据包以及其后与其同属一个视频帧的数据包转移到二级缓存链表中,所述二级缓存链表为主缓存数据链表的补充链表,数据结构为一个数据链表的链表,因为是链表,所以无需内存复制。

步骤7:继续调整主缓存的数据链表,将没有读者使用的数据包依次放入空闲链表,直到下一个关键帧的头包或者一个正在读取的数据包。

步骤8:判断主缓存队列的数目是否大于阈值,若是,则转到步骤5,若否,则转到步骤9;

步骤9:当读者读取到链表的最后一个数据包时,判断该读者读取的是否为二级缓存数据链表,若是,则将该读者移至主缓存中最新的关键帧处继续读取,将无读者读取的二级缓存的数据包放入空闲链表中,若否,则等待读取主缓存中最新的数据,所述最新的数据利用以下方式获取:从空闲链表中获取节点并写入数据,依次插入到主缓存链表中,并将主缓存中使用过的节点归还给空闲链表。

图2、3、4中每个方框表示属于一帧的小包序列,数目为N,p为非关键帧,I为关键帧。

主缓存队列:假设有3个读者,分别为R1、R2、R3。R1正在读取P2帧的第N-5个包,R2正在读取P4的N-4个包,R3正在读取最后一帧,如图2所示。

二级缓存队列为空。

这个时候,主缓存的链表长度大于了设定阈值,则需要调整主缓存,首先将P1帧序列释放到空闲队列中,然后将P2中N-5到N个包移到缓冲中后,将P3释放到空闲链表中,这个时候主缓存表头为I帧。这样能够将P1以及P3等非关键帧的内存释放出来,供新的数据使用,不会导致因为R1的读取较慢为影响到R3的使用。调整后的主缓存如图3。

二级缓存中包的数目为5个,如图4。

这个时候一次调整结束。如果仍大于阈值,下次写的时候按照上述方法,继续调整。不过是二级缓存增加一个新的链表项。

当R1读取P2结束后,转移到主链表中最新的I帧继续读取数据,这样做到了R1的的读取不影响R2的读取,但是内存开销没有增加。

以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进,这些改进应视为本发明的保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1