system: [SYSTEM]

user: 4. 基于Hbase的视频存储模式和实现 4.1. Hbase数据库和存储优势 Hbase是目前主流的分布式大数据库系统，其原型来源于Google的Big Table [ 8 ] ，现已被广泛应用到各个行业 [ 4 ] [ 7 ] 。传统视频数据的存储常常采用文件和数据库相结合的方式，但本文研究海底监测视频的存储，视频中密集内容片段大多持续时间短、出现频率低，分段后呈现为许多独立小视频的形态，而对于稀疏空白段，我们进行压缩存储，用于完整视频的播放。因此，一条视频流在实际存储时会被存放为两种类型、大小不一、数量巨大的视频碎片。如果仍选择用文件的方式去一一存储这些视频碎片，会给视频数据的组织和管理造成巨大困难，同时也会造成文件冗余和数据、元数据一致性维护难问题。为此本文不再采用传统存储方式，而是选择用Hbase大数据库来存储和维护海底监测视频。 4.2. 视频存储实现方案 4.2.1 . 视频分段方法 为了方便论述，先对视频分段的目标进行描述，对于一段视频S，可以将S分成两个子视频段集合G和K，其中G是S中的密集内容视频片段组成的集合，K是S中稀疏空白视频片段组成的集合，例如对于图2中的视频S，分段后G包含{g1， g2， g3， g4， g5}，K包含{k1， k2， k3， k4， k5， k6}。为了划分g和k，我们借助运动目标检测的方法，在诸多视频运动目标检测方法中，背景消减法对固定位置摄像源拍摄形成的视频有很好的运动检测效果 [ 9 ] ，海底监测视频符合该特征，其思想是对视频背景进行建模得到背景帧，然后将后续帧与背景帧作差，用得到的差值衡量视频的运动变化量。本文的分段方法在背景减法的基础上进行，计算公式如下： f B ( x ， y ) = 1 q ∑ k = 1 q f k ( x ， y ) (1) C ( f 1 ， f 2 ) = ∑ x = 1 m ∑ y = 1 n | f 1 ( x ， y ) − f 2 ( x ， y ) | (2) 假定视频帧大小为 m × n ，公式(1)中 f k ( x ， y ) 和 f B ( x ， y ) 分别表示视频帧k和背景帧B在像素点 ( x ， y ) 处的灰度值，取值范围0~255，这里采用了平均值法 [ 9 ] 计算背景，即选取连续q个帧在点 ( x ， y ) 的灰度平均值作为背景帧在该点的灰度值。公式(2)中 C ( f 1 ， f 2 ) 指两帧 中所有像素点的灰度差之和，为了避免正负抵消添加了绝对值，例如 是当前帧 与背景帧 的灰度差， 是相邻两帧的灰度差，这里给灰度差一个阈值T，当当前帧与背景帧的灰度差大于T时，我们认为视频画面出现运动物体。T通过选取一段实际稀疏空白视频测试得到，具体参见文献 [ 10 ] ，本文取T = 6。 下面给出视频分段算法，为了加快分段速度，以图像组gop中的I帧为单位进行运动检测： 算法1中的gop连续是指两个gop在原始视频中相邻。为了减少因噪音或个别物体短暂出现产生的错误分段，设置了连续度c，即至少连续c个gop都是属于运动画面时，我们才将它视为一段密集内容视频段。c的值可以根据实际需要动态调整。 4.2.2 . 密集内容视频的底层特征提取 3.1.1节讲到在关键视频段g存储之前，需要对其进行底层特征提取，以满足基于视频底层特征检索的需要。由于关键视频段g的持续时间一般较短，因此可以从g中抽取一个代表帧来反映视频中出现的监控目标，然后从该帧图像中提取到特征即可作为g的特征。对于持续时间过长的g，不妨先将时长阈值设为T’，若g长度大于T’则对其切分处理。在代表帧的选择和图像特征提取方面，目前图像领域已经有许多成熟的方法，有兴趣的读者可以在该方面进行扩展，这里为了方便讨论后续视频的特征存储和检索，特意选择g中和背景帧灰度差最大的一帧作为代表帧，例如以颜色特征的图像特征提取方法如下：首先将整个颜色值域划分为10个区间，分别对应黑、灰、白、赤、橙、黄、绿、青、蓝、紫，然后对于一帧图像I，采用文献 [ 11 ] 的方式计算该帧图像的主色值，将该值映射到一个颜色区间，如“蓝”色，那么字符“蓝”即可作为该帧图像的颜色特征，并关联到g的co属性。对于其它底层视频特征，方法类同，不再赘述。 4.2.3 . 稀疏空白视频的压缩 目前通用的视频编码器，如H.264/AVC编码器中采用的是固定长度Gop的视频编码结构 [ 12 ] ，由于本文在视频分段时并没有破坏视频的原始编码结构，所以一段稀疏空白视频k是由n个长度相同的gop顺序组合而成，并且这些gop之间有大量时间上的冗余。为了压缩冗余，本文仅保留其中第一个gop (记为p)来记录视频背景信息，用n来记录k中gop的个数。在解压缩时，采用将p重复复制n次的方法得到k。对于视频编码采用的是可变长度的gop编码结构，可以设： (3) 同样将p重复复制n次得到k。虽然损失了时长的精确性，但可以通过播放程序进行调整，这里不再赘述。 4.2.4 . Hbase表设计和存储 前面讨论了密集内容视频g和稀疏空白视频k的数据准备工作，本节阐述如何将其映射到Hbase数据表中去。下面是设计的Hbase视频表，考虑到视频数据不需要版本控制，所以表中没有画出时间戳。 Table 1 Hbase video storage tabl Rowkey (I R ) Data Column family Property video le lo n (I)sh (I)te (I)se (I)co r 1 (id 1 + t 1 + 1) v 1g le 1 lo 1 sh 1 te 1 se 1 co 1 r 2 (id 2 + t 2 + 1) v 2g le 2 lo 2 sh 2 te 2 se 2 co 2 r 3 (id n + t n + 0) v 3k (p) le 3 lo 3 n 3 表1. Hbase视频存储表 每一段视频v会被存储到Hbase的一行记录中，行健结构根据视频标识定义r，具体实现为“id + t + f”，“+”代表字符串的连接，当f = 0代表当前视频段v = k，f = 1代表v = g，这样在查询时可以利用键尾f快速过滤稀疏视频段。上表1以三行数据为例，第1、2为密集内容数据行，第3行为稀疏空白数据行。由于Hbase行健按字典有序，因此这三行数据属于同一条视频流且时间上连续。每行的第一个列族为data列族，里面只有一个列video，在该列中存储原始视频，例如第1、2行存储密集内容视频段g，第3行存储稀疏空白视频段k，这里实际存储的是k压缩后的p。正如4.2.2节讲到g可能因时间过长需要切分的问题，这里也有一个要切分g的理由：对于Hbase的一个字段(cell)，虽然可以最高存储2 GB的数据量，但这样会使Hbase的效率很低，推荐的cell大小为10 MB，所以本文将任何大小超过10 MB的g进行了切分并分行存储。第二个列族为视频属性列族property，它包含2个固定的列：le、lo，因为两类视频记录都有时长和拍摄地点的属性。剩下的列根据需求动态增加，对于密集内容视频记录，在列族property下增加co、sh、te、se列用来存储视频图像特征，而对稀疏空白视频记录增加解压参数列n。这体现了Hbase列的灵活性和允许表稀疏存储的特点。 由于Hbase是列式数据库，它会把同一列族下的数据存储在一起，使得基于某一列的查询速度更快，所以本文选择将数据和属性分到两个不同的列族，使之满足在海量监测视频中基于属性列的快速检索。当然也可以采用更快的方式，即建立二级索引，如H-index或solr + Hbase方案等，本文采用了H-index对特征列建立了二级索引，限于篇幅这里就不再展开。 4.3. Hbase存储容量分析 将视频按照本文方法存入Hbase数据库，占用的存储空间可以用如下方法来计算。假设对一段码率为r Mbps，持续时长为le秒的视频S，S中密集内容部分所占得比例为c，稀疏空白视频段的个数为m，一个gop长度约为1秒，则利用Hbase存储方式存储S占用的空间为：(r × le × c + m × r)/8MB。然而，用传统文件方式存储S所占用的空间为r × le/8MB，两者相比得到的视频压缩率z为： (4) 我们利用若干持续时长约为1小时(3600 s)的海底监测视频，通过回滚播放并求平均值的方式得到c = 0.25，m = 5，代入公式(3)，求得z = 0.251，即本方法可以节省近75%的存储空间。