研究 | 区块链赋能传统视频安防监控行业
本文由作者“墨菲的时间”授权巴比特首发,未经许可请勿转载。
视频安防监控行业经过几十年的发展,逐渐发展成为一个市场成熟度高、规模庞大的传统行业,其核心产品——基于IP的网络视频监控系统已经成为维护社会治安,实施社会综合治理的核心应用系统,也是实施科技强警,实现整体联防联控联动和快速反应的城市公共安全体系建设的重要组成部分。
传统的网络视频监控系统是由摄像、传输、控制、显示和存储这五大部分组成。部署在各个监控点的摄像机通过IP网络将现场采集到的视频图像传输到控制设备,由控制设备再将视频分发到对应的监视器和存储设备。监控人员可以通过控制设备给摄像机发出指令,从而控制云台来调整摄像机上、下、左、右的角度以及对镜头进行调焦变倍等操作,也可通过控制设备实现在多路摄像机及云台之间进行切换。实时视频流可以分为三路,一路送给监视器,监视器除了显示各个监控点的实时画面外,还能接收并处理实时告警,比如异物闯入划定禁区等;第二路送入存储设备进行存储备份;第三路送入分析设备,该设备可以使用人工智能技术对视频内容进行分析,比如人体行为识别、人脸识别、车辆识别等;存储设备里的视频不但可以对视频进行回放、剪辑等操作,还可以对视频内容进行后期分析,比如人员/车辆轨迹分析等。
传统的网络视频监控系统
传统的网络视频监控系统存在一个严重的弊端,即视频数据被中心机构所掌握,容易被篡改或删除。 比如近几年国内接二连三爆出的幼儿园安全事故。我们从新闻上看到,视频监控资料一般都保存在园方,当执法部门和家长要求查看视频监控时,相关责任人总会以摄像机损坏、硬盘受损等原因导致监控视频丢失或者监控视频中一些关键画面的缺失来推脱,造成执法部门不能有效取证,进而不能快速、有效的惩戒罪犯。虽然在有些城市,幼儿园的实时视频是被要求同时传送给监管部门进行保存,但是对于家长而言,要想查看视频也并非易事。
针对传统网络视频监控的弊端,本文作者在《零基础学区块链》一书中简要介绍了一种基于区块链技术的视频监控系统。该系统能 有效防范视频数据丢失,并实现视频数据丢失检测、恢复,以及视频的提取,从而为调查取证提供强有力的支撑,为社会监管提供有力保障。
以这套系统在幼儿园的场景应用为例,本文将详细介绍该系统的基础架构和各功能模块组件。
整套系统基于联盟链架构,其中幼儿园、管理部门、家长A和家长B(假设有两个家长节点)是联盟链中的节点,它们共同构成P2P视频监控网络。 该系统设立多级管理权限认证,管理部门决定幼儿园节点的进入,幼儿园节点决定家长节点的进入。 视频数据源是由架设在幼儿园教室里的摄像机获取,产生的视频数据除了发送给幼儿园节点,同时也发送给管理部门节点、家长A节点和家长B节点。
这四个节点每次收到视频帧数据后,首先要检查帧数据的安全性,防止有视频帧数据损坏或者有恶意非法数据进入网络,检查通过的视频数据,节点会将它放入视频帧池,同时从视频帧池里面按照视频产生的先后顺序提取若干视频帧来构建视频区块,并等待被记入视频区块链。本系统抛弃传统联盟链选取记账节点的方式,因为传统联盟链毕竟还是属于多中心管理,一旦数据由多中心来管理,那么数据的真实性就会受到质疑。此外,本系统的数据没有急需实时处理的硬性要求,所以这四个节点采用比特币所使用的工作量证明机制来公平竞争记账权,获得记账权的节点有权提议自己构建的视频区块写入视频区块链,将这个视频区块广播给其他节点,由其他节点验证后同步到各自本地的视频区块链上,从而实现全网视频数据的同步。
上述是基于区块链技术的视频监控的大致流程,下面介绍大体的设计方案。
(1)视频创世区块的建立
在教室监控视频数据生成之前,首先创建视频区块链的创世区块,其结构如下图所示:
视频创世区块
创世区块分为两部分,一部分是各路摄像机的IP 地址,另一部分是时间戳,即创世区块的创建时间。 计算所有摄像机IP地址加上时间戳的哈希值,即hash(摄像机IP1 || 摄像机IP2 || … || 摄像机IP N || 时间戳)。将该哈希值放置于访问受限区域,这样能有效保护各路摄像机IP和时间戳不会被篡改。
(2 )摄像机的头区块数据结构
本系统允许每路摄像机创建属于自己的一条视频区块链,视频区块链共同指向同一个视频创世区块,各自链上的第一个区块称为摄像机头区块,其数据结构由三个部分组成:
①创世区块哈希值:简写为pre_iniBlock。该哈希指针指向视频创世区块。
②摄像机IP地址:简写为camera_ip。体现地理位置信息,用于标识采集视频数据的摄像机。
③时间戳:简写为timestamp。表示头区块创建的时间。
本方案中,视频区块链里并不只包含一条区块链,而是根据不同的摄像机IP地址,分别创建对应的视频区块链,后续每路摄像机产生的视频区块可以根据摄像机IP地址来挂到相应的视频区块链上。 每条视频区块链都指向同一个创世区块,如下图所示。
(3)视频数据结构
视频数据结构除了包含一帧完整数据外,还包含摄像机IP、时间戳和帧数据长度。如下图所示。摄像机将帧数据、摄像机IP、时间戳、帧数据长度组装成视频数据,并发送给视频监控网络,每个节点都会收到视频数据。
(4)节点检测视频数据的安全性
视频数据在网络中传播时,难免会因为网络问题出现视频数据全部丢失或者里面关键帧数据丢失的情况,如果是全部丢失,那么后期可以通过从其他节点同步视频数据来解决,但是如果是第二种情况,那么在后期通过视频数据还原视频时会出现错误;此外,还要防范非法数据在网络里传播。所以 节点需要检测视频数据的安全性,包括合法性和完整性。合法性表示该视频数据是否来源于合法的摄像机,即检查视频数据里的摄像机IP是否属于视频创世区块里设置的摄像机IP,如果是非法视频数据,则被最先接收到的节点丢弃,这样能有效防止非法视频数据在网络里泛滥,造成网络拥塞;完整性,即一帧数据的完整性。
由视频数据结构可知,通过比较视频数据中的帧数据长度和接收到的帧数据长度是否一致来判断,如果不一致,则丢弃该数据,把坏帧信息记录到本地告警池里,同时将告警信息向邻居节点广播,邻居节点收到告警信息,根据摄像机ip和时间戳在本地视频帧池里定位该视频数据,如果在池里定位到该数据,则说明邻居节点已经验证通过了这个视频数据的安全性检测,这时就把该视频数据发送给告警节点,告警节点根据该数据重新恢复帧数据;如果没有定位到该视频数据,可能有两个原因,一是邻居节点收到的也是坏帧,二是该视频数据还没有到达邻居节点。
对于前者,邻居节点在接收到坏帧时同样会记录进告警池,因此在收到告警信息后,在本地视频帧池里面没有找到视频数据就去查看告警池,如果告警池里存在则不再转发此告警信息,以防止网络泛洪;对于后者,邻居节点会将告警信息转发给它的邻居节点。告警节点收到其他节点回复的正确视频数据后,会再次检测安全性,检测通过则从告警池里将坏帧信息删除,多个节点的回复数据如果都一致则基本确认恢复的数据是正确可靠的,以防恶意节点回复错误帧。
节点检查视频数据通过后,会将视频数据转发给它的邻居节点,邻居节点同样要作安全性检查。
(5)视频帧池和孤儿池
教室摄像机监控一旦启动后,就会源源不断地往监控网络推送视频流, 通过安全性检测的视频数据被接收节点放在本地的视频帧池里,按照时间戳先后顺序排列 ,这是为了能够及时检测到是否有视频数据丢失,防止后期无法恢复视频,特别是丢失了关键帧。 由于P2P网络可能会存在延时,所以会出现后续时间的视频数据先到节点,如果有些视频数据没有前序视频数据到来就暂时放入视频帧孤儿池。 我们可以假定等待某个时间段,如果超过这个时间段还没有收到缺失的视频数据,那么将缺失信息记入本地告警池,同时向邻居节点广播告警消息,邻居节点收到告警消息后会检查自己的视频帧池里是否含有该视频数据,如果有就发送该数据过去,并不再转发告警消息。如果视频帧池没有则检查告警池,一旦告警池里也存在则不再转发此告警消息。
(6)告警池
告警池主要存放本节点发出的告警信息,在节点收到坏帧或没有收到视频数据时,会将告警信息写入告警池,同时全网广播告警信息。 本系统设计一个集中处理告警的中心进程,会定时去检测每个节点的告警池,如果全网节点都收到坏帧或没收到视频数据,且持续一段时间,就要考虑是否是网络出现问题。
节点重新同步视频数据后,会将相关告警信息从告警池中删除,并通知邻居节点删除相应的告警。
(7)视频区块构建
节点从视频帧池里按照时间戳顺序提取视频数据来构建视频区块,假设以1分钟内的视频数据构建为一个区块, 视频区块的数据结构由视频区块头部数据结构和视频数据梅克尔树结构组成 。视频区块头部数据如下图所示:
视频区块头部数据主要由六部分组成,其他字段设计可以参考《零基础学区块链》里介绍的比特币区块头数据结构:
①临时随机数nonce: 用于工作量证明算法的临时随机数;
②前序区块哈希值pre_H:指向前序视频区块的哈希指针;对于第一个视频区块,其指向的是该视频区块所属的摄像机头区块;
③摄像机IP地址:简写为camera_ip。体现地理位置信息,用于标识采集视频数据的摄像机;
④时间戳:简写为timestamp,视频区块生成的时间;
⑤帧总数:简写为frameCount,摄像机一秒钟生成的帧数,一般为24帧,那么一分钟就是1440帧。可以根据实际情况来确定帧数。该数据用来检测视频数据梅克尔树下面挂接的帧数是否完整;
⑥视频树树根:简写为root_hash,将1分钟内生成的1440个视频数据分别计算哈希值,构成梅克尔树的第一层叶子节点。然后第一层叶子节点两两分组并结合,再次进行哈希计算,其计算结果形成第二层的叶子节点,这样依次将下一层的叶子节点两两分组计算哈希值,得到上一层叶子节点,最后得到单一哈希值, 即树根节点,这样形成梅克尔树结构,如下图所示:
系统要求从视频帧池里面提取的都是时间连续的视频数据才能组成视频区块,如果视频帧池里有视频数据没有到或者丢失,就会导致时间不连续,那么后期提取的视频信息将不完整。
(8)节点竞争区块记账权
各个节点采用工作量证明机制来竞争区块记账权,获得记账权的节点把自己主张的区块挂到本节点的视频区块链上,如下图所示。同时把自己主张的区块通过P2P网络广播给其他节点,这样保证了各个节点的数据同步和数据内容的高度一致性。
(9)节点对视频区块的验证
节点收到视频区块后,停止当前正在进行的工作量证明计算,验证收到的视频区块,主要是验证区块头部是否符合工作量证明要求,其次验证区块里的视频数据里的摄像机IP是否与区块头部里的摄像机IP一致、帧总数是否正确、时间戳是否连续、帧数据是否正确完整,帧数据是否为本地视频帧池里的数据,然后把通过验证的区块挂入本地的视频区块链,同时更新自己的视频帧池,删除里面已经挂链的视频数据。
在视频区块链中,通过验证的区块挂在前序区块上的步骤如下:
①节点通过区块头部数据结构中摄像机IP找到对应的区块链挂链,如果没有找到对应的区块链,则丢弃并产生告警信息,系统提示摄像机IP可能被修改。
②检查新收到的区块头部数据结构中时间戳是否与前序区块头部数据结构中时间戳具备时间连续性,如果时间不连续,则将该区块放入视频区块孤儿池里,等待其父区块到达后再挂链。
通过上述的两个步骤,就将前序区块和当前区块通过哈希值形成了关联关系。
(10)从视频区块链上提取视频
输入需要提取的视频所属的摄像机IP和时间范围,遍历视频区块链上的区块,通过匹配各个区块的时间戳来找到相应的时间段,然后提取该时间段内存储在各个区块里的视频数据,按时间顺序恢复成原始视频。
(11)优化方案
在前面的方案中,视频帧直接存放在节点本地的区块链里,但是摄像机每天产生的视频数据量是非常庞大的,这样会给本地节点的存储造成很大的压力,可以考虑 把视频数据放在云端,而视频区块链里仅存放视频数据在云端的索引值以及视频数据的哈希值,索引值用于定位云端视频数据,而哈希值用于检测从云端提取的视频数据是否完整。 同时为了防止云端存储的数据被篡改,可以考虑 用各个节点的密钥来锁定云端数据,云端数据的修改需要征得所有节点同意,而数据的读取权限则可以只提供访问节点的密钥即可 。
此外,为了防止视频数据被获得记账权的节点所篡改,可以采用 记账节点用自己的私钥对所提议的视频区块签名,其他节点从自己本地的视频池里提取相应的视频数据,再结合记账节点提供的公钥来验证视频数据是否被篡改。
上述只是对基于区块链技术的视频监控系统设计的大体思路,如果有对于区块链技术和比特币基本原理感兴趣的朋友,欢迎大家参考清华大学出版社《零基础学区块链》一书。