资源描述
3视频存储服务器设计在本章中, 首先介绍了视频监控系统的基本框架, 然后根据视频存储服务器在系统 中的作用定义了服务器的结构,介绍了服务器各模块的功能,最后对服务器的解码模 块、存储模块和检索回放模块提出设计思想。视频监控系统的框架项目是从小型单位或私人家庭等用户的需求特点所设计的视频监控系统, 其结构比 较简单,既考虑到较低的成本,又兼顾用户对系统数字化、网络化的基本要求,一些 硬件设备功能主要是考虑用软件来完成。设计的视频监控系统框架如图所示。图视频监控系统结构图该系统的工作原理是: 摄像头把采集到的模拟视频信号送到编码器, 编码器将收到 的模拟信号编码压缩,并通过网络将编码后的数字信号传送到视频存储服务器;服务 器将原始码流解码成RGB频,然后再经过编码压缩,按照既定的文件组织格式存入 系统的存储硬盘,并等待系统中用户的请求信息。当接收到用户的请求后,服务器读 出缓冲区内的数据,发送模块采用 RTP协议将数据打包,这些数据包通过 UDP协议传 送到网络上的各个用户,用户端接收到数据包后,将数据包放入缓冲区内,并将数据 按顺序和标志进行重组,然后解码模块对其解码,通过调用播放模块对解码后的视频 数据进行实时播放;另一方面,服务器将压缩后的视频信号进行解码,发送到现场监 控电视墙,完成现场实时监控。对于远程用户,服务器起用流媒体服务功能,将客户 请求的数据通过HTTP协议分发到客户端,用户可以对接受到的内容进行播放。视频存储服务器是整个系统的核心, 它集存储服务器、 视频服务器功能与一身, 主 要完成以下工作:视频解码:将前端通过网络传送来的压缩视频进行解码,还原成 RGB原始视频流。视频数据压缩:对解码出的视频流进行压缩,以便存储与网络传输; 网络通信:对压缩后的视频数据和相关的控制信息进行封装,将对摄像机的控制信 息和视频信息封装成支持所定义的协议信息,同时通过相应的通道将这些协议信息以 帧的形式传送到对方,完成通信双方之间的数据传输;视频数据存储:实现对监控 录像数据的统一保存和备份。通过网络获取视频流数据,并以数据块的方式保存在预 分配的磁盘空间中,通过磁盘数据的索引文件保存录像数据信息。监控视频资源检 索回放:用户可以通过检索回放模块对所关注的历史视频文件进行检索,并通过播放 器进行回放。日志管理:对系统的操作和系统故障及处理情况进行记录,供用户检 索查看。分析视频流在后端的处理主要是解码、 存储、检索回放以及对各用户端的传输。 数 据传输是远端用户对视频文件有目的的检索后通过视频存储服务器的流媒体服务功能 完成的,因此,后端视频处理的主要过程可以描述为如图。图后端视频处理主要过程从图中可以看出, 从网络中接收到前端传送过来的视频流后, 视频存储服务器将其 解码成RGB视频;再将解码后的视频进行压缩,变成适合存储的数据格式,然后按照 存储文件的组织策略将这些数据进行规范,完成后将数据存入硬盘;用户可以根据自 己的需要对存储的数据文件进行查找与回放,远程用户查找到的视频文件也能够以流 媒体的形式通过网络传送至用户机,完成远程监控。视频存储服务器的结构所设计的视频存储服务器要完成的主要功能是将前端传送过来的视频信号解码还 原成RGB视频,并进行编码压缩,然后按照存储策略存入存储设备,用户根据自己的 需要对存储设备中的视频数据进行检索与播放。 设计中对视频存储服务器功能划分为 5 个功能模块,得到其功能结构如图所示。图视频存储服务器的主要功能构成各模块的功能定义如下:1) 视频解码模块:主要负责对系统前端通过网络传送来的压缩视频信号进行解压 缩,还原成原始的RGB视频数据。2) 存储管理模块:负责对解码后的 RGB视频数据进行压缩,然后以制定的文件组 织规范将压缩后的数据存放到存储设备上。在数据存储时要求数据占用的空间尽量要小,同时要便于对视频文件进行检索回放。3) 检索回放模块:为用户提供视频录像资源的快速检索接口,用户可以根据需要对视频文件进行检索调用。当用户查找到所需要的文件时,将相应的文件从硬盘上读出, 并将这些数据与相应的控制信息封装成支持既定协议的信息帧,通过网络通道传送到 用户,供用户回放浏览。4) 日志管理模块:主要是记录系统工作时间内的一些重要操作及事件信息,管理用户能够通过管理日志了解系统的工作情况和用户访问情况。5) 系统管理模块:负责系统的初始化工作,主要完成对系统的参数配置、用户权限 管理、设备信息管理、用户请求处理等。视频存储服务器核心模块设计解码模块的设计系统前端编码器所采用的编码标准是编码标准,因此,系统的解码模块同样采用标准。依照标准,整个流程分为5个步骤:帧间和帧内预测(Estimation)、变换(Transform) 和反变换、量化(Quantization)和反量化、环路滤波(LoopFilter)、熵编码 (EntropyCoding)。在设计中按照各部分功能对解码器进行了设计,其功能框图如图所 示。图解码器功能框图从图可以看出,解码器的基本流程设计为:解码器从NAL中接收压缩的比特流,经 过对码流进行熵解码获得一系列量化系数 X;这些系数经过反量化和反变换得到残差数 据D;解码器使用从码流中解码得到的头信息创建一个预测块PRED PREDf残差数据D求和得到图像块数据uF;最后每个uF通过去块滤波得到重建图像的解码块 F。监控系统的视频是由连续的图像帧组成的。 因此,某种意义上说视频解码就是对视 频的图像帧进行解码,解码程序对视频段的解码也可以说是主程序反复调用帧解码函 数的过程。单帧图像的解码流程如图所示。图解码器解码一帧图像过程一帧图像经过视频编码层VCL编解码后产生的码流,在NAL中将这些码流分割成 NAL单元,并对NAL单元进行边界检测,之后对各单元进行去块滤波处理, 并在参考图 像进行存储处理后重建图像帧;NAL单元解码过程包含了不同类型片的解码,而对各类型的片解码首先从码流中读入一个片的编码数据,提取RBSP语法结构,产生宏块片组映射图,并根据当前图像类型对参考图像列表进行初始化,最后完成片的解码;而进 行片解码首先要对参考图像序号数据以及当前宏块解码设置进行初始化。然后从NAL中读入当前宏块的语法元素,以便对宏块进行解码。存储模块设计视频监控系统产生的视频流数据是海量的,这些海量的视频数据文件对系统的存储 系统提出了严峻的考验。为了制定一个合理的存储方案,本文对监控存储方案与以往 存储方案进行了比较,结果如表所示。表监控存储与传统存储文件特性比较项目以往存储监控存储数据库表文本/图像图像/音频数据表现形结构化(有序,可用 统一结构表示)非结构化(无序、无 法用统一结构表示)非结构化(无序、无法用 统一结构表示)数据组织方式非结构化(无序,规 则性不强)非结构化(无序,规 则性不强)结构化(有序,规则性很 强)数据保存时间无序,时长不定无序,时长不定有序,定期删除更新数据更新方式无序,方式不定无序,方式不定有序,从尾部顺序增加数据读写方式无序,反复多次读写无序,反复多次读写有序,一次写少量读/不读存储块大小8-64KB512B-1MB64KB-1MB(512Kb-8Mb)性能要求IOPSIOPS、带宽多路并发的带宽存储热点2/8原则,20%的数据承载80%的访问2/8原则,20%的数据承载80%的访问均衡原则,数据访问的机 会均等数据重要度重要,数据价值高不定大部分是无用数据从表2中可以看出,监控存储虽然数据的表现形式和以往的图像存储一样,体现出无规则的非结构化特征,但是在组织方式上是结构化的,具有很强的规则性,这是其 最大的特点,也是和传统存储模型不一样的地方。鉴于监控视频体现出的非结构化的表现形式和结构化的组织方式,以及其在保存时间、读写方式和更新方式上的有序性,本文考虑从监控视频的自身特点出发,利用视 频编码技术消除其数据上的冗余,减少无用数据占用存储空间,并充分利用监控视频 数据的有序性特征将数据进行规范的组织,实现有序存储,便于对存储设备的均衡访 问和对数据的管理,为录像文件检索与回放提供一种快捷有效的方式。基于上述的思路,课题从视频压缩、文件组织和存储管理三个方面对系统的存储 模块进行设计。1)监控视频的压缩编码数据压缩是解决存储问题最基础最有效的的方法之一。视频监控系统的海量数据的存储光靠硬件设备支持是远远不够的,所以必须对数据进行压缩处理,来减轻存储设 备的负荷。对数据进行压缩有三个方面的好处:节省存储设备空间;节省CPL处理时间;节省数据的传输时间。编码的主要任务是按照所设置的编码压缩参数来完成对这些视频的压缩编码。编码参数主要包括编码器参数和图像编码参数。其中编码器数数主要有源帧率、信道速率 等;图像编码参数主要有图像的格式、编码类型,是否允许非限制运动矢量模式等。 由此看来,对视频数据进行压缩是视频文件存储的一个重要环节。课题中采用的是MPEG压缩编码标准,因为MPEG基于AV对象的压缩模式能够保证 运动物体图像有比较高的图像质量, 更适合于项目中其他任务对运动目标分析的要求。 根据MPEG的编码原理,所设计的压缩编码框图如图所示。图的压缩编码框图MPEG编码器编码过程可以描述为:当视频流输入到编码器,一方面编码器对视频 进行场景分析和对象分割,划分为不同的 VOP将VOR!行形状编码,得到各个 VOP 的形状和位置信息,并用形状编码得到的信息来控制 VOF的运动编码和纹理编码;另 一方面对宏块进行DCT变换和量化,量化后的宏块经过逆量化和反 DCT变换,并将这 些处理后的宏块进行运动编码,在运动编码过程中采用了运动预测/补偿法;输入的VOP 与帧存中的前一帧的VOPS行比较,得到当前块的运动矢量,然后对两帧 VOP的差值 进行DCT变换、量化和纹理编码,得到纹理信息,接着将得到的纹理信息与运动编码 得到的运动信息以及形状编码得到的形状和位置信息进行合成,形成VOP的比特流。分别对不同视频对象的VOP进行编码,得到不同的比特流,再经过视频多路合成,形 成MPEG视频流在信道上传输。2)文件组织文件组织结构设计的主要目的是为了便于系统对文件数据的存储和管理。 因此,本 文对视频存储中的视频文件的命名规则和文件管理策略两个方面制定了可行的方案。 具体方案如下:1)视频文件的命名规则:考虑到在实际应用中,用户在查询录像文件时一般是按 录像的时间、某个摄像机所在的通道以及录像性质为查找条件。为此,课题中提出以 “时间+通道+录像性质”作为录像文件的名称, 其中时间是按年月日时分秒来记录的。 命名格式规范为图所示。图文件名格式规范 操作中,可以按照录像的时间自动为录像文件生成文件名,在系统判断文件是否过期 和用户对文件进行检索回放时,可以按照文件名来进行快速准确的操作。2)文件管理策略:用户会根据不同场所的不同要求对录像文件设定不同的保存期 限,在文件过期后为被删除,留出更多的空间存储更多新的视频数据。因此,录像文 件的改变是相当频繁的,而且系统产生的视频数据量相当大,生成的文件更是一个天 文数字。为了实现对这些海量文件的高效管理,本文将硬盘进行分层管理,其管理模 式如图所示。图硬盘分层管理模式从图中可以看出, 硬盘中为其他类型文件和视频文件分别划分了不同的区, 而在视 频文件中又为不同的通道的视频数据进行了划分,这种管理方式层次比较强,为海量 数据的管理提供了有效的方案。3)管理策略在视频监控系统中,视频文件的存储是一个需要在系统设计中解决好的重要问题, 也是衡量系统性能的一个重要指标。存储管理策略要求有效可靠的存储、简单快捷的 检索回放、合理高效的磁盘空间利用等,以满足用户不同的需求。设计中需要系统中的存储管理能够完成以下四个主要方面的要求:1)存储录像模式:在视频监控系统中,在对文件存储录像的时候都是循环覆盖模 式和线性提醒模式。所谓循环覆盖模式(如图所示) ,就是视频在存储过程中是按盘逐 个进行的。当所有磁盘空间都存储满时接下来的文件将自动覆盖最开始的文件。所谓 线性提醒模式(如图所示)是指视频文件按磁盘逐个存储,当所有磁盘都存满时,系 统提醒用户更换磁盘,这种模式要求存储设备具备热插拔功能。图循环覆盖模式图线性提醒模式2)检索回放:监控系统的检索回放功能要求在视频文件存储的时候要高效、有序 地对文件进行组织,能够按录像通道、录像时间及文件的类型等做好分类存储,以便 用户能够快速有效的在大量文件中检索到自己所需的录像记录,对图像文件处理。3)灵活的存储规模:系统可以根据用户的需求进行存储规模的调整,既可以以单 磁盘作为系统的存储介质,也可以选择用多个硬盘或磁盘阵列作为存储介质,以适应 不同规模的系统在不同现场的存储要求。为了便于对存储盘的管理, 课题将硬盘可以划分为存放系统文件和数据的系统盘和 存放视频监控录像的数据盘两种。实际操作中,对于单盘存储的小规模系统,将盘划 分为这两种逻辑区;对于多个盘的系统,可将一个盘划分为系统盘,剩余的盘则作为 数据盘。系统大量的视频数据存储在数据盘中, 必需一个有效的控制模式来完成对数据盘的 管理才能满足系统对存储性能的要求。为了适应监控系统大量视频数据的存储需要, 设计将硬盘所有扇区划分为几个区:管理控制区、文件结构区、索引文件区、数据区 和日志管理区。数据区又划分为若干个数据块,数据块的大小可以自由设置,并通过 结构信息和索引文件来管理数据块。各区之间的关系可以用图表示。图各区之间的关系1)管理控制区的位置相对比较固定,主要用于存放当前磁盘和文件系统的基本信 息,如每个区域的具体位置和大小、 各分区的使用情况、 下一条可用索引单元的位置、 下一个可用数据块的位置等 .2)日志管理区可以由用户根据磁盘空间来自由设定大小,是专门用来存放日志文 件的区域,完成对日志的管理工作。3)文件结构区主要是用来描述录像文件的结构,存放的是录像文件的相关信息, 如录像起止时间、对应的索引块位置等,其中的信息文件结构和大小比较固定,通过 结构文件的信息就能得到对应的索引信息的准确位置。4)索引信息区用于存放数据块的索引。 因为一个录像文件可能会包含多个数据块, 所以将索引区分成索引块,而每个索引块存放与文件包含的数据块数目相同的索引信 息单元,每个索引信息单元与数据块一一对应, 而每个索引块则与一个录像文件关联。5)数据区是其他四个区划分完后所有剩余空间。将其划分为若干个块,大小自由 设定,以块作为存储录像数据的最小单元来保存监控视频。块的结构定义如图所示。图块的结构定义 设计思想概括为:将数据区划分为若干个小的数据块,大小可以由用户自由设置, 采用这些底层的数据块作为基本存储单元,每个数据块在索引区都有一个对应的索引 单元,记录数据块的位置;当用户给定文件长度后,可以确定一个文件所包含的数据 块的个数N,当存储的数据块达到N时,在索引区生成一个索引块,记录下该文件开始 的数据块的索引单元位置和文件所包含的块数目;在文件结构区建立一个结构信息文 件,将索引块的位置和录像文件开始与结束的时间等信息。这种模式实际上是将录像文件的 “形式外壳” 存放在文件结构区, 而实际数据则以 数据块的形式存储在数据区内,它们是通过索引块和索引单元建立的链表相互关联, 形成一个个视频文件。这种设计的优点在于数据是以数据块的形式存放的, 当进行数据覆盖时, 不像以往 存储方式是以大颗粒的录像文件进行覆盖,而是进行数据块覆盖,所以能够减少磁盘 碎片的产生。由于结构信息和索引文件需要占用一定的磁盘空间,并且与数据块的总数密切相 关,块总数可以根据空间大小与数据块大小得到。由于这类文件所点空间都很小, 因此结构信息和索引文件所占用的磁盘空间在整个磁盘中只占很小的比例。 检索回放模块设计文件系统的设计是为了对随机读写的数据进行管理。 在以往的监控系统中, 视频录 像以文件进行存储, 在录像检索时首先要根据摄像头、 检索的时间查找到相应的文件, 然后再手动定位具体的时间点,再从该时间点回放录像。检索过程中的最小单位是文 件,颗粒度太大,精确度很低,检索效率也比较低,对于一个规模较大的监控系统来 说,存储的视频文件数将以百万计,检索难度是非常大的。设计中为方便用户对视频数据的检索, 索引采用了分级设计, 在索引文件区中建立 索引块,与录像文件关联,记录录像文件的开始数据块的索引位置和文件所包含的索 引单元的个数N,在索引块下又分N个索引单元,分别与文件所包含的数据块对应,通 过索引块和索引单元中的信息构成一个链表,用户通过链表即可找到所需要的数据。 其中索引单元的结构如图所示图索引单元结构 在方案中,在文件结构中结构信息文件是严格按照 “时间 +通道+录像类型”进行命 名的,所以在进行视频检索时可以采用二分法快速查找到指定条件的文件结构信息, 再根据结构信息中的索引块的信息,找到对应的索引块,因为索引块中给出了录像文 件开始数据块的索引信息,在索引信息中又包含了下一个索引单元的位置,所以根据 索引块和索引单元所建立的索引链表即可找到用户需要的录像数据块。理论上,如果 数据块设置恰当,利用这种检索模式可以准确定位到某一秒,甚至可以定位到某一帧 图像,从而实现快速、精确的检索。其步骤如图所示。图录像文件检索步骤 整个搜索方案描述为:首先读取用户所设置的检索条件,按照条件中的通道条件 找到通道相关的文件结构信息;接着从搜索结果中找出与条件中录像性质一致的结 构信息;然后从结果中找出包含所给时间条件的结构信息;查找出满足用户条件的 结构信息后,再根据结构信息中的索引文件信息找出对应的索引文件,然后根据索 引单元的时间信息定位到与查找条件最匹配的索引单元,最后按照索引单元读取相 应数据块中的数据。本章小结本章首先介绍了课题中视频监控系统的框架,从系统框架引入视频存储服务器, 并对其结构进行了分析,阐明了视频存储服务器各模块的功能,然后对各功能模块 提出了设计方案和思路,存储模块作为整个设计的重点,在本章中也对其进行了重 点阐明。4 视频存储服务器的实现 本章根据上一章的设计方案, 介绍了视频存储服务器的实现, 从编解码模块、 视频 录像存储模块和检索回放模块三个方面介绍了实现的具体过程。编解码模块的实现 解码模块的实现从解码器的框图中可以得知,解码器从网络提取层NAL中接收压缩位流,数据元素 经过熵解码和重新排序后产生一组量化系数 X。利用从位流中解码的头信息调整这些系 数,并经过反量化、反变换得到残差数据 D,解码器创建的预测块PRE与 D相加,得 到一个重构的块uF,将uF经过滤波得到每个块的解码 F36。基于这种思路,本文从 NAL单元解码、熵解码、参考帧列表的重排序、反变换和量化、帧间预测的解码处理和 帧内预测的解码处理 6个方面给出实现的过程。1)NAL单元的解码过程NAL单元解码的过程如图所示。图单元解码过程首先从位流中获取NAL单元,从NAL单元的数据中提取RBSP语法结构,然后根据 NAL单元的类型进行解码处理,其输入的是 NAL单元,得到的解码后的当前图像 (CurrPic )的样点值;规范文档中规定:对同一码流,所有解码器必须产生数值上相 同的结果,必须符合规范定义的解码过程标准。在NAL单元的解码过程中,要将NAL单元数据转换成RBSP程序中定义了函数NALUtoRBSP完成此功能。函数定义为:2)熵解码支持两种熵编码方法:上下文自适应的可变长编码(CAVLC和内容自适应编码(CABA)为了能够有效地传送量化的变换系数,CAVLC是一个比较有效的方法,而且 在CAVL(方案中,对于各种语法元素的 VLC码表按照已经传送的语法元素可以进行切 换,改善了熵编码的性能。CAVLC勺解码过程是:首先是初始化,依据所输入的参数得 到块的类型,并输入数据的个数等相关参数。 然后求变量NC并通过NC值来确定所要 查找的表格,其中NA表示与当前块相邻的左边块中非零系数的个数,NB表示与当前块 相邻的上面块中非零的个数。以 Coeff_token 语法元素为入口函数,查表得到非零系 数的个数 TotalCoeffs 、拖尾系数的个数 TrailingOnes 。以 TotalCoeffs 为入口函数, 查表可以得到 TotalZero 值。通过函数 readSymtaxElement_NumCoeffTrailingOnes() 读入 NumCoeff/TrailingOnes 的码字。3) 参考帧列表的重排序重排序的流程如图所示图参考帧列表的重排序流程参考帧列表的重排序主要是为了节省码流。 解码器根据片头码流中的相关语法元素,如 ref_pic_list_reordering_flag_10ref_pic_list_reordering_flag_11reordering_of_pic_nums_dic 、abs_diff_pic_num_minusl等的规定, 进行列表的重排 序。参考图像的重排序信息由函数 ref_pic_list_reordering() 读入4) 反变换和量化与其他的视频编码标准相似,标准采取的是预测残余变换编码。但变换是施加在4X4块上的,没用采用DCT变换,而是用与DCT类似特性的整数变换ICT,因而反变换 没有误差。直流亮度系数的反变换和量化由函数 itrans_2(structimg_par*img) 实现, 函数 voidcopyblock_sp(structimg_par*img,intblock_x,intblock_y)负责将反变换和量化的结果写入解码的亮度帧。5) 帧内预测的解码处理在帧内预测中, 当前编码的宏块上方和左方的宏块用于计算当前宏块的预测值。 当 前宏块与其预测值的差值进一步编码,将其传到解码器。在该比特流中包含了表示预 测方式的相关比特和解码出的残差信号的比特,解码器利用这些相关的比特计算出当 前宏块的预测值,并以这个预测值来恢复图像原始像素值。在帧内预测中,宏块有4种预测方式:4x4亮度块的帧内预测(Intra_4x4 )、16x16 亮度块的帧内预测(Intra_16x16) 、8x8色度块的帧内预测(Intra_chroma),以及PCM 的预测方式(l_PCM)。每个块可选择四种方式其中之一进行帧内预测,所有的类型都支 持两级帧内编码:INTRA-4X4和INTRA-16X16前者分别预测每个4X4亮度块,比较适 合于描述图像细节部分,而后者则是将整个16X16亮度块进行预测,比较适合于图像较平滑区域。对这两种预测类型的色度则进行单独预测。在程序中,帧内模式下 4x4 块的重构由函数 intrapred() 完成。其定义如下:6) 帧间预测的解码处理在解码端,P宏块和B宏块解码时需要进行帧间预测解码处理,处理后输出帧间预测像素矩阵,包括一个16X16的亮度矩阵PRED和两个色度8X8矩阵:PREDc和PREDcb调用函数BType2CtxRef()来设置参考帧的上下文,该函数定义如下:int B Type 2CtxRcf (i nt Hype)1if |biypc4) xiiirnO; cLsc rcltitn I;在亮度模块中,通过对相邻块的预测得到非零系数的数字。此功能由函数predict, nn z(structimg_par*img,i nti,i ntj)来完成。编码模块的实现视频编码是一个反复对图像帧进行编码的过程。本文将编码程序的分为三个步骤: 为编码器创建一个实例、反复调用编码函数对图像帧进行编码、销毁编码器。为此定 义了三个函数 enc_create()、enc_encode()、enc_destroy() 分别完成编码程序的三个 步骤。(1) enc_create()要创建一个编码器首先要为编码器创建一个实例句柄,用该函数创建一个MPEG4编码器句柄,接着在句柄下完成对编码器的参数配置、图像参数获取及空间申请等工 作,以便通过句柄在多路编码时来完成对每一路编码的控制。其流程如图所示。图()编码流程(2) enc_encode()用enc_encode()完成对传入的一个图像帧的编码工作。对输入的一帧图像首先进 行单元划分:以宏块为基本单元进行划分,再由若干宏块在组合成Slice,由Slice再组合成SliceGroup,这样可以确定每个宏块所属的 Slice和SliceGroup。再判断输 33入的一帧图像是l-Frame还是P-Frameo在以上工作完成后,就可以对每个宏块进 行编码了。在对每个宏块都编码完成后,还需要对重构图像进行1/4象素精度插值处理、参考帧缓冲区插入处理等工作。至此,编码一帧的工作才算完成。过程如图所示 图编码一帧图像过程根据编码程序判定或用户强制类型对输入的图像帧进行编码,编码器将编码之后的码流及其长度作为返回值返回,并统计好编码信息。enc_encode()编程流程如图所示。 图()编程流程在enc_encode()函数内部还设计了两个函数 FrameCodel和FrameCodeP由它们真 正完成图像编码操作,分别完成对I帧和P帧的编码。1) I帧编码是为了消除图像帧在空间上的冗余。其编码过程比较简单,其中AC/DC是对宏块变换的第一行和第一列作预测,以进一步增加零系数的数目。其流程为:(如图所示)图帧编码流程表所示的是在I帧编码过程所用到的函数及其功能:表帧编码过程所用到的函数及其功能2) P帧编码是帧间编码,以已经编码、解码重建的图像帧为参考,并插值出若干 个参考帧,并在其中找出最佳匹配块。将当前块与匹配块求差,然后对残差值做离散 余弦变换(DCT、量化和编码。匹配块的运动向量 MV及匹配相似度会因为所用的搜索 算法、所在的窗口的不同而不同。在图像帧P帧编码中,有一定数量的In tra模式的块编码,其他绝大部分为In ter 模式或not_coded不编码模式。算法支持当整整的Intra块编码模式超过一定数量时,强制为 I 帧编码。在编码前,要对整帧做运动估计,判断各宏块属于哪种编码模式。在 P 帧编码中,既有 Inter 块的编码也有 Intra 块的编码,同时对零块不做编码 not_coded ,即跳过该宏块 MBSkip。Inter 为帧间编码,即对残差进行编码。 not_coded 表示当前宏块没有编码,为零 块,则在解码重建时,直接把参考帧的块复制过来作为解码图像,这种块模式的宏 35 块一般都是背景图像。P 帧编码流程如图所示。图帧编码流程表所示的是在 P 帧编码过程所定义的主要函数及其功能: 表帧编码所用的主要函数及其功能 为了保证解码器解码出的图像正确,在创建编、解码器的图像帧空间时 (image_create 函数),应都初始化为确定的相同的值, 否则解码器重建的图像边缘会 出错。(3)enc_destroy()销毁编码器实例对应于创建编码器实例的工作, 即把所有申请的内存释放, 通过反 复调用 Image_destroy() 函数来释放图像序列空间、 当前编码帧的图像空间、 参考帧的 图像空间、参考帧的水平插值帧的图像空间、参考帧的垂直插值帧的图像空间、参考 帧的斜角方向的插值帧的图像空间、 宏块编码空间; 而编码器空间则通过 enc_free() 来释放。 存储模块的实现根据第三章所描述的设计思想, 存储模块的实现包括管理控制区实现、 文件结构区 实现、索引文件区实现、 日志管理区实现和数据区实现 5 个部分。当启动存储功能时, 在管理控制区内找到当前盘及存储路径,然后将视频数据按照磁盘分配策略和文件组 织方式进行存储,并按照用户对文件长度的要求和数据块大小建立相关联的索引块和 索引单元信息,最后将形成索引文件信息反馈给系统,以便系统为录像文件建立相应 的文件结构信息。 管理控制区的建立管理控制区的建立是综合考虑当前盘的可用空间与被访问频度所制定的调度策略 的实现。区内主要存放当前硬盘信息和文件系统基本信息,目的是统一对整个磁盘资 源的调度,提高存储和检索的速度,同时,也使磁盘的各个扇区能够有均等的机会被 访问,避免某个扇区被频繁访问而影响磁盘的性能。管理控制区的实现结构如下:其中max_channel_num是允许的最大通道数,file_struct_area_addr 是一个2*max_cha nnel_num的数组,用来存放覆盖前后的各通道的文件结构信息。通过管理控制区提供的信息, 可以完成对系统中硬盘的管理。 系统运行后, 服务器 与存储设备连接,系统对硬盘进行检测,得到硬盘信息,并根据制定的分区方案将硬 盘进行分区。分区完成后,按照设置的数据块大小生成一系列文件写入各数据块,为 视频数据存储预分配好空间。此时,系统在索引文件区为各数据块生成相应的索引单 元,并按照用户设定的录像文件长度和数据块大小得到一个录像文件所包含的数据块 个数,然后建立索引块,包含所需要的索引单元。而在索引块建立后,系统根据索引 块的信息在文件结构区为录像文件生成相应的结构信息文件。当数据区空间全部分配 完毕,根据各区提供的信息更新管理控制区信息,完成初始化工作。文件结构区的建立结构中保存了录像文件的开始和结束时间,时间是按年、月、日、小时、分、秒来 定义的,时间参数的结构为:Sirutt FILE二TIME (DWORDdwY CUT;LJWORDdmMonth:DWORDdwDjiy;DWORDJ uHnunBWORDdMinuteLWURD kduSccctid;设计中文件名中包含了文件时间、通道号和录像类型其结构为:录像时,视频数据按时间顺序写入数据区, 数据区将这些数据写入数据块。数据在 存储之前要经过压缩,压缩的过程中已经将视频数据的时间、通道号和录像类型等信 息封装在数据里,系统根据这些封装的信息解析后按照设计的文件名格式为文件结构 区中的文件重新命名,并将有关信息存放到相应的结构文件里,完善文件结构信息。 当某个文件要被覆盖时,文件结构中的信息将被置空,为新的文件结构留出空间,而 在索引文件区会记录新文件的索引信息,同时文件结构区也会作相应的更新,以便维 护文件结构的完整性。索引文件区的建立所有的录像文件必须制作了索引文件后才能被点播,否则点播会失败。在索引文件区中一个索引块对应一个录像文件,一个数据块对应一个索引单元,因为一个录像文 件可能包含N个数据块,所以每个索引块包含 N个索引单元。每个索引单元描述对应 数据块的位置以及相邻块的索引单元位置,每个索引块描述块内索引单元所对应第一 个数据块的位置和包含的索引单元数量。索引块结构INDEX_BLOC和索引单元结构INDEX_UNIT的定义如下:索引文件区包含了索引块和索引单元,分别存放录像文件的索引信息和数据块的索 引信息。在数据存储时,写入一个数据块更新一个索引单元的信息;当数据量达到设 置的录像文件大小要求时系统更新索引块信息。当硬盘存满时,系统会按照设置的录 像存储模式进行覆盖或提醒,当选择覆盖模式时,最初的数据将被覆盖。新存入的数 据的信息将发生改变,系统则根据这些新的信息更新索引单元和索引块的信息。 数据区的建立数据区用来存储监控视频录像,与以往的视频监控系统存储有所不同的是, 数据区 被划分成了若干数据块,以数据块作为视频存储的基本单位。对数据的访问需要通过 文件结构区中的结构文件找到相应的索引块,再由索引块找到相关联的数据块,才能 访问到数据区中的内容。但数据区中的数据也是按照指定的块结构进行存储的,以便 于系统对数据的相关索引和结构信息进行完善和恢复。每个块的头部有包含数据块的时间戳和与相邻数据块的偏移。在数据读取时用户可 以通过文件号来读取也可以通过输入时间检索定位指定所要的文件,而这两种文件最 终都是定位到指定的数据块来实现的,而且在定位了一个块后,就可以根据数据块结 构DATA_BLOCK_IN来实现对其前后块的读取,还可以通过结构中的时间戳来实现快 进与快退等操作。在实际应用中,出现异常关机、断电、磁盘坏道等问题,导致文件 没有保存或是文件出现异常,可以在开机后先读取DATA_BLOCK_INF然后检验数据块 信息的合法性,合法则更新相应信息。数据块结构的定义为:初始化时,数据区按数据块大小为视频数据的存储预分配了相应的空间。当视频数据传入时,根据解析的数据包头信息,系统在存储数据块时自动更新数据块内的附加 信息,然后存入视频数据,一个数据块存完后系统将数据的信息反馈给对应的索引单 元,索引单元根据这些信息完成信息的更新。当一个文件完成后,索引块的信息也根据反馈信息进行更新。索引文件更新完后, 系统再将索引信息反馈到文件结构区,供文件结构区完成结构信息的更新。当一个数 据块存满时,数据块将数据块中写入数据的起止时间和与其前后块的地址偏移记录下 来,以附加信息的形式同数据一起存入块中。日志管理区结构定义日志管理区存放系统管理日志,可分为操作日志、报警日志、系统日志和远程日志。用户通过调用函数SetLogToFile()来启用日志文件。当系统出现异常时,如用户 登录、系统报警、设备异常、系统操作等,系统将生成日志文件记录下这些情况。当 调用成功是返回TRUE失败则返回FALSE并调用GetLastError()获取错误信息返回给 用户。其中日志文件的结构定义如下:检索回放模块的实现第三章已经给出了文件名的命名格式,其中包含了时间、通道号和录像类型。在设计中,由于文件结构信息是严格按照“时间 +通道+录像类型”来进行命名的,用户在 检索时根据需要设置好检索条件,系统则根据检索条件在文件结构区中找出与条件相 符合的结构信息文件,通过信息文件得到索引块的位置,然后根据索引块所给的信息 找到首个索引单元的地址,最后按照索引单元中的数据块地址和索引单元链表找到所 需要的录像数据。这样就可以实现快速、准确的录像资源检索。在录像文件查找过程中,用户可以通过调用Fin dFile()函数按录像类型、录像时间和通道号来进行检索,Fin dFile()函数定义为:LONG FindFile fLONGlUscdD./用户 IDLONGIChannclj /MIS 号DWORD dwFikTypc, 文件类型 FLE_TftlE lpSluilTinic, /起始时fiH FLE_T1AIE lptop 】*ie亡谿取时触J该函数指定了查找的录像文件的类型、通道号和查找时间范围,调用成功后,再调用FindNextFile 函数来获取文件信息。FindNextFile 定义为LONGFjndNcxtFik(逐个茯欤奁找列的文件忙息|LONG IFintiHaiidlc. i:件 创础 HET_DVR_FindFile( 的逖冋值FILE INFO IpFindDui叮;/保存丈杵仁恩的亦11查找文件完毕后,调用FindClose接口来关闭文件查找,并释放资源,为下一次查 找留下空间。FindClose定义为:BOOLFindCloscf 关闭文件脊扌趴释啟號源LONG IFindHnndle); 文件責找5柚.NET DVR FirdKikC)I值在实际应用中,用户也可以选择提供的三项条件查找中任意项来进行查找,只要将不需要的条件不作设置(置空)就可以了。而函数中所要求的变量可以在文件名和文 件信息中得到。在查找到所需要的文件后, 可以调用相应函数来对录像文件进行回放, 比如调用函 数PlayBackByName()来按文件名回放、调用 PlayBackByTime()来按时间回放,在回放 函数调用成功后再调用PlayBackControl接口的开始播放控制命令PLAYSTAR才能实 现回放。表是回放过程中用到的几个主要接口函数及其功能。表回放过程用到的主要接口函数及其功能 在对日志文件的查找中则先调用接口函数 FindLogFile() ,获取当前的查找句柄, 其定义为:在 FindLogFile 调用成功后,调用 FindNextLogFile 接口函数逐条获取查找的日志 信息。查找结束后调用 FindLogFileClose 关闭日志查找,释放资源。本章小结本章按照前一章的设计思路对各功能模块进行了实现, 包括编解码模块、 存储模块 的实现检索回放模块的实现。其中,存储模块实现从管理控制区、文件结构区、索引 文件区、数据区和日志管理区四个存储区的建立进行了说明。
展开阅读全文