摘要: 基于嵌入式视频存储的特点,分析目前已有的文件系统在视频应用上的不足,提出了适合硬盘录像机的专用文件系统设计方案,并从数据存储、检索、读取和恢复等方面阐述了设计思想及具体实现。经过在相关产品上的应用,表明该文件系统可以实现高效、安全的视频存储。
引言
目前的硬盘录像机中,基于PC和采集卡的一般采用Windows系统,文件系统则多采用NTFS或FAT32;而嵌入式硬盘录像机所采用的文件系统则与厂商选择的嵌入式操作系统及其研发能力有密切的关系。目前嵌入式硬盘录像机中所采用的嵌入式操作系统有RTOS、pSOS、嵌入式 Linux、VxWorks等,一般也都采用FAT文件系统。
随着对硬盘录像机需求的增长,传统FAT格式的文件系统逐渐显得有些力不从心,例如读写效率低,磁盘容量和分区大小有限制,有文件大小限制,没有断电保护功能,文件数据安全性低等。另外,长时间连续覆盖使用后会存在大量文件碎片,降低磁盘使用率。据不完全统计,硬盘录像机(DVR)的故障率60%是由硬盘引起的。这些问题在需要高安全性的安防行业显得尤为重要,特别是当前嵌入式数字硬盘录像机朝高清和高路数方向发展的趋势下,需要存储的数据量倍增,不解决数据存储的问题就不能满足相关设备的安全性和稳定性要求。PC系统使用的FAT文件系统,对于长时间录像产生的大数据包无法管理,只能进行分包,将一段完整的录像,分为若干个小的文件包,如5、10、30 min自动形成一个文件,或者150 MB、200 MB作为一个文件。这样容易产生包与包之间丢帧现象。同时,硬盘磁头需要频繁地读写数据与文件索引,磁头频繁跳动,对于每天十几~24小时连续读写硬盘的DVR系统,极易造成硬盘故障。硬盘录满后,需要删除整段文件,但新录制的文件与老的文件大小不同,由此会在硬盘上产生大量碎片空间,影响硬盘的使用和系统效率。此外,FAT文件系统用做录像机录像资料管理还存在两个风险:一是文件分配表如果损坏,则录像资料大多会丢失;二是系统突然断电或遭到人为破坏,当前的录像数据不能保存和恢复。
录像监控行业的趋势是高清晰度和高集成度。高清晰度必然产生更大的数据量,原来一台硬盘录像机一般只有4路或8路,对文件系统的要求不是很高。现在16路以上的也已较为普遍,特别是网络集中存储方式出现,一台设备可能需要存储几十路甚至上百路的视频数据,如何可靠、安全、快捷地实现大量视频数据的存储和检索就成为一个亟待解决的突出问题。
为弥补FAT文件系统在媒体数据流存储领域中的不足之处,本文提出一种适合媒体数据流存储方式的硬盘管理文件系统,该系统可以高效率地管理整个硬盘,克服FAT文件系统的固有缺陷。
1 理论分析
本文提出的嵌入式视频专用文件系统的基本原理是把硬盘所有扇区划分为几个数据区:文件信息区、索引信息区和数据区。数据区又划分为若干个数据块,数据块的大小可以根据实际情况自由设置。通过文件信息和索引信息来管理数据块,即相当于把硬盘模拟成传统的模拟录像带,录像文件长度可从几s到几十小时,数据可从几KB到几十TB。采用这种硬盘管理方式,克服了FAT系统对长时间录像管理存在的缺陷。由于数据是连续存储,因此不存在丢帧或丢数据的情况,并且每个扇区也能实现均衡读写,延长硬盘使用寿命;硬盘录满后,采用数据块覆盖技术,不存在硬盘碎片,也能最大限度保留磁盘的录像资料。硬盘任何地方的错误,不会影响前面或后面的录像。在突然断电的情况下,也能保存断电前瞬间的图像。同时,原始录像资料盘数据与PC不兼容,无法在PC上直接修改和查看,保证原始资料的保密性和安全性。
设计思想是把硬盘记录数据的扇区划分为一个一个的数据块,并通过索引信息(索引块)为每个数据块建立索引,快速定位每个录像文件或某个时间对应的数据块;通过每个数据块的链表又可以快速定位相关联的前后数据块的位置。由于同一个视频源所产生的视频数据是严格按照时间来录像的,所以同一个视频源对应的文件信息、索引信息和数据块在机制上就保证了严格按照时间顺序来排序。但由于存在多路视频和音频数据,数据的产生和存储位置是随机的,所以必须通过索引和链表来把这些随机的数据块组织成一个个独立的录像文件。
2 文件系统结构
对硬盘所有扇区进行了重新划分,共划分为5个区域,分别为磁盘信息区、保留信息区、文件信息区、索引信息区、数据区。
通过磁盘信息可以找到文件信息、索引信息、数据区及保留信息区。而通过文件信息又可得到索引信息,从而通过索引信息单元找到数据块。这些磁盘区域的关联关系如图1所示。
2.1 磁盘信息区
磁盘信息区的位置固定,用于保存当前磁盘信息和文件系统基本信息,如记录每个区域的具体位置和大小、信息区的使用情况、最后数据块位置等。下面为典型的磁盘信息结构:
typedef STruct {
UInt32 Formatted;/*格式化标志*/
UInt32 DBN_Num;/*总数据块数*/
UInt32 DBN_Size;/*数据块的大小*/
UInt32 DBN_Begin;/*当前可用数据块开始地址*/
UInt32 CurrentFAT;/*当前所用的分区*/
UInt32 OtherInfoBlockAddr; /*保留信息区开始扇区*/
UInt32 OtherInfoBlockSize;/*保留信息区大小*/
UInt32 FileInfoBlockAddr[2][MAX_CHANNEL]; /*文件信息块开始扇区*/
UInt32 FileInfoBlockSize;/*文件信息区大小*/
UInt32 IndexInfoBlockAddr[2][ MAX_CHANNEL];/*索引信息块开始扇区*/
UInt32 IndexInfoBlockSize;/*索引信息区大小*/
} DiskInfo;
2.2 保留信息区
保留信息区用于保存其他系统信息,如操作日志信息、系统设置信息等,此区域大小可自由设定。
2.3 文件信息区
文件信息区用于保存录像文件的文件信息,如录像开始和结束时间,第一个数据块和最后一个数据块的位置,索引信息的位置和其他文件信息。每个文件的数据结构和大小固定。通过文件序号就可以准确定位文件信息的具体位置。
文件信息区分两个部分,分别为分区一和分区二,用于描述覆盖前的文件信息和覆盖后的文件信息。每个分区根据最大文件数按录像路数顺序分配存储空间。
每个文件信息包含以下信息:文件开始时间和结束时间,文件开始索引块地址和结束索引块地址,文件开始数据块地址和结束数据块地址等。下面为典型的文件信息结构:
typedef struct {
UInt32 FileID;/*文件序号*/
time_t FileStartTime;/*录像开始时间*/
time_t FileEndTime;/*录像结束时间*/
UInt32 FileStartDBN;/*文件开始DBN*/
UInt32 FileEndDBN;/*文件结束DBN*/
IndexInfoAddr IndexInfoStart;/*索引信息开始地址*/
IndexInfoAddr IndexInfoEnd;/*索引信息结束地址*/
} FileInfo;
2.4 索引信息区
索引信息区用于保存录像文件所使用数据块的索引信息。索引信息也分为两部分,分别为分区一和分区二,用于描述覆盖前和覆盖后的索引信息。每个分区根据最大文件数按录像路数顺序分配存储空间。
每个录像文件至少需要使用一个索引块,每个索引块包含N个索引信息,一个数据块对应一个索引信息。每个索引信息描述下一个数据块的物理偏离和时间偏移,每个索引块描述本索引块所描述第一个数据块的物理地址和时间偏移。典型的数据结构如下:
typedef struct {
UInt8 TimeOffset;/*与上一个数据块的时间偏移*/
UInt8 DBNOffset;/*与上一个数据块的物理偏移*/
} IndexInfo; /*索引信息*/
typedef struct {
UInt16 BeginDBN;/*本索引块的起始数据块地址*/
UInt16 TimeOffset;/*本索引块与上一个索引块的时间偏移*/
IndexInfo IndexInfo[N];
} IndexBlockInfo; /*索引块信息,包含N个索引信息*/
2.5 数据区
数据区是指整个磁盘空间除了用于以上文件系统开销外的所有空间,重新划分为若干个数据块,数据块的大小可以自由设置。数据块是指录像数据保存的最小单元,一般以32~512 KB之间为宜,每个数据块的头部保留几个字节用于保存本数据块的时间戳和相关数据块的地址偏移。数据块的结构如图2所示。
文件系统在使用前需要获取磁盘的容量和可使用扇区的大小,并定义一个最大文件数。由于文件信息和索引信息需要占用一定的磁盘空间,并且与最大文件数密切相关,在实际使用时定义一个最小文件的大小,并通过磁盘容量得到一个固定的最大文件数,这样文件信息和索引信息所占用的磁盘空间在整个磁盘中只占很小的比例。
3 系统实现
3.1 数据的存储
数据的存储过程比较简单,创建文件的时候系统自动分配一个唯一的文件号,并通过文件号进行计算得到文件信息和索引信息对应的磁盘地址。当有足够一个数据块大小的数据时打包并保存到当前可以使用的数据块,同时更新文件信息和索引信息。
数据存储的流程如图3所示。可以看出,只要视频数据缓存到一个数据块的大小时就可以进行一次存盘。例如,数据块大小为64 KB,对应为512 kbps码率1 s的视频数据,也就是紧急断电等突发事故中实际丢失的视频数据最多是一个数据块的录像长度。由于突然断电导致文件信息和索引信息没有及时存储,可以在启动的时候通过扫描没有形成文件的数据块来进行恢复。即使在最坏的情况下,硬盘的磁盘信息、文件信息及索引信息等都丢失了,完全可以通过扫描所有的数据块来重建整个文件系统,这样极大提高了数据的安全性。由于数据块是顺序排列,每个数据块的读写几率几乎一致,不会因为频繁读写某一个硬盘扇区导致坏道或缩短硬盘使用寿命,也提高了系统和数据的可靠性。
3.2 数据的读取
数据的读取可以通过两种模式进行,一种是直接通过文件号来读取文件,另一种是通过输入时间检索定位指定的录像资料。这两种方式最终都是定位到指定的数据块实现数据的读取,只要定位了第一个数据块,就可以根据数据块的DataBlockInfo来实现前/后数据块的读取,还可以通过数据块的时间戳来实现高效的快进快退等操作。
3.3 数据的恢复
在实际使用中,不可避免会出现异常关机、断电、磁盘坏道等问题,本系统中数据恢复的流程如图4所示。在开机后首先检查文件是否正常关闭。若是则不需要恢复,否则进行数据恢复。先读取数据块信息,然后检验数据块信息的合法性,合法则更新相应信息。
3.4 录像资料的检索和精确定位
在本文件系统中,由于文件信息、索引信息和数据块都是严格按照时间进行记录的,所以可以采用二分法快速查找到指定录像时间的录像文件,再根据录像文件信息的录像开始时间及索引信息里包含的时间偏移和地址偏移,就可以快速准确定位指定录像时间的数据块,根据数据块的帧信息可以准确定位到某一秒甚至某一帧,这样就可以实现快速、准确的录像资料检索。
结语
本视频存储专用文件系统通过对嵌入式数字硬盘录像机媒体数据的特点深入研究和分析,分别从存储机制、检索机制、读取机制和数据恢复机制等几个方面详细阐述设计思想和具体的实现方法。经过相关产品的严格测试和大规模应用,证明此文件系统可以很好地满足实际应用需求,在数据读写效率、检索效率、检索精确度、数据安全性和系统稳定性等几方面都达到了相应指标,实现了对媒体流数据高效、安全的存储。