基于嵌入式視頻存儲(chǔ)的專用文件系統(tǒng)設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
引言
目前的硬盤錄像機(jī)中,基于PC和采集卡的一般采用Windows系統(tǒng),文件系統(tǒng)則多采用NTFS或FAT32;而嵌入式硬盤錄像機(jī)所采用的文件系統(tǒng)則與廠商選擇的嵌入式操作系統(tǒng)及其研發(fā)能力有密切的關(guān)系。目前嵌入式硬盤錄像機(jī)中所采用的嵌入式操作系統(tǒng)有RTOS、pSOS、嵌入式 Linux、VxWorks等,一般也都采用FAT文件系統(tǒng)。
隨著對(duì)硬盤錄像機(jī)需求的增長(zhǎng),傳統(tǒng)FAT格式的文件系統(tǒng)逐漸顯得有些力不從心,例如讀寫效率低,磁盤容量和分區(qū)大小有限制,有文件大小限制,沒(méi)有斷電保護(hù)功能,文件數(shù)據(jù)安全性低等。另外,長(zhǎng)時(shí)間連續(xù)覆蓋使用后會(huì)存在大量文件碎片,降低磁盤使用率。據(jù)不完全統(tǒng)計(jì),硬盤錄像機(jī)(DVR)的故障率60%是由硬盤引起的。這些問(wèn)題在需要高安全性的安防行業(yè)顯得尤為重要,特別是當(dāng)前嵌入式數(shù)字硬盤錄像機(jī)朝高清和高路數(shù)方向發(fā)展的趨勢(shì)下,需要存儲(chǔ)的數(shù)據(jù)量倍增,不解決數(shù)據(jù)存儲(chǔ)的問(wèn)題就不能滿足相關(guān)設(shè)備的安全性和穩(wěn)定性要求。PC系統(tǒng)使用的FAT文件系統(tǒng),對(duì)于長(zhǎng)時(shí)間錄像產(chǎn)生的大數(shù)據(jù)包無(wú)法管理,只能進(jìn)行分包,將一段完整的錄像,分為若干個(gè)小的文件包,如5、10、30 min自動(dòng)形成一個(gè)文件,或者150 MB、200 MB作為一個(gè)文件。這樣容易產(chǎn)生包與包之間丟幀現(xiàn)象。同時(shí),硬盤磁頭需要頻繁地讀寫數(shù)據(jù)與文件索引,磁頭頻繁跳動(dòng),對(duì)于每天十幾~24小時(shí)連續(xù)讀寫硬盤的 DVR系統(tǒng),極易造成硬盤故障。硬盤錄滿后,需要?jiǎng)h除整段文件,但新錄制的文件與老的文件大小不同,由此會(huì)在硬盤上產(chǎn)生大量碎片空間,影響硬盤的使用和系統(tǒng)效率。此外,F(xiàn)AT文件系統(tǒng)用做錄像機(jī)錄像資料管理還存在兩個(gè)風(fēng)險(xiǎn):一是文件分配表如果損壞,則錄像資料大多會(huì)丟失;二是系統(tǒng)突然斷電或遭到人為破壞,當(dāng)前的錄像數(shù)據(jù)不能保存和恢復(fù)。
錄像監(jiān)控行業(yè)的趨勢(shì)是高清晰度和高集成度。高清晰度必然產(chǎn)生更大的數(shù)據(jù)量,原來(lái)一臺(tái)硬盤錄像機(jī)一般只有4路或8路,對(duì)文件系統(tǒng)的要求不是很高。現(xiàn)在16路以上的也已較為普遍,特別是網(wǎng)絡(luò)集中存儲(chǔ)方式出現(xiàn),一臺(tái)設(shè)備可能需要存儲(chǔ)幾十路甚至上百路的視頻數(shù)據(jù),如何可靠、安全、快捷地實(shí)現(xiàn)大量視頻數(shù)據(jù)的存儲(chǔ)和檢索就成為一個(gè)亟待解決的突出問(wèn)題。
為彌補(bǔ)FAT文件系統(tǒng)在媒體數(shù)據(jù)流存儲(chǔ)領(lǐng)域中的不足之處,本文提出一種適合媒體數(shù)據(jù)流存儲(chǔ)方式的硬盤管理文件系統(tǒng),該系統(tǒng)可以高效率地管理整個(gè)硬盤,克服FAT文件系統(tǒng)的固有缺陷。
1 理論分析
本文提出的嵌入式視頻專用文件系統(tǒng)的基本原理是把硬盤所有扇區(qū)劃分為幾個(gè)數(shù)據(jù)區(qū):文件信息區(qū)、索引信息區(qū)和數(shù)據(jù)區(qū)。數(shù)據(jù)區(qū)又劃分為若干個(gè)數(shù)據(jù)塊,數(shù)據(jù)塊的大小可以根據(jù)實(shí)際情況自由設(shè)置。通過(guò)文件信息和索引信息來(lái)管理數(shù)據(jù)塊,即相當(dāng)于把硬盤模擬成傳統(tǒng)的模擬錄像帶,錄像文件長(zhǎng)度可從幾s到幾十小時(shí),數(shù)據(jù)可從幾KB到幾十TB。采用這種硬盤管理方式,克服了FAT系統(tǒng)對(duì)長(zhǎng)時(shí)間錄像管理存在的缺陷。由于數(shù)據(jù)是連續(xù)存儲(chǔ),因此不存在丟幀或丟數(shù)據(jù)的情況,并且每個(gè)扇區(qū)也能實(shí)現(xiàn)均衡讀寫,延長(zhǎng)硬盤使用壽命;硬盤錄滿后,采用數(shù)據(jù)塊覆蓋技術(shù),不存在硬盤碎片,也能最大限度保留磁盤的錄像資料。硬盤任何地方的錯(cuò)誤,不會(huì)影響前面或后面的錄像。在突然斷電的情況下,也能保存斷電前瞬間的圖像。同時(shí),原始錄像資料盤數(shù)據(jù)與PC不兼容,無(wú)法在PC上直接修改和查看,保證原始資料的保密性和安全性。
設(shè)計(jì)思想是把硬盤記錄數(shù)據(jù)的扇區(qū)劃分為一個(gè)一個(gè)的數(shù)據(jù)塊,并通過(guò)索引信息(索引塊)為每個(gè)數(shù)據(jù)塊建立索引,快速定位每個(gè)錄像文件或某個(gè)時(shí)間對(duì)應(yīng)的數(shù)據(jù)塊;通過(guò)每個(gè)數(shù)據(jù)塊的鏈表又可以快速定位相關(guān)聯(lián)的前后數(shù)據(jù)塊的位置。由于同一個(gè)視頻源所產(chǎn)生的視頻數(shù)據(jù)是嚴(yán)格按照時(shí)間來(lái)錄像的,所以同一個(gè)視頻源對(duì)應(yīng)的文件信息、索引信息和數(shù)據(jù)塊在機(jī)制上就保證了嚴(yán)格按照時(shí)間順序來(lái)排序。但由于存在多路視頻和音頻數(shù)據(jù),數(shù)據(jù)的產(chǎn)生和存儲(chǔ)位置是隨機(jī)的,所以必須通過(guò)索引和鏈表來(lái)把這些隨機(jī)的數(shù)據(jù)塊組織成一個(gè)個(gè)獨(dú)立的錄像文件。
2 文件系統(tǒng)結(jié)構(gòu)
對(duì)硬盤所有扇區(qū)進(jìn)行了重新劃分,共劃分為5個(gè)區(qū)域,分別為磁盤信息區(qū)、保留信息區(qū)、文件信息區(qū)、索引信息區(qū)、數(shù)據(jù)區(qū)。
通過(guò)磁盤信息可以找到文件信息、索引信息、數(shù)據(jù)區(qū)及保留信息區(qū)。而通過(guò)文件信息又可得到索引信息,從而通過(guò)索引信息單元找到數(shù)據(jù)塊。這些磁盤區(qū)域的關(guān)聯(lián)關(guān)系如圖1所示。
2.1 磁盤信息區(qū)
磁盤信息區(qū)的位置固定,用于保存當(dāng)前磁盤信息和文件系統(tǒng)基本信息,如記錄每個(gè)區(qū)域的具體位置和大小、信息區(qū)的使用情況、最后數(shù)據(jù)塊位置等。下面為典型的磁盤信息結(jié)構(gòu):
typedef STruct {
UInt32 Formatted;/*格式化標(biāo)志*/
UInt32 DBN_Num;/*總數(shù)據(jù)塊數(shù)*/
UInt32 DBN_Size;/*數(shù)據(jù)塊的大小*/
UInt32 DBN_Begin;/*當(dāng)前可用數(shù)據(jù)塊開(kāi)始地址*/
UInt32 CurrentFAT;/*當(dāng)前所用的分區(qū)*/
UInt32 OtherInfoBlockAddr; /*保留信息區(qū)開(kāi)始扇區(qū)*/
UInt32 OtherInfoBlockSize;/*保留信息區(qū)大小*/
UInt32 FileInfoBlockAddr[2][MAX_CHANNEL]; /*文件信息塊開(kāi)始扇區(qū)*/
UInt32 FileInfoBlockSize;/*文件信息區(qū)大小*/
UInt32 IndexInfoBlockAddr[2][ MAX_CHANNEL];/*索引信息塊開(kāi)始扇區(qū)*/
UInt32 IndexInfoBlockSize;/*索引信息區(qū)大小*/
} DiskInfo;
2.2 保留信息區(qū)
保留信息區(qū)用于保存其他系統(tǒng)信息,如操作日志信息、系統(tǒng)設(shè)置信息等,此區(qū)域大小可自由設(shè)定。
2.3 文件信息區(qū)
文件信息區(qū)用于保存錄像文件的文件信息,如錄像開(kāi)始和結(jié)束時(shí)間,第一個(gè)數(shù)據(jù)塊和最后一個(gè)數(shù)據(jù)塊的位置,索引信息的位置和其他文件信息。每個(gè)文件的數(shù)據(jù)結(jié)構(gòu)和大小固定。通過(guò)文件序號(hào)就可以準(zhǔn)確定位文件信息的具體位置。
文件信息區(qū)分兩個(gè)部分,分別為分區(qū)一和分區(qū)二,用于描述覆蓋前的文件信息和覆蓋后的文件信息。每個(gè)分區(qū)根據(jù)最大文件數(shù)按錄像路數(shù)順序分配存儲(chǔ)空間。
每個(gè)文件信息包含以下信息:文件開(kāi)始時(shí)間和結(jié)束時(shí)間,文件開(kāi)始索引塊地址和結(jié)束索引塊地址,文件開(kāi)始數(shù)據(jù)塊地址和結(jié)束數(shù)據(jù)塊地址等。下面為典型的文件信息結(jié)構(gòu):
typedef struct {
UInt32 FileID;/*文件序號(hào)*/
time_t FileStartTime;/*錄像開(kāi)始時(shí)間*/[!--empirenews.page--]
time_t FileEndTime;/*錄像結(jié)束時(shí)間*/
UInt32 FileStartDBN;/*文件開(kāi)始DBN*/
UInt32 FileEndDBN;/*文件結(jié)束DBN*/
IndexInfoAddr IndexInfoStart;/*索引信息開(kāi)始地址*/
IndexInfoAddr IndexInfoEnd;/*索引信息結(jié)束地址*/
} FileInfo;
2.4 索引信息區(qū)
索引信息區(qū)用于保存錄像文件所使用數(shù)據(jù)塊的索引信息。索引信息也分為兩部分,分別為分區(qū)一和分區(qū)二,用于描述覆蓋前和覆蓋后的索引信息。每個(gè)分區(qū)根據(jù)最大文件數(shù)按錄像路數(shù)順序分配存儲(chǔ)空間。
每個(gè)錄像文件至少需要使用一個(gè)索引塊,每個(gè)索引塊包含N個(gè)索引信息,一個(gè)數(shù)據(jù)塊對(duì)應(yīng)一個(gè)索引信息。每個(gè)索引信息描述下一個(gè)數(shù)據(jù)塊的物理偏離和時(shí)間偏移,每個(gè)索引塊描述本索引塊所描述第一個(gè)數(shù)據(jù)塊的物理地址和時(shí)間偏移。典型的數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct {
UInt8 TimeOffset;/*與上一個(gè)數(shù)據(jù)塊的時(shí)間偏移*/
UInt8 DBNOffset;/*與上一個(gè)數(shù)據(jù)塊的物理偏移*/
} IndexInfo; /*索引信息*/
typedef struct {
UInt16 BeginDBN;/*本索引塊的起始數(shù)據(jù)塊地址*/
UInt16 TimeOffset;/*本索引塊與上一個(gè)索引塊的時(shí)間偏移*/
IndexInfo IndexInfo[N];
} IndexBlockInfo; /*索引塊信息,包含N個(gè)索引信息*/
2.5 數(shù)據(jù)區(qū)
數(shù)據(jù)區(qū)是指整個(gè)磁盤空間除了用于以上文件系統(tǒng)開(kāi)銷外的所有空間,重新劃分為若干個(gè)數(shù)據(jù)塊,數(shù)據(jù)塊的大小可以自由設(shè)置。數(shù)據(jù)塊是指錄像數(shù)據(jù)保存的最小單元,一般以32~512 KB之間為宜,每個(gè)數(shù)據(jù)塊的頭部保留幾個(gè)字節(jié)用于保存本數(shù)據(jù)塊的時(shí)間戳和相關(guān)數(shù)據(jù)塊的地址偏移。
文件系統(tǒng)在使用前需要獲取磁盤的容量和可使用扇區(qū)的大小,并定義一個(gè)最大文件數(shù)。由于文件信息和索引信息需要占用一定的磁盤空間,并且與最大文件數(shù)密切相關(guān),在實(shí)際使用時(shí)定義一個(gè)最小文件的大小,并通過(guò)磁盤容量得到一個(gè)固定的最大文件數(shù),這樣文件信息和索引信息所占用的磁盤空間在整個(gè)磁盤中只占很小的比例。
3 系統(tǒng)實(shí)現(xiàn)
3.1 數(shù)據(jù)的存儲(chǔ)
數(shù)據(jù)的存儲(chǔ)過(guò)程比較簡(jiǎn)單,創(chuàng)建文件的時(shí)候系統(tǒng)自動(dòng)分配一個(gè)唯一的文件號(hào),并通過(guò)文件號(hào)進(jìn)行計(jì)算得到文件信息和索引信息對(duì)應(yīng)的磁盤地址。當(dāng)有足夠一個(gè)數(shù)據(jù)塊大小的數(shù)據(jù)時(shí)打包并保存到當(dāng)前可以使用的數(shù)據(jù)塊,同時(shí)更新文件信息和索引信息。
數(shù)據(jù)存儲(chǔ)的流程如圖3所示??梢钥闯?,只要視頻數(shù)據(jù)緩存到一個(gè)數(shù)據(jù)塊的大小時(shí)就可以進(jìn)行一次存盤。例如,數(shù)據(jù)塊大小為64 KB,對(duì)應(yīng)為512 kbps碼率1 s的視頻數(shù)據(jù),也就是緊急斷電等突發(fā)事故中實(shí)際丟失的視頻數(shù)據(jù)最多是一個(gè)數(shù)據(jù)塊的錄像長(zhǎng)度。由于突然斷電導(dǎo)致文件信息和索引信息沒(méi)有及時(shí)存儲(chǔ),可以在啟動(dòng)的時(shí)候通過(guò)掃描沒(méi)有形成文件的數(shù)據(jù)塊來(lái)進(jìn)行恢復(fù)。即使在最壞的情況下,硬盤的磁盤信息、文件信息及索引信息等都丟失了,完全可以通過(guò)掃描所有的數(shù)據(jù)塊來(lái)重建整個(gè)文件系統(tǒng),這樣極大提高了數(shù)據(jù)的安全性。由于數(shù)據(jù)塊是順序排列,每個(gè)數(shù)據(jù)塊的讀寫幾率幾乎一致,不會(huì)因?yàn)轭l繁讀寫某一個(gè)硬盤扇區(qū)導(dǎo)致壞道或縮短硬盤使用壽命,也提高了系統(tǒng)和數(shù)據(jù)的可靠性。
3.2 數(shù)據(jù)的讀取
數(shù)據(jù)的讀取可以通過(guò)兩種模式進(jìn)行,一種是直接通過(guò)文件號(hào)來(lái)讀取文件,另一種是通過(guò)輸入時(shí)間檢索定位指定的錄像資料。這兩種方式最終都是定位到指定的數(shù)據(jù)塊實(shí)現(xiàn)數(shù)據(jù)的讀取,只要定位了第一個(gè)數(shù)據(jù)塊,就可以根據(jù)數(shù)據(jù)塊的DataBlockInfo來(lái)實(shí)現(xiàn)前/后數(shù)據(jù)塊的讀取,還可以通過(guò)數(shù)據(jù)塊的時(shí)間戳來(lái)實(shí)現(xiàn)高效的快進(jìn)快退等操作。
3.3 數(shù)據(jù)的恢復(fù)
在實(shí)際使用中,不可避免會(huì)出現(xiàn)異常關(guān)機(jī)、斷電、磁盤壞道等問(wèn)題,本系統(tǒng)中數(shù)據(jù)恢復(fù)的流程如圖4所示。在開(kāi)機(jī)后首先檢查文件是否正常關(guān)閉。若是則不需要恢復(fù),否則進(jìn)行數(shù)據(jù)恢復(fù)。先讀取數(shù)據(jù)塊信息,然后檢驗(yàn)數(shù)據(jù)塊信息的合法性,合法則更新相應(yīng)信息。
3.4 錄像資料的檢索和精確定位
在本文件系統(tǒng)中,由于文件信息、索引信息和數(shù)據(jù)塊都是嚴(yán)格按照時(shí)間進(jìn)行記錄的,所以可以采用二分法快速查找到指定錄像時(shí)間的錄像文件,再根據(jù)錄像文件信息的錄像開(kāi)始時(shí)間及索引信息里包含的時(shí)間偏移和地址偏移,就可以快速準(zhǔn)確定位指定錄像時(shí)間的數(shù)據(jù)塊,根據(jù)數(shù)據(jù)塊的幀信息可以準(zhǔn)確定位到某一秒甚至某一幀,這樣就可以實(shí)現(xiàn)快速、準(zhǔn)確的錄像資料檢索。
結(jié)語(yǔ)
本視頻存儲(chǔ)專用文件系統(tǒng)通過(guò)對(duì)嵌入式數(shù)字硬盤錄像機(jī)媒體數(shù)據(jù)的特點(diǎn)深入研究和分析,分別從存儲(chǔ)機(jī)制、檢索機(jī)制、讀取機(jī)制和數(shù)據(jù)恢復(fù)機(jī)制等幾個(gè)方面詳細(xì)闡述設(shè)計(jì)思想和具體的實(shí)現(xiàn)方法。經(jīng)過(guò)相關(guān)產(chǎn)品的嚴(yán)格測(cè)試和大規(guī)模應(yīng)用,證明此文件系統(tǒng)可以很好地滿足實(shí)際應(yīng)用需求,在數(shù)據(jù)讀寫效率、檢索效率、檢索精確度、數(shù)據(jù)安全性和系統(tǒng)穩(wěn)定性等幾方面都達(dá)到了相應(yīng)指標(biāo),實(shí)現(xiàn)了對(duì)媒體流數(shù)據(jù)高效、安全的存儲(chǔ)。