一种用于视频监控设备的数据无锁缓存方法和服务器
文献发布时间:2023-06-19 10:16:30
技术领域
本发明涉及视频监控技术领域,尤其涉及一种用于视频监控设备的数据无锁缓存方法和服务器。
背景技术
现有视频监控设备缓存数据都是使用链式拼接缓存,当产生数据流时,临时从系统动态申请所需内存,连接至上一存储结点的末尾,形成链式存储,由于“消费”周期的不确定,且不定期的存在多个“消费者”,而“生产者”数据持续不断,很容易造成数据堆积,导致大量内存不能及时释放。
其中,数据的生产者是指产生数据的电子设备,例如,摄像头采集视频数据流时摄像头生产者;数据的消费者就是指使用数据的电子设备,例如,在屏幕上显示监控视频以及将监控视频存储在硬盘等存储介质上时,显示和存储设备就是消费者。
另外,为保证读写数据的正确性,在读写线程之间加入了互斥锁进行隔离操作,平均每30ms就要进行一次lock/unlock操作,降低了系统cpu的使用效率,同时,也反复动态申请/释放内存,造成大量的内存碎片,导致内存的使用效率低下,进而影响产品存储模块、预览模块的不稳定。还有的方案采用固定大小的环形buffer队列,循环使用,但是由于产品实际运行过程中,每帧数据的大小不固定,此种方式会导致内存的浪费。这些都极大降低了数据的缓存使用效率,导致数据缓存的效率低下的问题。
发明内容
为解决本发明的技术问题,本发明公开一种用于视频监控设备的数据无锁缓存方法和服务器,可以提高数据缓存的效率。
本发明公开一种用于视频监控设备的数据无锁缓存方法,包括:
初始化缓存区,所述缓存区包括索引区和数据区,其中,所述数据区用于存放视频监控设备待处理的数据流;所述索引区用于记录所述数据流存放在所述数据区中的起止位置信息;
当采集到数据流时,对所述数据流进行封装,得到封装后数据,所述封装后数据包括帧头和帧数据;
当所述封装后数据中帧数据的长度超过预设的最大单帧长度时,丢弃所述封装后数据;
当所述封装后数据中帧数据的长度不超过预设的最大单帧长度时,将所述封装后数据存入所述数据区,并将所述封装后数据在所述数据区中的起止位置信息保存到所述索引区中;
当接收到从缓存区进行数据获取的指令时,通过索引区中保存的起止位置信息获取数据区中对应的封装后数据,并发送所述封装后数据。
进一步地,生产者采集的数据流来源于硬件视频编码器中取出的一帧H26x编码视频帧或Mjpeg图像数据以及从麦克风中采集音频数据。
进一步地,所述数据流为硬件视频编码器中的一帧H26x编码视频帧或Mjpeg图像数据,或者麦克风采集的音频数据。
进一步地,所述将所述封装后数据存入所述数据区,并将所述封装后数据在所述数据区中的起止位置信息保存到所述索引区中,包括:
确定所述数据区的环号n,以及所述数据区中的可覆盖空间;
将所述封装后数据依次写入所述可覆盖空间中,并将所述封装后数据在所述数据区中的起止位置信息保存到所述索引区中;
当所述数据区中不存在所述可覆盖空间时,重新将所述数据区全部确定为可覆盖空间,以及将所述数据区的环号更新为n+1。
进一步地,所述通过索引区中保存的起止位置信息获取数据区中对应的封装后数据,包括:
通过读句柄的方式,根据索引区中保存的起止位置信息查找数据区中对应的预取的封装后数据;
判断所述预取数据是否已覆盖或在数据读取的安全距离以内;
当所述预取数据已覆盖或在数据读取的安全距离以内时,则进行数据调整;
否则,根据所述指令所携带的消费模式获取封装后数据。
进一步地,所述进行数据调整,包括:
若所述索引区以及数据区与当前时刻写数据的位置存在跨环,且写数据与读数据之间的距离小于预设的安全距离,则在索引区内依次向前调整,在调整过程中判断是否在安全距离以外且当前帧是IDR帧,是在安全距离以外且当前帧是IDR帧;则将IDR帧的位置信息更新到读句柄中,返回外部调用,调整结束;
若欲取的数据离上一帧存在延迟大于初始化的设定值,在索引区中定位到欲取数据的索引信息,从此位置开始,逐个向前调整,判断写-读之间的帧数差值是否小于初始化的设定值,是则继续判断此帧是否为IDR帧,是IDR帧则将此帧的位置信息更新到读句柄中,返回外部调用,调整结束。
进一步地,所述进行数据调整,包括:
确定消费周期;
若所述消费周期稳定且小于预设周期,则将安全距离或帧间距离调小,
若所述消费周期稳定且大于预设周期,则将安全距离或帧间距离调大。
进一步地,所述根据所述指令所携带的消费模式获取封装后数据,包括:
当所述指令所携带的消费模式为预览应用场景模式时,采用帧方式通过索引区中保存的起止位置信息获取数据区中对应的封装后数据;
当所述指令所携带的消费模式为录像应用场景模式时,采用块方式通过索引区中保存的起止位置信息获取数据区中对应的封装后数据。
进一步地,所述采用帧方式通过索引区中保存的起止位置信息获取数据区中对应的封装后数据,包括:
采用帧方式预取数据时,将从索引区中查找当前最新的数据信息放至读句柄;
其中,所述采用帧方式获取数据是根据读句柄中的信息定位到对应的索引区,通过索引找到数据区中存放数据的位置,获得数据。
进一步地,所述采用块方式通过索引区中保存的起止位置信息获取数据区中对应的封装后数据,包括:
块方式预取数据时,先进行预录调整,将当前有效块数据的起始位置数据信息放至读句柄;
其中,所述块方式预取数据是先判断读句柄中的停止标志位,所述停止标志位表征停止录像,若是停止录像时,则将当前数据区内全部的有效数据信息返回给到读句柄,写入磁盘;若不是停止录像,则等待数据区可读的数据长度大于等于消费者指定大小的数据时,将数据的存储信息返回读句柄,消费进程取出数据。
本发明实施例还提供一种服务器,包括处理器和存储器,所述存储器存储有多条指令;所述处理器从所述存储器中加载指令,以执行本发明实施例所提供的任一种用于视频监控设备的数据流无锁缓存方法中的步骤。
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有多条指令,所述指令适于处理器进行加载,以执行本发明实施例所提供的任一种用于视频监控设备的数据流无锁缓存方法中的步骤。
与现有技术相比,本发明具有如下有益效果:根据产品实际功能,预先开辟对应的缓存区,无需频繁的申请/释放内存,并且根据各帧的实际数据大小进行缓存,合理使用并节省内存资源。不同的数据流写入到对应的存储区即可,各个“消费者”读取数据时,只需维护其自身的“句柄”,无需互斥操作,动态调整安全距离及帧间距,减少跳帧的情况发生,根据本产品的“消费”特征,建立了对应的高效读取机制:流式消费和块式消费,极大的提高了数据的缓存使用效率。此缓存区作为原始数据流和上层应用模块之间的“桥梁”,对音视频数据流(H26x/mjpeg/audio)进行管理,其效率直接影响到视频的实时性、正确性。该缓存区采用索引区+数据区的分层管理方式,用于存储复合流、视频流等数据量较大且逻辑控制较多的数据流。以通道 / 应用类型为标识进行存储,能够根据实际应用环境而灵活应用,环形存储、循环使用。自建安全策略(数据安全)及读取调整措施,防止发生读“脏、旧”数据。并引入“无锁”读取机制,读写隔离,极大地节省了系统资源调用,用户使用视频监控设备体验效果佳。本方案适用于多线程/多进程场景。因此,本方案可以提高数据缓存的效率。
其中,数据的生产者是指产生数据的电子设备,例如,摄像头采集视频数据流时摄像头生产者;数据的消费者就是指使用数据谁的电子设备,例如,监控设备实时在屏幕上显示监控视频以及将监控视频存储在硬盘等存储介质上时,监控设备就是消费者。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例的一种用于视频监控设备的数据流无锁缓存方法的步骤流程图;
图2是生产者写入数据的流程示意图;
图3是消费者按帧方式预取数据以及读取数据的流程示意图;
图4是消费者按块方式预取数据以及读取数据的流程示意图;
图5是写与读之间的距离小于安全距离时数据调整的流程示意图;
图6是预览模式下数据调整的流程示意图;
图7是索引区和数据区存储的示意图;
图8是预取数据的位置示意图;
图9是数据写入缓存区的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明实施例提供一种用于视频监控设备的数据无锁缓存方法,包括:
S101、初始化缓存区,所述缓存区包括索引区和数据区,其中,所述数据区用于存放视频监控设备待处理的数据流;所述索引区用于记录所述数据流存放在所述数据区中的起止位置信息。
如图7所示,所述缓存区包括索引区和数据区;所述数据区用于存放视频监控设备处理的数据流;所述索引区记录数据流在数据区的起止位置信息。
索引区和数据区均可循环写入,通过环号区分不同轮次的写入。
索引区记录的信息包括:索引编号、所在索引区的环号、所在索引区对应的数据区的环号以及所在索引区对应的数据区的起止位置信息等。
设备开机时,根据产品应用功能,初始化缓存区,缓存区的大小根据设备的消费周期来决定,一般缓存3-5秒的数据,根据视频码流大小而定,选择对应的存储结构,预分配缓存区的大小,缓存区包括数据区和索引区。
S102、当采集到数据流时,对所述数据流进行封装,得到封装后数据,所述封装后数据包括帧头和帧数据。
生产者将采集的数据流封装成统一的帧头加帧数据的格式并判断帧数据长度是否超过预设的最大单帧长度,当帧数据长度超过预设的最大单帧长度直接将其丢弃,当帧数据长度不超过预设的最大单帧长度时,将封装好的数据存入数据区并更新对应索引区的信息。
比如,在一些实施例中,所述数据流为硬件视频编码器中的一帧H26x编码视频帧或Mjpeg图像数据,或者麦克风采集的音频数据。
例如,生产者采集的数据流来源于硬件视频编码器中取出的一帧H26x编码视频帧或Mjpeg图像数据以及从麦克风中采集音频数据。
由于数据区的大小有限,无法无限制地存储数据,因此,为了防止数据溢出,可以依次将新写入的数据覆盖着旧有的数据上,比如,在一些实施例中,将所述封装后数据存入所述数据区,并将所述封装后数据在所述数据区中的起止位置信息保存到所述索引区中可具体包括如下步骤:
确定所述数据区的环号n,以及所述数据区中的可覆盖空间;
将所述封装后数据依次写入所述可覆盖空间中,并将所述封装后数据在所述数据区中的起止位置信息保存到所述索引区中;
当所述数据区中不存在所述可覆盖空间时,重新将所述数据区全部确定为可覆盖空间,以及将所述数据区的环号更新为n+1。
其中,可覆盖空间是指数据区中可被覆盖的数据所占有的空间。
每当向数据区中写入新数据时,只有上一轮(环号为n-1时)写入的数据可以被覆盖,本轮(环号为n)写入的数据是不可以被覆盖的。
具体地,在一些实施例中,还可以将数据区的环号n赋予每次写入的封装后数据,即,每次写入封装后数据时,会将当前时刻数据区的环号n作为该封装后数据的环号,如果当前时刻数据区中存有环号为n-1的封装后数据,则将该环号为n-1的封装后数据所占有的空间确定为可覆盖空间。
比如,参考图9,假设封装后数据的大小相同,数据区最多可存储6个封装后数据,初始化环号为1,并将每次存入的封装后数据依次存储在缓存区中,直至第7次时,将封装后数据覆盖在第1次存入的封装后数据上,并将环号更新为2;在第8次时,将封装后数据覆盖在第2次存入的封装后数据上;在第9次时,将封装后数据覆盖在第3次存入的封装后数据上,等等,直至第13次时,将封装后数据覆盖在第7次存入的封装后数据上,并将环号更新为3。
为了便于描述,以下将会将环号更新时的情况称为“跨环”。
需要注意的是,每次写入的封装后数据的大小可以相同也可以不同。
需要注意的是,除了数据区中可以采用如图9所示的写入方式写入封装后数据,索引区中也可以采用如图9所示的写入方式写入封装后数据在数据区中的起始信息位置。
例如,判断当前数据区是否有足够的空间存放封装好的数据,当数据区有足够的空间存放当前封装好的数据时,将封装数据的帧头和帧数据依次写入到数据区,并更新对应的索引区信息;当数据区没有足够的空间存放当前封装好的数据时,将封装好的数据写入下一轮循环的起始位置,并更新对应的索引区信息。
其中,在一些实施例中,如图2所示为生产者写入数据的流程示意图,图2介绍了:
由多个生产者分别从硬件视频编码器中取出一帧H26x编码视频帧或Mjpeg图像数据以及从MIC中采集音频数据送入数据到缓存区,接收数据流存入指定通道的缓存区,封装成统一的格式(帧头Frame Head + 帧数据Frame Data),判断帧数据Frame Data的长度frame_len是否超出设定的最大单帧长度max_frame_size (frame_len ≥ max_frame_size),如果当前的帧数据长度超过预设的最大单帧长度直接将该数据丢弃,最大单帧长度可以根据从硬件视频编码器中取出帧数据的最大码流确定。数据传输异常时可能导致帧数据过大,通过增加判断帧数据Frame Data是否超过预设值来防止异常数据被存储记录导致视频监控设备效率低下。
S103、当所述封装后数据中帧数据的长度超过预设的最大单帧长度时,丢弃所述封装后数据。
S104、当所述封装后数据中帧数据的长度不超过预设的最大单帧长度时,将所述封装后数据存入所述数据区,并将所述封装后数据在所述数据区中的起止位置信息保存到所述索引区中。
比如,当帧数据长度不超过预设的最大单帧长度时则进入如下步骤:
定位通道CHi对应的数据区当前写入位置posj和索引区当前记录位置Idxj,在数据区中,判断buffer数据区是否有足够空间存入当前封装好的数据(帧头Frame Head + 帧数据Frame Data),当数据区有足够的空间存放当前封装好的数据时,则先写入FrameHead,再写入Frame Data,更新数据信息到对应的索引区Idxj,并且将Idxj加1,更新通道CHi管理区参数,当数据区没有足够的空间存放当前封装好的数据时则进入如下步骤:
增加数据区的环号data_circle_no (k),此时将数据流写入下一环data_circle_no(k+1)的起始处,先写Frame Head,再写入Frame Data,更新数据信息到对应的索引区Idxj,并更新通道CHi管理区参数。索引区和数据区均可循环写入,通过环号区分不同轮次的写入。当第k轮写入数据区时没有足够的空间时,直接进行第k+1轮从起始位置开始重新覆盖写入。
例如,在一些实施例中,生产者第1次将封装的数据存放到缓存区的数据区,对应的索引区记录索引编号0、所在索引区的环号0、所在索引区对应的数据区的环号0以及所在索引区对应的数据区的起止位置信息。生产者第2次将封装的数据存放在紧跟第1次存储数据的后面,对应的索引区记录索引编号1、所在索引区的环号0、所在索引区对应的数据区的环号0以及所在索引区对应的数据区的起止位置信息。依次类推。
随着数据的不断写入,索引区记录索引编号不断增加。当生产者第n次将封装的数据预写到数据区发现数据区剩余的空间不足时,此时需要进行数据区的覆盖重写,即将封装的数据写入数据区的开始位置。对应的索引区记录索引编号n-1、所在索引区的环号0、所在索引区对应的数据区的环号增加1由0变为1以及所在索引区对应的数据区的起止位置信息。同理当索引区空间不足时也进行覆盖重写,覆盖重写后对应的索引区的环号也对应增加1。
S105、当接收到从缓存区进行数据获取的指令时,通过索引区中保存的起止位置信息获取数据区中对应的封装后数据,并发送所述封装后数据。
从缓存区进行数据获取的指令是消费者发送的指示设备从缓存区进行数据获取的指令。
消费者根据不同的消费模式从缓存区进行预取数据及获取数据。
其中,预取和获取的定义不同,预取的目的是先将“位置”定好,避免在真正消费(获取数据)时,减少因“数据调整”而带来的耗时。
对于获取,从缓存区进行数据获取的指令可分为用于实时性要求高的预览应用场景下的从缓存区进行数据获取的指令,即帧方式(frame)获取;以及用于实时性要求较高的应用场景下的从缓存区进行数据获取的指令,即块方式(block)获取。
对于预取,从缓存区进行数据预取的指令可分为用于实时性要求高的预览应用场景下的从缓存区进行数据预取的指令,即帧方式(frame)预取;以及用于实时性要求较高的应用场景下的从缓存区进行数据预取的指令,即块方式(block)预取。
例如,当消费模式为对实时性要求高的预览应用场景时,采用帧方式预取或获取;当消费模式为对实时性要求低的录像应用场景时,采用块方式预取或获取;消费者通过读句柄从索引区查找到对应的预取数据,判断预取数据是否已覆盖或在数据读取的安全距离以内,当预取数据已覆盖或在读取的安全距离以内时进行数据调整;否则根据不同的消费模式获取数据。
其中,安全距离就是防止第n+1轮的写覆盖第n轮的读需要保持的最小距离。造成第n+1轮的写会覆盖第n轮的读是由于消费者消费速度(读)远远跟不上生产者生产速度(写)。
当消费模式为对实时性要求较高的应用场景,如实时预览,采用帧方式(流式)读取。当消费模式为对实时性无要求或者要求不高的应用场景,如录像存储,采用块方式(块式)读取。在预取时,将对应的索引区信息放入读句柄中,此时没有拷贝数据区信息到读句柄中。获取时才将数据区信息拷贝到读句柄中。读句柄里面包括的信号包括:索引区环号、数据区环号、索引号、数据起始位置以及数据结束位置。
因此,在一些实施例中,所述根据所述指令所携带的消费模式获取封装后数据,包括:
当所述指令所携带的消费模式为预览应用场景模式时,采用帧方式通过索引区中保存的起止位置信息获取数据区中对应的封装后数据;
当所述指令所携带的消费模式为录像应用场景模式时,采用块方式通过索引区中保存的起止位置信息获取数据区中对应的封装后数据。
其中,采用帧方式预取数据时,将从索引区中查找当前最新的数据信息放至读句柄;所述采用帧方式获取数据是根据读句柄中的信息定位到对应的索引区,通过索引找到数据区中存放数据的位置,获得数据。
其中,块方式预取数据时,先进行预录调整,将当前有效块数据的起始位置数据信息放至读句柄;所述块方式预取数据是先判断读句柄中的停止标志位,所述停止标志位表征停止录像,若是停止录像时,则将当前数据区内全部的有效数据信息返回给到读句柄,写入磁盘;若不是停止录像,则等待数据区可读的数据长度大于等于消费者指定大小的数据时,将数据的存储信息返回读句柄,消费进程取出数据。
其中,在一些实施例中,预取数据包括:
由各个消费者根据各自的“消费”模式调用对应接口从缓存区进行先“预取”数据,整个过程由各个消费者的读句柄read_handle交互,此句柄由各消费者自行维护,读写之间没有进行互斥。帧方式预取则进入步骤A,块方式预取则进入步骤B。
如图8所示,帧方式预取是从当前最新的写位置开始取,块方式预取是从当前数据区中安全距离外的“可读”位置开始取。
步骤A:帧方式预取,消费适用于对实时性要求较高的应用场景,如实时预览,如图3所示,预取数据时,缓存区模块将从索引区Idxj(j = 0,1,...,N)中查找当前最新的写入数据的位置信息放至读句柄read_handle。
步骤B:块方式预取,适用于对实时无要求或要求不高的场景,如录像存储,为提高磁盘I/O读写效率,每次都写入一块等长的数据,该大小由录像模块指定,如:128K、256K、512K等。如图4所示,预取数据时,缓存区模块进行预录调整,将安全距离外当前有效写入数据的起始位置block_index_posj(j = 0,1,...,Nblock)(未覆盖且可读,但不一定是最新的)数据信息放至读句柄read_handle。
例如,在一些实施例中,获取数据可以包括:
由各个消费者将预取得到的读句柄read_handle传入缓存区模块,缓存区模块会首先判断该数据是否已覆盖或在数据读取的安全距离以内(周期性的消费,可能会因为消费耗时过长而导致数据覆盖);是则进入数据调整阶段。否则根据消费模式获取数据,帧方式获取则进入步骤C,块方式获取则进入步骤D。
步骤C:帧方式获取,如图3所示,缓存区模块根据读句柄read_handle中的信息定位到对应的索引区,通过索引Idxj(j = 0,1,...,N)找到数据区中存放数据的位置posj,获得数据。若消费者是呈顺序获取数据,下次获取数据直接传入read_handle即可,无需重复预取数据。
步骤D:block方式获取,如图4所示,缓存区将先判断read_handle中的停止录像标志位,是否此次是停止录像,否则将等待数据区可读的数据长度大于等于消费者指定大小的数据时,才会将数据的存储信息返回读句柄read_handle,消费者取出数据;是则进入如下步骤:
当消费者停止录像时,缓存区模块会将当前数据区内全部的有效数据信息返回给到read_handle,写入磁盘。停止录像需要取完当前所有数据,避免数据丢失。
在读取数据的过程中,缓存区模块会根据“消费”者的应用模式(预览或录像等)来监测并动态调整读取数据的位置,当所要读取的数据被覆盖或读取速度比较延后或被读取数据处于“安全距离”(生产与消费之间的相距差值越小则代表数据将被覆盖的风险越大,避免“写”覆盖“读”,而造成读取错误,所以写与读之间要保持一段距离,先写后读)以内,则进行相应的调整,调整当前读取的索引以获得正确有效的实时数据。
例如,在一些实施例中,所述通过索引区中保存的起止位置信息获取数据区中对应的封装后数据,包括:
通过读句柄的方式,根据索引区中保存的起止位置信息查找数据区中对应的预取的封装后数据;
判断所述预取数据是否已覆盖或在数据读取的安全距离以内;
当所述预取数据已覆盖或在数据读取的安全距离以内时,则进行数据调整;
否则,根据所述指令所携带的消费模式获取封装后数据。
其中,数据调整还包括:根据消费的周期时长,自适应调整安全距离、帧间距离,如消费周期稳定且小于既定周期,则将安全距离或帧间调小,相当于扩大了缓存区的可使用空间,反之,如消费周期稳定且大于既定周期,则适当加大安全距离或帧间,使其稳定消费,减少发生跳帧情况。
例如,在进行数据调整时,可以确定消费周期;若所述消费周期稳定且小于预设周期,则将安全距离或帧间距离调小,若所述消费周期稳定且大于预设周期,则将安全距离或帧间距离调大。
比如,判断欲读取的数据是否处于“安全距离”以内,是则进入如图5所示的步骤,否则,继续判断是否欲读取的数据是否离上一帧存在延迟(初始化时设定的参数),是则进入如图6所示的步骤。
如图5所示,此调整策略一般用于视频监控产品的录像。“消费者”传入的欲读取read_handle(读句柄)的索引区以及数据区,与此刻最新的写数据位置存在“跨环”,“写”与“读”之间的距离小于安全距离,则在索引区内依次向前调整,读数据依次向前调整就是加快读取,防止第n+1轮的写数据覆盖第n轮的读数据。
数据存在“跨环”且读写之间的距离小于预设的安全距离,则需要拉大距离,防止第n+1轮(环号n)的Write覆盖第第n轮(环号n-1)的Read(对应图5)。
例如,假设缓存区的大小为X,依次向数据区中写入数据,每次写入的数据的长度均为x,假设6x>X,7x 在跨环后,第八次写入的数据覆盖在缓存区中第二次写入的数据上(此时缓存区中只存储有第3~7次写入的数据),等等。 调整一次将进入下述步骤: 在调整过程中,判断是否在安全距离以外且当前帧是IDR帧,是则将此帧的位置信息更新到read_handle中,返回外部调用,调整结束。否则再次进入如图5所示的步骤。 比如,在一些实施例中,所述进行数据调整,包括: 若所述索引区以及数据区与当前时刻写数据的位置存在跨环,且写数据与读数据之间的距离小于预设的安全距离,则在索引区内依次向前调整,在调整过程中判断是否在安全距离以外且当前帧是IDR帧,是在安全距离以外且当前帧是IDR帧;则将IDR帧的位置信息更新到读句柄中,返回外部调用,调整结束; 若欲取的数据离上一帧存在延迟大于初始化的设定值,在索引区中定位到欲取数据的索引信息,从此位置开始,逐个向前调整,判断写-读之间的帧数差值是否小于初始化的设定值,是则继续判断此帧是否为IDR帧,是IDR帧则将此帧的位置信息更新到读句柄中,返回外部调用,调整结束。 如图6所示,此调整策略一般用于视频监控产品的实时预览(如网络传输或USB传输实时视频),保证能获取到最新的实时数据,因为“消费”越慢时,所取到的数据就会越“旧”,而“消费– 生产”之间的间距就会越来越大,并非当前实时数据,严重影响了视频传输的实时性。若欲读取的数据距离此刻最新写数据的位置之间的帧数量(即索引区存放的索引编号)差值大于所设定的数值(初始化时设定),则进入如下步骤: 在索引区中定位到欲读取数据的索引信息,从此位置开始,逐个向前调整,读数据依次向前调整就是加快读取,使读数据的索引编号增大逐渐追上写数据的索引编号。使读数据紧跟写数据后面保证数据的实时性。判断写-读之间的帧数差值是否小于初始化的设定值,只有写-读之间的帧数差值小于初始化的设定才能保证数据的实时性。设定的初始值越小,实时性越高,当写-读之间的帧数差值是小于初始化的设定值则继续判断此帧是否为IDR帧,是则将此帧的位置信息更新到读句柄read_handle中,返回外部调用,调整结束。否则继续步骤如图6所示的步骤。 根据产品实际功能,预先开辟对应的缓存区,无需频繁的申请/释放内存,并且根据各帧的实际数据大小进行缓存,合理使用并节省内存资源。不同的数据流写入到对应的存储区即可,各个“消费者”读取数据时,只需维护其自身的“句柄”,无需互斥操作,动态调整安全距离及帧间距,减少跳帧的情况发生,根据本产品的“消费”特征,建立了对应的高效读取机制:流式消费和块式消费,极大的提高了数据的缓存使用效率。此缓存区作为原始数据流和上层应用模块之间的“桥梁”,对音视频数据流(H26x/mjpeg/audio)进行管理,其效率直接影响到视频的实时性、正确性。该缓存区采用索引区+数据区的分层管理方式,用于存储复合流、视频流等数据量较大且逻辑控制较多的数据流。以通道 / 应用类型为标识进行存储,能够根据实际应用环境而灵活应用,环形存储、循环使用。自建安全策略(数据安全)及读取调整措施,防止发生读“脏、旧”数据。并引入“无锁”读取机制,读写隔离,极大地节省了系统资源调用,本方案适用于多线程/多进程场景。因此,本方案可以提高数据缓存的效率。 本发明实施例还提供一种电子设备,该电子设备可以为终端、服务器等设备。其中,终端可以为手机、平板电脑、智能蓝牙设备、笔记本电脑、个人电脑,等等;服务器可以是单一服务器,也可以是由多个服务器组成的服务器集群,等等。 在本实施例中,将以本实施例的电子设备是服务器为例进行详细描述,比如,具体来讲: 该服务器可以包括一个或者一个以上处理核心的处理器、一个或一个以上计算机可读存储介质的存储器、电源、输入模块以及通信模块等部件。本领域技术人员可以理解,服务器可以包括更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中: 处理器是该服务器的控制中心,利用各种接口和线路连接整个服务器的各个部分,通过运行或执行存储在存储器内的软件程序和/或模块,以及调用存储在存储器内的数据,执行服务器的各种功能和处理数据,从而对服务器进行整体监控。在一些实施例中,处理器可包括一个或多个处理核心;在一些实施例中,处理器可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器中。 存储器可用于存储软件程序以及模块,处理器通过运行存储在存储器的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据服务器的使用所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器还可以包括存储器控制器,以提供处理器对存储器的访问。 服务器还包括给各个部件供电的电源,在一些实施例中,电源可以通过电源管理系统与处理器逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。 该服务器还可包括输入模块,该输入模块可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。 该服务器还可包括通信模块,在一些实施例中通信模块可以包括无线模块,服务器可以通过该通信模块的无线模块进行短距离无线传输,从而为用户提供了无线的宽带互联网访问。比如,该通信模块可以用于帮助用户收发电子邮件、浏览网页和访问流式媒体等。 尽管未示出,服务器还可以包括显示单元等,在此不再赘述。具体在本实施例中,服务器中的处理器会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器中,并由处理器来运行存储在存储器中的应用程序,从而实现各种功能,如下: 初始化缓存区,所述缓存区包括索引区和数据区,其中,所述数据区用于存放视频监控设备待处理的数据流;所述索引区用于记录所述数据流存放在所述数据区中的起止位置信息; 当采集到数据流时,对所述数据流进行封装,得到封装后数据,所述封装后数据包括帧头和帧数据; 当所述封装后数据中帧数据的长度超过预设的最大单帧长度时,丢弃所述封装后数据; 当所述封装后数据中帧数据的长度不超过预设的最大单帧长度时,将所述封装后数据存入所述数据区,并将所述封装后数据在所述数据区中的起止位置信息保存到所述索引区中; 当接收到从缓存区进行数据获取的指令时,通过索引区中保存的起止位置信息获取数据区中对应的封装后数据,并发送所述封装后数据。 以上各个操作的具体实施可参见前面的实施例,在此不再赘述。 因此,本方案可以提高数据缓存的效率。 本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。 为此,本发明实施例提供一种计算机可读存储介质,其中存储有多条指令,该指令能够被处理器进行加载,以执行本发明实施例所提供的任一种用于视频监控设备的数据流无锁缓存方法中的步骤。 例如,该指令可以执行如下步骤: 初始化缓存区,所述缓存区包括索引区和数据区,其中,所述数据区用于存放视频监控设备待处理的数据流;所述索引区用于记录所述数据流存放在所述数据区中的起止位置信息; 当采集到数据流时,对所述数据流进行封装,得到封装后数据,所述封装后数据包括帧头和帧数据; 当所述封装后数据中帧数据的长度超过预设的最大单帧长度时,丢弃所述封装后数据; 当所述封装后数据中帧数据的长度不超过预设的最大单帧长度时,将所述封装后数据存入所述数据区,并将所述封装后数据在所述数据区中的起止位置信息保存到所述索引区中; 当接收到从缓存区进行数据获取的指令时,通过索引区中保存的起止位置信息获取数据区中对应的封装后数据,并发送所述封装后数据。 其中,该存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。 根据本申请的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令。 由于该存储介质中所存储的指令,可以执行本发明实施例所提供的任一种用于视频监控设备的数据流无锁缓存方法中的步骤,因此,可以实现本发明实施例所提供的任一种用于视频监控设备的数据流无锁缓存方法所能实现的有益效果,详见前面的实施例,在此不再赘述。 因此,本方案可以提高数据缓存的效率。 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
- 一种用于视频监控设备的数据无锁缓存方法和服务器
- 一种用于视频监控设备的数据无锁缓存方法和服务器