首页> 中国专利> 一种基于无锁缓存队列的多路h264视频数据缓存方法及系统

一种基于无锁缓存队列的多路h264视频数据缓存方法及系统

摘要

本发明公开了一种基于无锁缓存队列的多路h264视频数据缓存方法及系统,该方法包括:获取针对第一缓存队列的当前缓存子块c

著录项

  • 公开/公告号CN105611307A

    专利类型发明专利

  • 公开/公告日2016-05-25

    原文格式PDF

  • 申请/专利权人 浪潮(北京)电子信息产业有限公司;

    申请/专利号CN201510954913.1

  • 发明设计人 毕敬强;

    申请日2015-12-17

  • 分类号H04N21/218;H04N21/234;

  • 代理机构北京集佳知识产权代理有限公司;

  • 代理人罗满

  • 地址 100085 北京市海淀区上地信息路2号2-1号C栋1层

  • 入库时间 2023-12-18 15:38:07

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-11-23

    授权

    授权

  • 2016-06-22

    实质审查的生效 IPC(主分类):H04N21/218 申请日:20151217

    实质审查的生效

  • 2016-05-25

    公开

    公开

说明书

技术领域

本发明涉及多路视频数据存取技术领域,特别是涉及一种基于无 锁缓存队列的多路h264视频数据缓存方法及系统。

背景技术

当今,随着科学技术和社会经济的飞速发展,人们可以随时随地 记录下产生的各类数据,在记录各类数据的过程中,人们主要关心的 问题是如何将监控到的数据忠实地、完整地记录下来,即如何保证存 储数据的可靠性和完整性。

在实际应用中,通常需要将多个摄像头采集到的多路视频数据以 恒定速率不间断地写入分布式存储系统中,比如在某个直播节目的现 场,需要将众多摄像机采集到的视频数据写入分布式存储系统,然后 在经过一定处理提供给观众。

在现有的基于无锁缓存队列的将多路视频数据存至分布式缓存 系统的方法中,生产线程和消费线程共用一个缓存,该缓存切分为多 个缓存子块。生产线程以恒定速率从多路视频数据中读取一帧数据并 写入缓存中的一个缓存子块,多个消费线程从这个缓存子块中读取一 帧数据存入到文件中。每写完一个缓存子块,缓存子块的计数值加1。

参考图1,刚开始时,生产线程向缓存中写入数据,消费线程开 始读取缓存并写入到分布式系统中;参考图2,当生产线程写满缓存 时,在缓存的开始继续写入;当消费线程的读取速度比生产线程的写 入速度慢很多时,消费线程会跳过被覆盖的块,然后再从缓存中获取, 比如,在图3中,消费线程读取了16后,下一个应该为17,但是被 生产线程将17覆盖变成了25,这时,消费线程会跳过25而读取18。 在这种情况下,如果17对应的视频数据为数据量比较大或者是重要性 比较高的数据时,易导致视频数据的跳帧现象,进而会影响后续播放 这个视频数据时的流畅度和完整性。

发明内容

有鉴于此,本发明提供了一种基于无锁缓存队列的多路h264视 频数据缓存方法及系统,以实现保证关键帧的完整性,减少视频数据 的跳帧现象,进而保证后续播放视频数据时的流畅度和完整性的目的。

为解决上述技术问题,本发明提供一种基于无锁缓存队列的多路 h264视频数据缓存方法,该方法包括:

获取针对第一缓存队列的当前缓存子块c1i的所述多路h264视频 数据中的一帧数据;

判断所述帧数据是否为I帧数据;

当所述帧数据为I帧数据时,将所述帧数据写入与所述当前缓存 子块c1i对应的第二缓存队列中的缓存子块c2i,并继续获取针对所述第 一缓存队列的下一缓存子块c1(i+1)的所述多路h264视频数据中的下一帧 数据;

当所述帧数据不为I帧数据时,将所述帧数据写入所述当前缓存 子块c1i,并继续获取针对所述第一缓存队列的下一缓存子块c1(i+1)的所述 多路h264视频数据中的下一帧数据;当i+1>N时,c1(i+1)为c11

其中,所述第一缓存队列C1={c11,c12,…,c1i,…,c1N},所述第二缓存队列 C2={c21,c22,…,c2i,…,c2N},i=1,2,3,……,N;c1i为所述第一缓存队列中的第i个缓存 子块,c2i为所述第二缓存队列中与c1i相对应的缓存子块;各所述缓存 子块的内存大小相等。

上述方法中,优选地,在判定所述帧数据为I帧数据之后,还包 括:

判断所述缓存子块c2i中是否存有数据;

当所述缓存子块c2i中存有数据时,将所述帧数据写入所述当前缓 存子块c1i,并继续获取所述下一帧数据;

当所述缓存子块c2i中没有存有数据时,将所述帧数据写入所述缓 存子块c2i,并继续获取所述下一帧数据。

上述方法中,优选地还包括:

判断与所述第一缓存队列的缓存子块c1j相对应的所述第二缓存队 列中的缓存子块c2j中是否存有数据;j=1,2,3,……,N;

当所述缓存子块c2j中存有数据时,对所述缓存子块c2j中的数据进 行剪切,得到待存入数据;

当所述缓存子块c2j中没有存有数据时,获取所述缓存子块c1j中的 数据作为所述待存入数据;

将所述待存入数据存储至分布式存储系统。

上述方法中,优选地在得到所述待存入数据之后,还包括:

返回执行判断与所述第一缓存队列的缓存子块c1(j+1)相对应的所述 第二缓存队列中的缓存子块c2(j+1)中是否存有数据;

其中,当j+1>N时,c1(j+1)为c11,c2(j+1)为c21

上述方法中,优选地还包括:

记录所述获取针对所述第一缓存队列的当前缓存子块c1i的所述多 路h264视频数据中的一帧数据的获取时间;

记录将所述待存入数据存储至分布式存储系统的存入时间;

将所述获取时间与所述存入时间之间的差值作为存储延时。

本发明还提供了一种基于无锁缓存队列的多路h264视频数据缓 存系统,该系统包括:

第一获取单元,用于获取针对第一缓存队列的当前缓存子块c1i的 所述多路h264视频数据中的一帧数据;

第一判断单元,用于判断所述帧数据是否为I帧数据;

写入单元,用于当所述帧数据为I帧数据时,将所述帧数据写入 与所述当前缓存子块c1i对应的第二缓存队列中的缓存子块c2i,并通知 所述第一获取单元继续获取针对所述第一缓存队列的下一缓存子块 c1(i+1)的所述多路h264视频数据中的下一帧数据;当所述帧数据不为I 帧数据时,将所述帧数据写入所述当前缓存子块c1i,并通知所述第一 获取单元继续获取针对所述第一缓存队列的下一缓存子块c1(i+1)的所述 多路h264视频数据中的下一帧数据;当i+1>N时,c1(i+1)为c11

其中,所述第一缓存队列C1={c11,c12,…,c1i,…,c1N},所述第二缓存队列 C2={c21,c22,…,c2i,…,c2N},i=1,2,3,……,N;c1i为所述第一缓存队列中的第i个缓存 子块,c2i为所述第二缓存队列中与c1i相对应的缓存子块;各所述缓存子 块的内存大小相等。

上述系统中,优选地,所述第一判断单元还用于在判定所述帧数 据为I帧数据之后,判断所述缓存子块c2i中是否存有数据;

所述写入单元还用于当所述缓存子块c2i中存有数据时,将所述帧 数据写入所述当前缓存子块c1i,并通知所述第一获取单元继续获取所 述下一帧数据;当所述缓存子块c2i中没有存有数据时,将所述帧数据 写入所述缓存子块c2i,并通知所述第一获取单元继续获取所述下一帧 数据。

上述系统中,优选地,还包括:

第二判断单元,用于判断与所述第一缓存队列的缓存子块c1j相对 应的所述第二缓存队列中的缓存子块c2j中是否存有数据;j=1,2,3,……,N;

第二获取单元,用于当所述缓存子块c2j中存有数据时,对所述缓 存子块c2j中的数据进行剪切,得到待存入数据;当所述缓存子块c2j中 没有存有数据时,获取所述缓存子块c1j中的数据作为所述待存入数据;

存入单元,用于将所述待存入数据存储至分布式存储系统。

上述系统中,优选地,还包括:

所述第二判断单元,还用于在得到所述待存入数据之后,返回执 行判断与所述第一缓存队列的缓存子块c1(j+1)相对应的所述第二缓存队 列中的缓存子块c2(j+1)中是否存有数据;

其中,当j+1>N时,c1(j+1)为c11,c2(j+1)为c21

上述系统中,优选地,还包括:

存储延时确定单元,用于记录所述获取针对所述第一缓存队列的 当前缓存子块c1i的所述多路h264视频数据中的一帧数据的获取时间; 记录将所述待存入数据存储至分布式存储系统的存入时间;将所述获 取时间与所述存入时间之间的差值作为存储延时。

以上本发明提供的一种基于无锁缓存队列的多路h264视频数据 缓存方法及系统,通过维护两个缓存队列来保护h246视频数据中的I 帧数据,第一缓存队列和第二缓存队列。具体地,生产线程先按常规 手段获取针对第一缓存队列的当前缓存子块c1i的所述多路h264视频 数据中的一帧数据。当判定获取的这帧数据为I帧数据时,将该帧数 据写入与当前缓存子块c1i对应的第二缓存队列中的缓存子块c2i,并继 续获取下一帧数据;当判定获取的帧数据不为I帧数据时,将该帧数 据写入所述当前缓存子块c1i,并继续获取下一帧数据。这样的话,即 使消费线程的读取速度比生产线程的写入速度慢很多,也能够避免I 帧数据在没被消费线程读取之前(在第一缓存队列中)被覆盖,并且 当消费线程读取到缓存子块c1i时,如果缓存子块c2i有I帧数据,它会 从缓存子块c2i读取I帧数据。可见,本发明实现了保证关键帧(I帧) 的完整性,减少视频数据的跳帧现象,进而保证后续播放视频数据时 的流畅度和完整性的目的。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面 将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而 易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通 技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附 图获得其他的附图。

图1为现有技术中数据缓存方法的第一示意图;

图2为现有技术中数据缓存方法的第二示意图;

图3为现有技术中数据缓存方法的第三示意图;

图4为本发明实施例提供的一种基于无锁缓存队列的多路h264 视频数据缓存方法的一流程图;

图5为本发明实施例提供的一种基于无锁缓存队列的多路h264 视频数据缓存方法的再一流程图;

图6为本发明实施例提供的一种基于无锁缓存队列的多路h264 视频数据缓存方法的另一流程图;

图7为本发明实施例提供的一种基于无锁缓存队列的多路h264 视频数据缓存系统的结构框图示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方 案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部 分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普 通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例, 都属于本发明保护的范围。

本发明的核心是提供一种基于无锁缓存队列的多路h264视频数 据缓存方法及系统,以实现保证关键帧的完整性,减少视频数据的跳 帧现象,进而保证后续播放视频数据时的流畅度和完整性的目的。

为了使本技术领域的人员更好地理解本发明方案,下面结合附图 和具体实施方式对本发明作进一步的详细说明。

参考图4,图4示出了本发明实施例提供的一种基于无锁缓存队 列的多路h264视频数据缓存方法的流程图,该方法具体可以包括如下 步骤:

步骤S100、获取针对第一缓存队列的当前缓存子块c1i的多路h264 视频数据中的一帧数据;

本发明实施例所提供的方法的执行主体为基于无锁缓存队列的 多路h264视频数据缓存系统,主要应用于将多路摄像头采集到的h264 码流以恒定速率写入到分布式存储系统的场景。在本发明实施例描述 部分,主要是由生产线程和消费线程模拟测试配合,将多路摄像头采 集到的h264码流以恒定速率写入到分布式存储系统,同时采用改进的 队列,能保证关键帧的完整性,从而减少视频存储时的跳帧现象。本 领域技术人员可以针对具体的实际应用进行相适应的转变。

本发明中,生产线程和消费线程共同维护两个缓存队列,第一缓 存队列C1={c11,c12,…,c1i,…,c1N}和第二缓存队列C2={c21,c22,…,c2i,…,c2N},其中, i=1,2,3,……,N;c1i为第一缓存队列中的第i个缓存子块,c2i为第二缓存队 列中与c1i相对应的缓存子块;各缓存子块的内存大小相等,每个缓存 子块的内存大于h264视频每一帧的大小。

对于c2i为第二缓存队列中与c1i相对应的缓存子块,意味着,通过 第一缓存队列中的c1i可以找到与之相对应的第二缓存队列中的c2i,进 一步地,由于每个缓存子块在各自的缓存队列中都有索引编号,可以 将c1i和c2i的索引编号设置为一样,这样对应起来方便。比如,c1i在第 一缓存队列中的索引编号为i,c2i在第二缓存队列中的索引编号也为i。 步骤S101、判断该帧数据是否为I帧数据;当帧数据为I帧数据时, 进入步骤S102,否则,进入步骤S103.

基于H264视频数据的三种帧(完整编码的I帧,参考之前的I 帧生成的只包含差异部分编码的P帧以及参考前后的帧编码的B帧) 中I帧的数据量大且作用重大,因此,需要对I帧数据进行保护,不 让其在没被消费线程读取之前被覆盖。而对于其它的P帧或者B帧, 即使被覆盖了一两帧,对最后视频数据的显示效果的影响程度是可以 忽略的,因为人的肉眼几乎察觉不了。

在具体实施过程中,生产线程的获取速率、分配的缓存大小、每 个消费线程写出的文件大小、每个消费线程总共写出的文件数目、消 费线程数目、程序的运行时间等都可以通过配置文件指定。同时,在 程序运行后,可以通过命令增加消费线程的数目。

步骤S102、将帧数据写入与当前缓存子块c1i对应的第二缓存队列 中的缓存子块c2i,并继续获取针对第一缓存队列的下一缓存子块c1(i+1)的 多路h264视频数据中的下一帧数据;

其中,基于本发明中的两个缓存队列为无锁缓存队列,因此,当 i+1>N时,c1(i+1)为c11,即返回第一个缓存子块继续获取针对这个缓存子块 进行数据获取,依次循环。可以理解的是,本发明中所涉及到的避免 I帧数据被覆盖指的是避免其在消费线程读取之前被覆盖,因为既然 消费线程已经读取了,那就不会对视频数据的后续存储、播放产生影 响。

步骤S103、将帧数据写入当前缓存子块c1i,并继续获取针对第一 缓存队列的下一缓存子块c1(i+1)的多路h264视频数据中的下一帧数据。

综上,即使消费线程的读取速度比生产线程的写入速度慢很多, 也能够避免I帧数据在没被消费线程读取之前被覆盖,并且当消费线 程读取到缓存子块c1i时,如果缓存子块c2i有I帧数据,它会从缓存子 块c2i读取I帧数据。可见,本发明实现了保证关键帧(I帧)的完整性, 减少视频数据的跳帧现象,进而保证后续播放视频数据时的流畅度和 完整性的目的。

基于上述本发明实施例所公开的技术方案,在生产线程将数据循 环写入两个缓存队列的过程中(以i作为循环参数),消费线程同样是 一直循环在从这两个缓存队列中读取数据并将读取到的数据存至分布 式存储系统(以j作为循环参数),本发明另一实施例提供了消费线程 的读取过程,请参考图5,具体包括如下内容:

步骤S200、当消费线程对第一缓存队列的缓存子块c1j进行读取 时,判断与第一缓存队列的缓存子块c1j相对应的第二缓存队列中的缓 存子块c2j中是否存有数据;当缓存子块c2j中存有数据时,进入步骤 S201,否则,进入步骤S202。

其中,j=1,2,3,……,N。

步骤S201、对缓存子块c2j中的数据进行剪切,得到待存入数据。

步骤S202、获取缓存子块c1j中的数据作为待存入数据。

可以理解的是,在得到待存入数据之后,还需要返回执行判断与 第一缓存队列的缓存子块c1(j+1)相对应的第二缓存队列中的缓存子块 c2(j+1)中是否存有数据;其中,当j+1>N时,c1(j+1)为c11,c2(j+1)为c21

步骤S203、将待存入数据存储至分布式存储系统。

举例说明,同样是c1i在第一缓存队列中的索引编号为i,c2i在第二 缓存队列中的索引编号也为i。消费线程按照j从1到N的顺序从第 一缓存队列的缓存子块c1j中读取数据,不过在读取之前需要判断与c1j对应的c2j是否存有I帧数据。当c2j中存有数据时,认为原本应该在c1j位 置上的I帧数据被存放至c2j中,所以,将c2j中的I帧数据剪切作为c2j位 置上的数据存入分布式存储系统;当c2j中没有存有数据时,就按正常 直接将c1j作为待存入数据即可。

另外,还可以记录获取针对第一缓存队列的当前缓存子块c1i的多 路h264视频数据中的一帧数据的获取时间;记录将待存入数据存储至 分布式存储系统的存入时间;将获取时间与存入时间之间的差值作为 存储延时。根据这个存储延时,可以确定整个方案的延时性能。

再者,使用的测试视频(即生产线程写入缓存的视频)为带有数 字时钟的h264视频文件,以便于在测试过程中和测试完成后,可以使 用视频播放器打开消费线程产生的文件,观察视频的卡顿情况。

基于上述本发明各实施例所公开的技术方案,在避免I帧数据在 第一缓存队列中被覆盖的基础上,为了进一步保证在第二缓存队列中 I帧数据也不会被覆盖,本发明另一实施例提供了相应的解决方案, 具体内容请参考图6:

步骤S300、在判定针对c1i的帧数据为I帧数据之后,判断与c1i对 应的缓存子块c2i中是否存有数据;当缓存子块c2i中存有数据时,进入 步骤S301,否则,进入步骤S202。

步骤S301、将帧数据写入当前缓存子块c1i,并继续获取下一帧数 据。

步骤S302、将帧数据写入缓存子块c2i,并继续获取下一帧数据。

当缓存子块c2i中存有数据时,认为在上一次循环时生产线程已经 向c2i存入一个I帧数据了,并且由于消费线程在读取第二缓存队列中 的I帧数据时的操作为剪切,因此,c2i中存有数据说明消费线程还未 将其读取出去,这样的话,为避免c2i中的I帧数据被覆盖,就将获取 的帧数据写入c1i,并继续获取下一帧数据。

当缓存子块c2i中没有存有数据时,可直接将获取的帧数据写入c2i

当缓存子块c2i中存有数据时,认为在上一次循环时生产线程已经 向c2i存入一个I帧数据了,并且由于消费线程在读取第二缓存队列中 的I帧数据时的操作为剪切,因此,c2i中存有数据说明消费线程还未 将其读取出去,这样的话,为避免c2i中的I帧数据被覆盖,就将获取 的帧数据写入c1i,并继续获取下一帧数据。当缓存子块c2i中没有存有 数据时,可直接将获取的帧数据写入c2i

综上可以看出,I帧数据能够在两个缓存队列中具有相应索引编 号的缓存子块c1i和c2i之间交替存储,这次存c1i,下次就存c2i,不难理解 的是,这样的存法为每一个I帧数据保证了生产线程两个循环的安全 时间,在一定的消费线程的读取速度比生产线程的写入速度慢的范围 内,根据实际情况设定好这个范围,足够保证在生产线程第三次循环 至c1i之前消费线程已经从c1i或者c2i将I帧数据读取出去。

基于上述本发明实施例提供的基于无锁缓存队列的多路h264视 频数据缓存方法,本发明实施例还提供了一种基于无锁缓存队列的多 路h264视频数据缓存系统,参考图7,该系统700可以包括如下内容:

第一获取单元701,用于获取针对第一缓存队列的当前缓存子块c1i的多路h264视频数据中的一帧数据;

第一判断单元702,用于判断帧数据是否为I帧数据;

写入单元703,用于当帧数据为I帧数据时,将帧数据写入与当 前缓存子块c1i对应的第二缓存队列中的缓存子块c2i,并通知第一获取 单元继续获取针对第一缓存队列的下一缓存子块c1(i+1)的多路h264视频 数据中的下一帧数据;当帧数据不为I帧数据时,将帧数据写入当前 缓存子块c1i,并通知第一获取单元继续获取针对第一缓存队列的下一 缓存子块c1(i+1)的多路h264视频数据中的下一帧数据;当i+1>N时,c1(i+1)为 c11

其中,第一缓存队列C1={c11,c12,…,c1i,…,c1N},第二缓存队列 C2={c21,c22,…,c2i,…,c2N},i=1,2,3,……,N;c1i为第一缓存队列中的第i个缓存子块,c2i为第二缓存队列中与c1i相对应的缓存子块;各缓存子块的内存大小相 等。

本发明中,第一判断单元701还用于在判定帧数据为I帧数据之 后,判断缓存子块c2i中是否存有数据;

写入单元703还用于当缓存子块c2i中存有数据时,将帧数据写入 当前缓存子块c1i,并通知第一获取单元继续获取下一帧数据;当缓存 子块c2i中没有存有数据时,将帧数据写入缓存子块c2i,并通知第一获 取单元继续获取下一帧数据。

本发明中,上述系统700具体还可以包括如下内容:

第二判断单元,用于判断与第一缓存队列的缓存子块c1j相对应的 第二缓存队列中的缓存子块c2j中是否存有数据;j=1,2,3,……,N;

第二获取单元,用于当缓存子块c2j中存有数据时,对缓存子块c2j中 的数据进行剪切,得到待存入数据;当缓存子块c2j中没有存有数据时, 获取缓存子块c1j中的数据作为待存入数据;

存入单元,用于将待存入数据存储至分布式存储系统。

本发明中,上述第二判断单元,还用于在得到待存入数据之后, 返回执行判断与第一缓存队列的缓存子块c1(j+1)相对应的第二缓存队列 中的缓存子块c2(j+1)中是否存有数据;

其中,当j+1>N时,c1(j+1)为c11,c2(j+1)为c21

本发明中,上述系统700具体还可以包括存储延时确定单元,用 于记录获取针对第一缓存队列的当前缓存子块c1i的多路h264视频数 据中的一帧数据的获取时间;记录将待存入数据存储至分布式存储系 统的存入时间;将获取时间与存入时间之间的差值作为存储延时。

需要说明的是,本说明书中的各个实施例均采用递进的方式描 述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施 例之间相同相似的部分互相参见即可。对于系统类实施例而言,由于 其与方法实施例基本相似,所以描述得比较简单,相关之处参见方法 实施例的部分说明即可。

以上对本发明所提供的一种基于无锁缓存队列的多路h264视频 数据缓存方法及系统进行了详细介绍。本文中应用了具体个例对本发 明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理 解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技 术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若 干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号