4、 存储策略的实现
4.1 文件帧索引构造
这里须要说明的是帧索引的概念。一般来说,经过MPEG4编码后的视频数据中包孕I帧、B帧、P帧;同时,在进行解码时能被处置的最小数据单位也是帧。要实现流畅的快进、快退、慢进、慢退等功效就必须能逐帧的查找传送数据,因此有必要建立帧索引记录。在每个文件的数据区后面紧跟着寄存该文件相应的帧索引记录信息可以将帧索引与视频数据有机的联合在一起,同时也可以使各数据文件相对独立。
在具体的实现中,我们将每个文件的大小设为256M+512K字节,前256M为数据区,后512K为帧索引区,这样在512kbit码率的条件下,一个文件大约可以存储60分钟的视频数据。具体的帧索引构造如下:
typedef struct _frame_index
{ unsigned int flag; /*有效性标志*/
unsigned int offset; /*偏移地位*/
unsigned int frame_len; /*帧长*/
unsigned int time; /*达到时光(秒)*/
unsigned int time_ms; /*达到时光(毫秒)*/
}FRAME_INDEX;
在创立空文件时帧索引区被置零,在异常断电后可以根据帧索引区的有效性标志断定文件最后写入数据的地位和时光,从而快速地修复文件索引表。
4.2 文件索引表构造
录像时光段数据构造FRAGMENT_INFO的定义如下:
typedef struct
{ unsigned int start_time; /*起始时光*/
unsigned int end_time; /*停止时光*/
unsigned int data_start_offset; /*数据起始地位*/
unsigned int data_end_offset; /*数据停止地位*/
unsigned int index_start_offset; /*帧索引起始地位*/
unsigned int index_end_offset; /*帧索引停止地位*/
}FRAGMENT_INFO;
录像文件数据构造FILE_INFO的定义如下:
typedef struct
{
BOOL used; /*有效性标志*/
unsigned int serial_number; /*索引号*/
unsigned int channel; /*录像通道*/
unsigned int record_type; /*录像类型*/
unsigned int fragment_num; /*录像时光段个数*/
FRAGMENT_INFO fragment_info[]; /*录像时光段信息*/
} FILE_INFO;
文件索引表构造DISK_INFO的定义如下:
typedef struct
{
BOOL used; /*硬盘有效性标志*/
unsigned long freeMbytes; /*硬盘剩余空间*/
unsigned long totalMbytes; /*硬盘总空间*/
unsigned int max_file_num; /*最大文件数*/
unsigned char file_exist[4096]; /*文件存在标志*/
FILE_INFO file_info[]; /*录像文件信息*/
}DISK_INFO;
4.3 具体实现
体系上电落后行硬盘初始化时,依次反省每个IDE接口,对于存在的硬盘获取其总容量、剩余容量等信息,按总容量以及预设的空文件大小计算出其最多可存储的文件数量。然后在该硬盘上查找索引信息文件index.dat。如果失败,说明该硬盘上没有寄存有效数据,则遵照之前计算所得文件大小在硬盘上分配一个继续空间给index.dat,并开端进行上文所说的创立空文件的工作。在这一进程中,生成的所有空文件的相应FILE_INFO构造中的channel域都被置为0xff,表现不与任何视频输入源关联,将被放入空文件池中。如果查找index.dat胜利,则读出全体内容,得到该硬盘上所有文件的信息,遍历每个文件信息中的最后一个时光段构造,可以断定该文件末端数据是否被损坏,以及是否还有足够的空间写入新数据。对于末端数据被损坏的文件,通过查找其帧索引区回溯到最后一帧正常数据,相应地更新最后一个时光段构造中各域值,完成修复。若还有足够的空间写入新数据,则作为对应于该录像通道的当前存储文件打开以备写入。在对每个挂接到装备的硬盘依次做完同样的操作之后,预初始化工作就算完成了。
体系正常运行时创立两个后台守护进程,一个用于将编码数据写入硬盘;另一个用于定时反省硬盘状况和文件相关状况,确保当前写入数据的文件以及硬盘有足够的空间,必要时进行文件或者硬盘的切换。每得到一帧编码完毕的数据,就分别往视频输入源特定的两个新闻队列中发送新闻,指明该帧数据在编码缓冲区中的偏移、长度以及时光信息,在记录视频数据的同时更新相关的数据索引和帧索引部分。由于数据相关的帧信息随文件存储,因此在读取文件、查找数据、解码播放时都可以便利的以帧为单位进行,大大提高了索引精确度以及在数据回放中进行速度切换等操作时的图像流畅性。
从上面的讨论可以看出,基于此存储策略的所有操作相对于硬盘而言都是独立的。因此可以便利地停滞或开端某个指定硬盘上的文件存储,而不用担忧导致数据纷乱或索引失效。这样就可以保证在部分硬盘无法用于正常存储时不用关机或重启,避免了当前所监控的视频数据丢失。
5、 结语
我们在嵌入式数字视频监控体系中实现了该存储策略,CPU为主频200MHZ的RISC芯片,操作体系为vxWorks。硬盘存储子体系相对独立,接口简略,子体系单独运行时硬盘读写速度在35Mbit/s以上,全体体系在总和20Mbit/s的视频编码数据输入、存储并网络输出这样的苛刻条件下工作稳固可靠,收到了很好的效果。
参考文献
[1] 孔祥营 柏桂枝 “嵌入式实时操作体系VxWorks及其开发环境Tornado” 中国电
力出版社 2002
[2] Wind River Systems,Inc , “Tornado Device Driver Workshop ”
http://www.windriver.com/training 1999
[3] Daniel Robbins,“Software RAID in the Linux 2.4 kernel”
http://www-900.ibm.com/developerWorks/cn/linux/filesystem/raid1 2001
[4] Daniel Robbins,“Advanced filesystem implementors guide”
来源:WatchStor.com
特别声明:本站注明稿件来源为其他媒体的文/图等稿件均为转载稿,本站转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。