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