视频监控系统
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
目录
前言 1
1引论 2
1.1视频监控系统的现状和发展方向 2
1.1.1 视频监控系统的现状 2
1.1.2 视频监控系统的发展方向 3
1.2 技术背景 4
1.2.1 Visual C++ 6.0和MFC介绍 4
1.2.2 MPEG4介绍 5
1.2.3 套接字编程 5
1.2.4 AVICAP知识点 6
1.2.5 流媒体技术 7
2需求分析 8
2.1项目概述 8
2.1.1 问题的提出 8
2.1.2 项目目标 8
2.1.3 运行环境 8
2.1.4 条件与限制 8
2.1.5 功能划分 8
2.1.6 功能描述 9
2.2系统流程图 10
2.3运行需求 10
2.3.1用户界面 10
2.3.2 硬件接口 10
2.3.3 软件接口 11
2.3.4 故障处理 11
2.4其他需求 11
2.4.1可使用性 11
2.4.2 可维护性 11
2.4.3 可移植性 11
3概要设计 12
3.1 处理流程 12
3.2设想供选择的方案 12
3.2.1 DirectShow与VFW的比较 12
3.2.2 TCP/IP与RTP/RTCP的比较 13
copyright think58
[资料来源:http://www.THINK58.com]
3.2.3 TCP与UDP的比较 13
3.2.4 IP组播与TCP协议的比较 13
3.3 功能分解 14
3.4 功能分配 14
3.5 设计软件结构 15
3.6 运行设计 18
3.7 出错处理设计 18
3.7.1出错输出信息 18
3.7.2 出错处理对策 18
4详细设计 19
4.1 程序描述 19
4.1.1 程序功能 19
4.1.2 程序性能 19
4.2 程序实现 19
4.2.1 MPEG4格式的格式 19
4.2.2 获取摄像头驱动和版本号 20
4.2.3 显示图像在客户端上 20
4.2.4 初始化压缩格式并且开始压缩数据 21
4.2.5 回调函数 22
4.2.6 释放存储空间 23
4.2.7命令接收的选择 23
4.2.8 服务器端的创建套接字 24
4.2.9 服务器端的输入项 25
4.2.10 命令接收的选择 25
4.2.11保存文件 26
结束语 33
参考文献 34
致谢 35 think58好,好think58 [资料来源:http://think58.com]
视频监控系统
―视频捕获和传输模块
计算机科学与技术 黄羿华 指导老师:黄力
摘要:本系统采用了软压缩的方法,在单机和对接线连成的两台电脑的情况下可以获得高清晰的图像。运用TCP/IP协议,在局域网内构建有限的实时监控系统。系统可以根据客户需求构建以多个摄像头为采集源的客户端监控点,实现多点监控。监控采集到的视频图像经过预定义的编码方式进行压缩,以占据最小带宽发送最多数据为目的,采用当今流行的mpeg4文件格式在网络上以点对点的方式传输。服务端及时响应客户端发送过来的请求,并按管理者的意志对远程发来的视频图像进行播放和存储。
本系统是在Microsoft Visual C++ 6.0编程环境下开发实现。采用客户端/服务器模式在局域网内进行通讯。利用Microsoft Visual C++ 6.0编程环境下的MFC工具设计基于对话框的形式,通过异步非阻塞的套接字进行客户端与服务器端的通信。采用现在流行的MPEG4文件格式在网络上传输的一个稳定的新系统.
关键字:实时视频监控;软压缩;mpeg4。 think58.com [资料来源:www.THINK58.com]
2.1.4 条件与限制
由于硬件问题,造成的服务器与客户机不通;适合系统的编码/解码软件没有安装;不可支持 TCP/IP 网络传输。
2.1.5 功能划分
系统被分成:客户端,网络传输,服务器端共三个模块。
客户端:安装了摄像头的被监控的场所(小区里人流物流集中的地方上安装摄像头)。
网络传输:客户端和服务端相连的接口。相互连接的一个局域网内(小区里相互连接的网络)。
服务器端:接收远程监控接收数据的主机,可以随时存储,随时调用存储文件以查看记录的主机。
下图中的客户端1,客户端2,客户端3,客户端4分别代表装有摄像头的多台客户端。作用用于采集图像。
Internet网络代表覆盖整个居民小区的网络。
服务器端为主机电脑。服务器与客户端的数量一般一致,保证了系统是点对点的传输。
图1 结构体系
2.1.6 功能描述
在客户端安装好多台摄像头,用以监控要监控的场所,多台摄像头通过线路汇到视频编码器设备上,视频编码器采用预设置的编码方式对数据进行压缩,数据经过压缩以后,通过遵循TCP/IP协议的网络传输到视频监控平台(服务器),数据在监控平台同时进行两个同步操作,一步操作就是对接收到的数据进行播放,另一步就是对数据按管理员的意志进行保存,以备以后随时调用查看。 copyright think58 [资料来源:http://THINK58.com]
一帧在系统的流向:从客户端捕获到一帧,可以进行两步操作,要么显示在客户端;要么在接收到服务器发送的请求后进行压缩,压缩后的帧通过套接字发送到支持TCP/IP的网络上,传输到服务器上,服务器接收数据,然后进行解压缩。解压缩后的数据要么显示在服务器端,要么存储到文件中。从而实现了远程的监控。
图2 帧的流向
2.2系统流程图
图3 系统流程图
2.3运行需求
2.3.1用户界面
系统以简洁,完善为目的.按客户的一般操作来设计。是为客户量身定做的一个完善的系统。以人性化的界面,完善的功能满足客户需求.。系统分成两个可视的界面,客户端和服务器端,客户端上主要是获取摄像头驱动并显示采集到的图像.,服务器端还有菜单项和状态项共两个。菜单项主要有保存文件按钮,取消保存按钮,播放按钮和退出系统共四个按钮。
2.3.2 硬件接口
一台装有摄像头的客户端互连于远程的服务器端,实现远程的监控。可以互相连接的局域网。
2.3.3 软件接口
客户端安装了编码/解码的软件。服务器安装了编码/解码的软件。摄像头驱动成功的客户端。安装了VC 6.0编译环境的客户端。
2.3.4 故障处理
对于自动获取IP 地址的电脑,修改其IP 地址,使用固定的IP 地址。对于同一台电脑,可以填入”127.0.0.1” 或固定的IP地址。一个客户端对应着一个服务器端,包括时间上要一致。要安装编/解码MPEG-4文件格式的编码软件。 copyright think58 [资料来源:THINK58.com]
2.4其他需求
2.4.1可使用性
系统经过完全测试,可以独立运行任何一台装有VC编译环境的电脑。
2.4.2 可维护性
系统模块化和良好的结构,通俗简单的算法为用户所理解,系统可以随时增加附加存储空间,具有很好的通用性和灵活性。
2.4.3 可移植性
系统通过编写模块化代码提高的系统的可移植性,系统可以很好的导入或导出到其他软件上,实现整合。
内容来自think58 [资料来源:http://THINK58.com]
[来源:http://think58.com]
3概要设计
3.1 处理流程
设计思想是:使用摄像头,从被监控场所采集场所里的视频流。一次采集一幅帧。帧按照自定义的MPEG4文件格式,编码格式为:
Struct VIDEODATA
{
BOOL KeyFrame;
DWORD SimpleNum;
DWORD Usersize;
BTYE Buffer[1024*1024];
}
的数据结构进行压缩,压缩后的数据在函数回调的时候通过网络(支持面向对象的传输协议)传输到远程的服务器上,传输方式有两种:一是使用同步阻塞方式(CSocket类)进行传输,另一种是使用异步非阻塞方式(CAsyncSocket类)进行传输。视频帧传到服务器上后,服务器接收数据,接收完毕,根据用户操作进行响应的操作。当用户要显示视频帧时,系统根据解码的算法,对客户端压缩过的视频帧进行解压缩操作,恢复压缩前的视频帧大小。以便很好的显示,解压缩后的视频帧调用GetDC()句柄。调用SetDIBitsToDevice()显示图像在指定的位置上。实现播放的功能,同时用户进行存储操作,系统就按照预先设置好的文件格式进行存储,实现视频帧的存储功能。
图4 处理流程 [资料来源:http://think58.com]
3.2设想供选择的方案
3.2.1 DirectShow与VFW的比较
VFW 是Microsoft公司为开发Windows平台下的视频应用程序提供的软件工具包。提供了一系列应用程序编程接口(API),用户可以通过它们很方便地实现视频捕获、视频编辑及视频播放等通用功能。还可利用回调函数开发更复杂的视频应用程序。它的特点是:播放视频时不需要专用的硬件设备,而且应用灵活,可以满足视频应用程序开发的需要。Windows操作系统自身就携带了VFW,系统安装时,会自动安装VFW的相关组件。VC++自4.0以来就支持VFW,大大简化了视频应用程序的开发。而DirectShow是微软Windows平台下的一个流媒体架构。DirectShow提供多媒体流高质量的捕捉与回放。它支持多种格式,包括高级流格式(ASF)、运动图像专家组(MPEG)、音视频交错(AVI)、MPEG音频层-3(MP3)与WAV声音文件。它支持从基于Windows Driver Model(WDM)或Video for Windows的数字设备与类似的设备上捕捉信息。DirectShow是与其它DirectX技术结合起来的。它自动检测视频与音频硬件加速,并当硬件加速可用时就使用它;但它也支持没有硬件加速的系统。比较两者的优缺点,VFW以它简单,实用,容易上手等许多优点。所以选择VFW [1]。
3.2.2 TCP/IP与RTP/RTCP的比较
[版权所有:http://think58.com]
应用层质量控制技术现在采用的是RTP/RTCP协议,以确保视频流在网络中低时延、高质量地传输。RTP数据传输协议负责音视频数据的流化和负载,RTCP负责RTP数据报文的传输控制。此协议是通过客户端(接收方)反馈网络的状况,服务器端(发送方)来调整信息采集、发送的速度和压缩率。但是对于图像采集速度固定,需要软件进行压缩、解压,调整采集的速度会引起采集的数据来不及压缩而直接丢弃,调整编码器的压缩率需要重新设置编码器的参数,重启编码器,相应的解码器也要调整。这个过程中需要很长的时间,达不到实时的要求。所以本系统没有采用RTP/RTCP协议,而是从发送端出发,直接进行使用TCP/IP进行实时传输[9]。
3.2.3 TCP与UDP的比较
UDP比较适合于网络环境下的视频传输。但是它不提供检错和纠错功能,一旦网络出现堵塞时,大量的数据报文会丢失。对于Divx编解码技术,是以帧为单位进行编解码的。分为关键帧和非关键帧。在传输过程中,由于压缩率比较高,只要一帧中错一比特位,将影响其它几百甚至几千的比特位,直接造成图像的模糊、花屏等现象。只有等到下一次关键帧的到来才有可能恢复图像的清晰。为了保证传输的正确性,自己需要在应用层制定协议。如此一来,UDP的优势荡然无存。所以本系统选择使TCP来进行网络通信。综合使用VFW技术、流媒体技术,较好的解决局域网中实时视频传输容易引起的重影、花屏的问题[1]。
think58 [资料来源:http://THINK58.com]
3.2.4 IP组播与TCP协议的比较
IP组播技术是一种允许一个组播源发送单一数据包到多台主机的传输技术[1]。它主要借助于互联网上的支持组播的网络设备分发功能实现。首先,在转发组播数据之前,网络设备通过组播相关协议生成组播转发树。这时,源组播数据包就可以沿组播转发树到达组播组的各个成员。组播转发树有两种类型:有源树和共享树。主要区别是:有源树的根就是发送组播信息流的源主机;共享树是用放在网络的某些可选择点作为单独的公用根,通常叫做汇合点。TCP协议侧重于安全方面考虑。TCP协议通过三次握手实现稳定,可靠的传输。IP组播则是在网络内群发,没有目标,没有对象。这样容易信息泄漏。TCP也有缺点:单个的点对点的传输。不能多台电脑一起发送或接收。比较两种协议,本系统采用了TCP协议。
3.3 功能分解
本系统分成两个功能块:客户端和服务器端。客户端又细分了成三个功能块:获取摄像头驱动和版本号;捕获视频并显示图像;发送压缩的视频流。服务器端分成四个模块:接收视频帧;显示解压缩。后的视频图像;存储解压缩后的视频流;播放解压缩后的视频流。
图5 功能模块 think58好,好think58 [资料来源:www.THINK58.com]
3.4 功能分配
客户端:通过摄像头采集视频流并显示出来,采集到的视频图像显示在客户端指定的位置。窗口大小由capCreateCaptureWindow函数设置。显示当前使用的摄像头的驱动程序名称和版本号。由capGetDriverDescription()函数实现。创建套接字监听服务器端的连接,使用异步非阻塞套接字模式进行连接。连接服务器发送视频流。通过使用函数来事件响应相应操作。利用软压缩方式对视频流进行压缩,编码。网络:TCP连接。使用异步非阻塞套接字。服务器端:利用软压缩方式对视频流进行解压缩,解码。采用mpeg4格式进行解压缩。调用函数并显示接收到的视频图像。获取GetDC()句柄,调用SetDIBitsToDevice()进行显示图像。对视频图像进行存储。按照mpeg4格式进行存储。服务器端每接收到一帧后就按管理者的意志,以是否与当前时间相等来进行存储,按照发送端设计的结构体直接写入.dat文件。对存储的图像进行播放。管理者要调用历史记录时, 播放存储的记录。按照存储时的格式一帧一帧的读取数据,直到文件末尾为止。
3.5 设计软件结构
图6 客户端与服务器端的工作流程
think58好,好think58
获取视频驱动和版本号:首先创建视频窗口capCreateCaptureWindow(),使图像出现在预定义的地方,然后连接驱动capDriverConnect(),采用通过capGetDriverDescription(),获取到视频的驱动和版本号。
捕获并显示图像:通过创建视频窗口capCreateCaptureWindow(),连接驱动capDriverConnect()后,获取视频当前状态capGetStatus(),设置视频格式capSetVideoFormat(),而后设置帧的速率capPreviewRate(),默认为80帧/秒最后预览图像capPreview()[1]。
帧的结构:视频采集的数据是位图型式的视频帧,Divx编码器压缩以后形成以帧为格式的Mpeg4流,Divx解码器也是以帧的格式解压。所以提出以帧为单位发送视频数据流,为了在接收端能够方便地提取出一帧,提出如下图所示的格式组建帧。
表2 帧的结构
是否关键帧 帧数量 帧大小 帧存储区
完整的一帧由4个字段组成,各个字段的意义如下:BOOL类型的关键帧,是关键帧的话为1,否则为0;帧的编号,即帧的数量,占4个字节。帧大小,是一帧有多大。占4个字节。帧数据存储区,存储数据的区域。
压缩方式:目前有三种DivX编码器。DivX3.x是最著名的而且到处都有,实际上是Microsoft的MPEG-4 v3 codec的hack版本。第二个市DivX4,DivXnetworks完全重新编写的作品,但是又推出了DivX5。所以目前已经不用了,DivX5提供更好的图像质量和更多的功能。XviD也是一种新的编码器,还在alpha测试状态,但是效果已经令人印象深刻同时它还开放源代码,由于Divx3.x是出来最早,也是最普及的[17]。所以就使用了此方式。面向对象的传输方式:
think58.com [资料来源:http://www.THINK58.com]
图7 面向对象的时序图
表3 异步非阻塞套接字部分函数
异步非阻塞式套接字的函数 备注
CAsyncSocket::Create() 创建套接字
CAsyncSocket::WSAAsyncSelect() 事件响应
CAsyncSocket::OnReceive() 接收数据
CAsyncSocket::OnSend() 发送数据
CAsyncSocket::OnAccept() 接受消息
CAsyncSocket::OnConnect() 连接请求
发送端工作流程:实时视频传输要求实时,要不断地将压缩好的数据发送到接受端.利用回调函数发送。即当摄像头捕获到一帧时,就会产生一次回调.在此就发送数据出去。用于设置是否为关键帧,如果为关键帧,就会把数据结构里的BOOL 类型的Keyframe 设置为TRUE,否则就设置为 FLASE。之后就发送数据。
图8 发送端工作流程
接收端工作流程:接收端最重要的是从接受的数据流中提取出完整的一帧。设计指导的思想是:首先条件判断,判断是不是关键帧,如果是关键帧,就从紧挨后面的数据中提取出帧的大小,接着再从接收缓冲区中读入该帧存储的数据。否则也从紧挨后面的数据中提取出帧的大小,接着再从接收缓冲区中读入该帧存储的数据。之后再判断是否是关键帧,如此往复直到没有数据发送为止。
think58
图9接收端工作流程
存储文件算法:判定是否为存储的状态?如果是,判定预设hour是否等于当前的hours,如果不等于就把当前的hour值赋给预设的hour,并且打开写的文件,把文件指针移到文件末尾,就写入数据。否则就不要把当前hour值赋给预设的hour,直接打开写的文件把文件指针移到文件末尾,就写入数据。写完一帧就保存一次数据。
图10 文件存储算法
3.6 运行设计
3.6.1 运行模块组合
启动客户端,操作正常情况下,马上显示摄像头名称,版本号和采集到的图像;启动服务器端;在服务器端输入客户端的IP 地址并按enter键。根据网络繁忙情况确定显示时间。按存储菜单项的”存储文件”系统从当前点击时间。开始存储视频图像,直到按下”存储结束”后才停止存储视频。点击播放,将打开刚存储完的视频文件。 [资料来源:THINK58.com]
3.6.2 运行控制:必须在客户端启动成功后,才能输入IP地址进行连接。
3.6.3 运行时间:无限制(只要启动成功)。启动了服务器或客户机一个,需启动对应的客户机或服务器。
3.7 出错处理设计
3.7.1出错输出信息
没有安装编码/解码软件:提示”请安装编码/解码软件”;
摄像头启动不成功:要么出现黑屏, 要么有”内存不足”的提示。
3.7.2 出错处理对策
安装编码/解码软件;重新插入摄像头(USB)接口,重启一次。
设置正确编码/解码的方式。
think58
[来源:http://think58.com]