监控系统之硬盘录像机(DVR)
[ 2006-07-29 14:58:20 | 作者: 痉挛的老鸨 ]
之前断断续续的写了几篇文档,时间久了,也不想就这么消失不见,所以合并在一起,在加上一些修饰,再次发布一遍。http://www.heybrain.com 首发,如有转载,请务必保留网站连接。
前言
经过几年的开发,对硬盘录像机产生了一些厌倦,但是有些东西还是值得纪录的,所以就写了这个技术整理。目的是为了记录一些曾经的经验和教训,聊做纪念。某些不清楚的部分不会抄一些文章过来充数,也不会为了让文字看起来比较丰满而作过多的资料调查,所以如果在阅读的过程中有任何不适或者不满,可自行离场,谢谢。
整个文档会从全局到细节,再从细节返回全局,先对整体设计、环境、行业现状进行描述,列举一些应该深入的方向,然后进行详细的叙述,最后再对整体进行一次勾勒。由于某些部分涉及技术机密,所以描述不会很清楚,还请见谅。
开篇
90年左右,第一批涉足视频监控的企业开始在国内出现,比如北京的行者等。这个阶段由于硬件的昂贵价格和硬件能力的约束,以及是软件开发上的约束,很多东西无法实现,所以在这一阶段,视频监控还是以模拟为主,就是架设好摄像头,再将视频线、云台控制线等连接到控制机房,机房内放置对应的监视器(其实就是电视机的改装体,甚至在一些地方,就是直接用老式的黑白电视机来代替)。然后将视频头接入监视器,云台控制线接入云台控制器。这时的云台控制器大多直接从国外进口,其包含的技术含量并不高,但物以稀为贵,价格还是很高的。某些场合下并不需要云台控制,所以只需监视器和录像机即可工作。但用录像带录制有一些天生存在的问题,比如录像时间不够长,磁带保存困难。为了有更长的录制时间,制造商们制造出了超常的录像带,尺寸比较大,给运送和保存造成了一定困难。即便如此,一卷录像带也不过能录制2个小时的影像,就是说每隔2个小时就需要更换一次录像带。由于录像带使用的是感光方式的光学胶卷,所以要长时间保存就对环境有比较高的要求,而且由于尺寸比较大,造成保存空间比较大。同时,由于录像带不可中断的特点,若要临时查看现场录像,只能将正在录制的录像带中断,之后这卷录像带上还未录制的部分就无法再次利用了,一般只能报废,从而产生无法避免的浪费。
不管怎样,模拟的监控系统还是满足了绝大多数的需求,可以很好的工作。在此说句题外话,个人觉得国内的开发人员都有一...
阅读全文...
前言
经过几年的开发,对硬盘录像机产生了一些厌倦,但是有些东西还是值得纪录的,所以就写了这个技术整理。目的是为了记录一些曾经的经验和教训,聊做纪念。某些不清楚的部分不会抄一些文章过来充数,也不会为了让文字看起来比较丰满而作过多的资料调查,所以如果在阅读的过程中有任何不适或者不满,可自行离场,谢谢。
整个文档会从全局到细节,再从细节返回全局,先对整体设计、环境、行业现状进行描述,列举一些应该深入的方向,然后进行详细的叙述,最后再对整体进行一次勾勒。由于某些部分涉及技术机密,所以描述不会很清楚,还请见谅。
开篇
90年左右,第一批涉足视频监控的企业开始在国内出现,比如北京的行者等。这个阶段由于硬件的昂贵价格和硬件能力的约束,以及是软件开发上的约束,很多东西无法实现,所以在这一阶段,视频监控还是以模拟为主,就是架设好摄像头,再将视频线、云台控制线等连接到控制机房,机房内放置对应的监视器(其实就是电视机的改装体,甚至在一些地方,就是直接用老式的黑白电视机来代替)。然后将视频头接入监视器,云台控制线接入云台控制器。这时的云台控制器大多直接从国外进口,其包含的技术含量并不高,但物以稀为贵,价格还是很高的。某些场合下并不需要云台控制,所以只需监视器和录像机即可工作。但用录像带录制有一些天生存在的问题,比如录像时间不够长,磁带保存困难。为了有更长的录制时间,制造商们制造出了超常的录像带,尺寸比较大,给运送和保存造成了一定困难。即便如此,一卷录像带也不过能录制2个小时的影像,就是说每隔2个小时就需要更换一次录像带。由于录像带使用的是感光方式的光学胶卷,所以要长时间保存就对环境有比较高的要求,而且由于尺寸比较大,造成保存空间比较大。同时,由于录像带不可中断的特点,若要临时查看现场录像,只能将正在录制的录像带中断,之后这卷录像带上还未录制的部分就无法再次利用了,一般只能报废,从而产生无法避免的浪费。
不管怎样,模拟的监控系统还是满足了绝大多数的需求,可以很好的工作。在此说句题外话,个人觉得国内的开发人员都有一...
阅读全文...
不知道缘由的,前天中午忽然感冒了,在骄阳似火的夏日午后,我很勇敢的感冒了。硬挺着,到了下午,开始浑身发热,哈,发烧来了。又过了一段时间,第一声咳嗽也来了,扁桃体开始庄严宣布:发炎了。此时,三位一体,白细胞开始进入癫狂状态,意识中只留下一个感觉:热!
折腾了一个下午,当我正在体验嘴巴喷火的时候,同学来了个电话,约我出去谈事情,于是晕头转向的去了一家咖啡馆。在空调的大力摧残之下,我居然冷汗淋漓,再加上不断的吸鼻子,到后来耳朵也开始有些背气了。谈完事情,又来我家待了几个小时,等把他们送走,我已经彻底不行了,躺下来开始倒气.....
吃了一片白加黑,没有黑片了,只好弄了一片白片,结果这一夜折腾的,一直没睡着,浑身热呼呼的,嘴巴喷火,手指喷火,后背喷火,胳膊喷火,脚底更是早已烤糊。最可气的是居然不出汗,不断的喝水,一会就要直奔厕所,撒出来的尿都是烫的,但就是不出汗。无奈的感受着烈火焚身的滋味,从天黑到天明。
昨天早上晕乎乎的,除了吃药,什么都吃不下了,水喝的太多,估计胃酸都被冲淡了,再喝水已经感觉反胃了。在绝食、绝水、绝一切的时候,还是有不能绝的若干客户电话进来骚扰,一边咳嗽着一边讲话,我在电话这头猜想:电话那头是不是很想离话筒远一些,再远一些.....
一天就这么昏沉沉的过去,又是一夜,今天早上醒来,忽然发现,毛病基本好了,上磅再一秤,哈,瘦了3、4斤,也算因祸得福了。看来这生病嘛,也不全是坏事.....
2006-07-28 13:41
折腾了一个下午,当我正在体验嘴巴喷火的时候,同学来了个电话,约我出去谈事情,于是晕头转向的去了一家咖啡馆。在空调的大力摧残之下,我居然冷汗淋漓,再加上不断的吸鼻子,到后来耳朵也开始有些背气了。谈完事情,又来我家待了几个小时,等把他们送走,我已经彻底不行了,躺下来开始倒气.....
吃了一片白加黑,没有黑片了,只好弄了一片白片,结果这一夜折腾的,一直没睡着,浑身热呼呼的,嘴巴喷火,手指喷火,后背喷火,胳膊喷火,脚底更是早已烤糊。最可气的是居然不出汗,不断的喝水,一会就要直奔厕所,撒出来的尿都是烫的,但就是不出汗。无奈的感受着烈火焚身的滋味,从天黑到天明。
昨天早上晕乎乎的,除了吃药,什么都吃不下了,水喝的太多,估计胃酸都被冲淡了,再喝水已经感觉反胃了。在绝食、绝水、绝一切的时候,还是有不能绝的若干客户电话进来骚扰,一边咳嗽着一边讲话,我在电话这头猜想:电话那头是不是很想离话筒远一些,再远一些.....
一天就这么昏沉沉的过去,又是一夜,今天早上醒来,忽然发现,毛病基本好了,上磅再一秤,哈,瘦了3、4斤,也算因祸得福了。看来这生病嘛,也不全是坏事.....
2006-07-28 13:41
2006年7月22日,下午,阵雨
[ 2006-07-22 17:46:40 | 作者: 痉挛的老鸨 ]
刚才一阵暴雨,下的天昏地暗,现在慢慢停了,幸好是早上出的门,否则一定是落汤鸡的下场。
最近睡眠不好,心情不好,工作也陷于泥潭之中,需要用力挣扎才能慢慢前进,好似这七月的天气,变换无穷,烦恼无穷。不过生活总是要前行的,就把挣扎当作一种娱乐吧。
最近客户一直在催软件的新版本,但我一直没有完工,于是客户追,我呢,只好逃了。一方面是最近没有工作热情,另一方面,也是遇到了一些麻烦。原有的版本已经完工很久了,虽然很多代码没有做整理,但是基本脉络还是很清楚的,但是现在要添加功能的时候就发现问题了。主要问题有两个,一个是界面的灵活性如何保证,一个是接口部分如何变的更清晰更简单。
先说说这界面。在PDA上开发,的确没有什么好的工具和选择,唯一的选择就是EVC,而且为了尺寸和效率,我又抛弃了MFC,所以只有通过SDK进行开发了。但这也没什么,也就是代码量稍微大一些。但是当稳定的代码需要进行修改的时候,事情就变的有点麻烦了。很多界面开始设计开发的时候是很确定的,现在要加入新界面,结果发现新界面会对原有的代码产生干扰,而且这种干扰有时候是会出现连锁反应的,让我在对代码进行修改的时候不得不小心谨慎、如临深渊如履薄冰。这样很累,很没有愉悦感,而且将来的维护工作会越来越困难。如何处理呢?目前没有头绪,如果将界面部分的代码class化会出问题,因为界面经常没有什么稳定性,很可能今天相同的界面明天就出现差异,所以没有class的可能。如果将界面代码脚本化也有问题,终究是PDA,效率上要多考虑,而且脚本真的能降低代码量和维护量么?如何?何如?
然后是界面和功能的接口部分,因为是用纯C写的,所以没有class,不过就算有class也是一个样,所有的接口都很清楚,但是在一个.h里的函数太多了,如果这样不断衍化下去,总有一天会超过人脑的接收范围。如何让界面和功能的接口部分变得清楚、简单、少?这是一个问题。
不管如何,现在的版本先维持下去,目前还是足够清晰和简单的,但是希望能找到更好的组织方法。
2006-07-22 17:49
最近睡眠不好,心情不好,工作也陷于泥潭之中,需要用力挣扎才能慢慢前进,好似这七月的天气,变换无穷,烦恼无穷。不过生活总是要前行的,就把挣扎当作一种娱乐吧。
最近客户一直在催软件的新版本,但我一直没有完工,于是客户追,我呢,只好逃了。一方面是最近没有工作热情,另一方面,也是遇到了一些麻烦。原有的版本已经完工很久了,虽然很多代码没有做整理,但是基本脉络还是很清楚的,但是现在要添加功能的时候就发现问题了。主要问题有两个,一个是界面的灵活性如何保证,一个是接口部分如何变的更清晰更简单。
先说说这界面。在PDA上开发,的确没有什么好的工具和选择,唯一的选择就是EVC,而且为了尺寸和效率,我又抛弃了MFC,所以只有通过SDK进行开发了。但这也没什么,也就是代码量稍微大一些。但是当稳定的代码需要进行修改的时候,事情就变的有点麻烦了。很多界面开始设计开发的时候是很确定的,现在要加入新界面,结果发现新界面会对原有的代码产生干扰,而且这种干扰有时候是会出现连锁反应的,让我在对代码进行修改的时候不得不小心谨慎、如临深渊如履薄冰。这样很累,很没有愉悦感,而且将来的维护工作会越来越困难。如何处理呢?目前没有头绪,如果将界面部分的代码class化会出问题,因为界面经常没有什么稳定性,很可能今天相同的界面明天就出现差异,所以没有class的可能。如果将界面代码脚本化也有问题,终究是PDA,效率上要多考虑,而且脚本真的能降低代码量和维护量么?如何?何如?
然后是界面和功能的接口部分,因为是用纯C写的,所以没有class,不过就算有class也是一个样,所有的接口都很清楚,但是在一个.h里的函数太多了,如果这样不断衍化下去,总有一天会超过人脑的接收范围。如何让界面和功能的接口部分变得清楚、简单、少?这是一个问题。
不管如何,现在的版本先维持下去,目前还是足够清晰和简单的,但是希望能找到更好的组织方法。
2006-07-22 17:49
日子在一天天过去,几场暴雨过后,天气渐渐热了,知了开始歌唱。很多事情发生了又过去了,生活如白开水,滋味平和悠长,不去想的话,几乎没有任何印象。在这样平庸的日子里,还有什么可以坚持和感动?
年少轻狂的时候,天天想着事业成功、美酒美人,优哉优哉,现在接近而立之年,连幻想的乐趣都已丧失殆尽。理想啊,目标啊,憧憬啊,都已不在,为了什么而活,成了静夜里时常咀嚼的话题,仿佛慢性毒药,静静的四散开来。
下午天气阴阴的,似乎又要下雨了,风一阵阵的从阳台吹进来,电脑里一遍遍的放着同一首歌,淡到几乎听不到,外面马路上停着一辆车,盯着它看了许久,似乎看到了,又似乎什么都没看见,空空的脑袋里空空的,一切都静止了,除了心脏还在为了生存而努力搏动着......
也许有一天,可以独自一个人独处,看云起云落,花开花谢,远离一切,静静消失,不留痕迹,如风过大地,风卷层云......
2006-07-07 14:41
年少轻狂的时候,天天想着事业成功、美酒美人,优哉优哉,现在接近而立之年,连幻想的乐趣都已丧失殆尽。理想啊,目标啊,憧憬啊,都已不在,为了什么而活,成了静夜里时常咀嚼的话题,仿佛慢性毒药,静静的四散开来。
下午天气阴阴的,似乎又要下雨了,风一阵阵的从阳台吹进来,电脑里一遍遍的放着同一首歌,淡到几乎听不到,外面马路上停着一辆车,盯着它看了许久,似乎看到了,又似乎什么都没看见,空空的脑袋里空空的,一切都静止了,除了心脏还在为了生存而努力搏动着......
也许有一天,可以独自一个人独处,看云起云落,花开花谢,远离一切,静静消失,不留痕迹,如风过大地,风卷层云......
2006-07-07 14:41
忧伤版:
淫贱版:
硬盘录像机系列文档之四:实现
[ 2006-07-02 22:01:21 | 作者: 痉挛的老鸨 ]
http://www.heybrain.com 首发,如有转载,请务必保留网站连接。
有了框架,接下来自然就是细节的实现,俗话说,细节决定成败。对于一个复杂的系统而言,细节有时候是决定性的。
硬盘录像机涉及到的技术比较的多,这里对我个人比较关心的部分进行一个列举。
directshow的采集方式下,一般都会需要一个窗口进行preview,但是这样的窗口是无法进行更多处理的,如果只是显示图像,则没有什么影响,但是如果需要对图像做一些处理,则问题就比较多了。比如要在图像上显示注释、对图像的局部遮盖、同一个视频源的多处显示,这些不是不能实现,但在preview的方式下,基本都是一些捞偏门的方法,并不通用和好看。所以最好的办法是通过samplegrabber获取原始图形,然后自行进行显示和处理,但是在dshow的方式下,一般很难找到不用preview的方式。难并不代表没有,通过查阅msdn,还是可以通过插入null filter进行处理的。
云台控制器有很多种,每套控制指令基本差不多,但是其中微小的差别对开发却造成了麻烦。如何将各种有微小差别的指令集整合起来,是对开发人员的考验。
软压缩在硬盘录像机里是很重要的部分,但是压缩在硬盘录像机里有一些特殊要求,比如变帧率、变分辨率,这对更好的保存录像有帮助,但是对于开发却造成困难。
显示上,如果是软卡,一般需要自己处理,gdi的方式效率实在底下,那么就需要实用一些高效的方法,现在一般使用ddraw或opengl。在显示上有一些要处理的工作,会对开发造成困难,比如如何在画面上贴字,仅仅贴一个字并不难,但是要在不断变化的背景画面上贴一个不会被背景颜色抵消的字就比较见功底了。而且OpenGL在linux下对汉字的支持有问题,贴字更是一个问题。同时某些时候需要对画面的局部进行遮盖,如果不降低效率做到这一点?ddraw有一个bug,就是开14个对象以上,在某些显卡上会显示失败,OpenGL更直接,打开超过4个rc的情况下,系统会死机。如何处理好这些问题,是对开发人员的考验。
缓存、队列、线程,在硬盘录像机里几乎到处是这些东西,最好的方式是抽象出统一的接口来,否则代码会比较臃肿和难看。如何抽象?这是一个问题。
这样复杂的系统,胶合层是必不可少的,但是胶合层要越薄越好。
效率和层次清晰是两个矛盾体,如何结合?
...
阅读全文...
有了框架,接下来自然就是细节的实现,俗话说,细节决定成败。对于一个复杂的系统而言,细节有时候是决定性的。
硬盘录像机涉及到的技术比较的多,这里对我个人比较关心的部分进行一个列举。
directshow的采集方式下,一般都会需要一个窗口进行preview,但是这样的窗口是无法进行更多处理的,如果只是显示图像,则没有什么影响,但是如果需要对图像做一些处理,则问题就比较多了。比如要在图像上显示注释、对图像的局部遮盖、同一个视频源的多处显示,这些不是不能实现,但在preview的方式下,基本都是一些捞偏门的方法,并不通用和好看。所以最好的办法是通过samplegrabber获取原始图形,然后自行进行显示和处理,但是在dshow的方式下,一般很难找到不用preview的方式。难并不代表没有,通过查阅msdn,还是可以通过插入null filter进行处理的。
云台控制器有很多种,每套控制指令基本差不多,但是其中微小的差别对开发却造成了麻烦。如何将各种有微小差别的指令集整合起来,是对开发人员的考验。
软压缩在硬盘录像机里是很重要的部分,但是压缩在硬盘录像机里有一些特殊要求,比如变帧率、变分辨率,这对更好的保存录像有帮助,但是对于开发却造成困难。
显示上,如果是软卡,一般需要自己处理,gdi的方式效率实在底下,那么就需要实用一些高效的方法,现在一般使用ddraw或opengl。在显示上有一些要处理的工作,会对开发造成困难,比如如何在画面上贴字,仅仅贴一个字并不难,但是要在不断变化的背景画面上贴一个不会被背景颜色抵消的字就比较见功底了。而且OpenGL在linux下对汉字的支持有问题,贴字更是一个问题。同时某些时候需要对画面的局部进行遮盖,如果不降低效率做到这一点?ddraw有一个bug,就是开14个对象以上,在某些显卡上会显示失败,OpenGL更直接,打开超过4个rc的情况下,系统会死机。如何处理好这些问题,是对开发人员的考验。
缓存、队列、线程,在硬盘录像机里几乎到处是这些东西,最好的方式是抽象出统一的接口来,否则代码会比较臃肿和难看。如何抽象?这是一个问题。
这样复杂的系统,胶合层是必不可少的,但是胶合层要越薄越好。
效率和层次清晰是两个矛盾体,如何结合?
...
阅读全文...
1

