视频监控在社会生活中起着非常重要的作用, 对于安全作业、智能管理等有着重要的意义。各种不同类型的监控系统广泛应用于油田监察, 工业控制, 家庭生活, 道路管理等方面, 不同的监控系统架构和设计适用于不同的应用场合。传统的模拟型监控系统的适合于监控地点固定的场合, 但往往需要复杂的布线, 缺乏灵活性。主流的基于Internet的监控系统能够实现记录历史视频的功能, 适用于复杂监控, 但需要搭设相关的数据库服务器, 软件设计和架构搭建都比较复杂[1]。另外, 其他的一些家用视频监控系统往往利用ADSL, 并申请DNS服务来完成寻址监控, 存在使用费用高以及ADSL带宽影响图像流畅性的问题[2]。而本文设计的基于B/S架构的轻巧型监控系统, 充分利用IP网络优势, 实现实时远程的视频监控, 适合于实验室、小型车间、家庭儿童监护的固定IP监控场合。支持实时的视频数据采集、编码、传输和远程多点监控, 监控地点可以随意变换, 不需要复杂的设备架设和高昂的维护成本, 具有较强的实时性、互动性、便携性, 性价比高。
1 系统结构
1.1 系统硬件结构
本系统使用致远电子公司的S3C2410ARM开发板作为嵌入式流媒体服务器, 内核为Samsung公司的ARM920T, 用于该系统的开发板硬件资源有:6 4 M的S D R A M、6 4 M的Flash (有足够用于存储视频数据的存储空间) , 多个USB口 (用于连接USB摄像头) , 带DM900E芯片的10/100M以太网接口 (用于视频数据的高速流畅传输) 。同时使用主芯片为中星微ZC301P的USB摄像头用于视频采集, 之所以选取这款芯片, 是因为该摄像头CMOS传感器较好, 能保证画面质量。
1.2 系统软件结构
系统的软件部分包括ARM板系统初始化引导Bootloader, 基于2.4.18内核的嵌入式操作系统, R A MD i s k文件系统, 基于usb-2.4.31LE06的摄像头驱动, Spcaview/Servfox开源软件包 (用作流媒体服务器) 。Servfox建立在Web服务器之上, 它通过V4L接口API函数、MJPEG/JPEG图像压缩器和TCP网络传输协议完成了视频图像信号的图2流媒体服务器与客户端的通信协议获取、压缩和传输。网页服务器使用boa-0.94.13。整个系统的软件结构图大致如图1。
2 系统的实现
2.1 移植摄像头驱动
由于linux2.4.18内核本身不支持z301P摄像头芯片, 所以需要在linux内核打上相应的补丁, 驱动程序应最大限度地减少了内存的使用, 符合嵌入式的需要, 保证CMOS传感器兼容性良好, 这样图像转换速度较快, 保证摄像头画面的流畅度。驱动移植的主要步骤是: (1) 打补丁并进行部分驱动修改; (2) 进行内核配置:模块化选择USBSPCA5XX Sunplus Vimicro Sonix Cameras; (3) 重新编译内核, 生成镜像文件; (4) 驱动移植将产生的内核镜像、制作的RAM根文件系统、上述的三个驱动模块通过NFS网络文件服务[3]下载到A R M中。这里可以在A R M端写一段开机启动脚本来实现驱动模块的加载和设备节点的挂载, 便于后期的Servfox运行。这里的USB驱动程序的驱动程序的层次结构[5]为:USB设备驱动->USB核心子系统->USB主控器驱动程序。
2.2 建立Boa网页服务器
Boa网页服务器主要实现客户端浏览器的访问功能。主要的建立步骤如下。
(1) boa原始平台配置; (2) 修改Makefile文件, 配置交叉编译工具; (3) 配置boa服务器; (4) 修改boa目录下的boa.conf配置文件, 这个文件包含了boa服务器的许多选项, 需要仔细配置。其中包括了:Group和User、Script Alias的CGI、Server Name、Error Log等的设置; (5) 编译、移植服务器将宿主机上生成的boa.conf文件、index.html文件、img目录和mime.types文件放到ARM板的相应目录下。将boa, boa.conf以及上述文件也都下载到板子上去。这里同样可以利用脚本来建立boa服务器的各个目录并设置开机启动服务。
3 建立Servfox流媒体服务器
(1) Servfox/Spcaview的介绍;Spcaview是linux系统下用于实现网络视频服务器的开源软件包。而servfox其实就是Spcaview软件包的精简版本, 实现了Spcaview的基本功能。本系统采用Servfox作为流媒体服务器进行构建。主要考虑到:Servfox的移植比较方便, 同时它本身适合于工作在ARM开发板上, 能较好地配合嵌入式Linux专用的spca5xx-LE网络摄像头驱动来完成视频采集。
(2) Servfox的工作原理:Servfox是开源的软件包, 支持基于Spca5xx驱动、采集原始jpeg图像的摄像头。Servfox流媒体服务器使用Video4Linux (V4L) 完成原始视频图像的获取, 然后把视频图像数据以JPEG的方式进行压缩处理后, 打包生成TCP包, 向网络发送。视频图像的获取是通过V4L接口实现的, 它是图像串流系统与嵌入式视频系统的基础, 配合合适的视频采集卡与视频采集卡驱动程序。V4L分为两层架构, 最上层为V4L驱动程序本身, 最下层为影像设备的驱动程。Servfox实际使用的就是最上层驱动程序, 即V4L的本身给程序员提供的API。程序逻辑调用顺序为:应用程序 (servfox) →Video4Linux驱动 (API) →Spca5xx摄像头驱动→摄像头底层硬件。V4L提供了如下主要的数据结构[5]:struct video_capability (包含摄像头的基本信息) 、struct video_picture (包含设备采集图像的各种属性) 、s t r u c t v i d e o_m m a p (用于内存映射) 、s t r u c t video_mbuf (利用mmap进行映射的帧信息, 实际上输入到摄像头存储器缓冲中的帧信息) 。
而主要使用的系统调用有:open ("/dev/video0", int flags) 、close (fd) 、mmap (void*start, size_t length, int prot, int flags, int fd, off_t offset) 、munmap (void*start, size_t length) 、ioctl (int fd, in cmd....) 。Servfox使用JPEG (Joint Photographic Experts Group) 压缩。Servfox默认的图像格式为V I D E O_P A L E T T E_J P E G, 它根据不同的palette值做不同的数据压缩处理, 返回压缩后的数据大小值, 如果是JPEG格式, 意味着硬件采集近来的数据已经做了压缩, 不需要再用软件进行压缩处理, 而除了VIDEO_PALETTE_JPEG以外的palette, 都需要进行编码, 所使用的函数为UINT32encode_image (UINT8*input_ptr, UINT8*output_ptr, UINT32 quality_factor, UINT32image_format, UINT32 image_width, UINT32image_height) , 其中UINT32 image_format为输入的palette值。
JPEG图像每幅都有自己的量化表和Huffman码表。使用用有损压缩方式去除冗余的图像数据, 在获得极高的压缩率的同时能展现十分丰富生动的图像。它的特征在于它能实现渐进传输, 即先传输图像的轮廓, 然后逐步传输数据, 不断提高图像质量, 这样的特点比较适合视频监控系统。JPEG虽然压缩率不高, 但在IP网络中, 其他的运动图像压缩技术应用会因网络拥塞、延迟等原因而产生图像停顿、延时、误码等问题, 而JPEG码流基本不受网络的影响。
当Servfox采集到视频图像数据后, 将其封装为TCP包进行网络传输, 网络上传输的协议大致如下。
(1) Servfox流媒体服务器空闲时, 重复进行图像采集活动, 等待客户端发送获取图像帧的请求。
(2) 浏览器客户端初始化后发送图像请求, 与服务器交互建立TCP连接后, 并进入等待状态。
(3) 服务器判断收到的请求为客户端发来的图像帧请求信息后, 则回送图像帧信息头给客户端, 紧接着发送一帧视频图像。
(4) 当客户端收到图像帧头后会请求发送一帧视频图像, 接收完视频帧后, 显示视频帧, 然后再发送帧请求, 如此反复, 直到断开连接。
这是一个交互的闭环协议, 客户端用命令设置远程服务器的视频流参数, 而服务器端是多线程的, 可以同时连接多个客户端, 并且有一个帧刷新环形缓冲器在内存中, 用于视频流缓冲。
整个B/S交互过程如图2。
(3) Servfox的建立。
首先修改Servfox软件包的Makefile文件, 配置编译器选项和内核路径。然后执行make, 于是就产生了可执行程序servfox。执行在ARM开发板的服务器端运行servfox的命令为:s e r v f o x-g-d/d e v/v i d e o 0-s320x240-w7070其中:-d对应于视频采集的设备文件, -s对应于采集图像的宽度和高度-w对应于流媒体服务器端口号。
4 配置HTTP-JAVA-APPLET
为了实现通过浏览器来进行视频监控的目的, 还要在服务器端配置http-javaapplet。
(1) 进入spcaview目录, 把其中的httpjava-applet目录移植到boa服务器的主目录/v a r/w w w下, 并根据个人的需要对sample-index.html网页文件的html代码进行相应的修改。
(2) 为了使浏览器支持Java程序, 还需要安装JRE, 这里我们使用的是javasetup6u18-rv.exe。
(3) 安装完成后, 可以在浏览器中输入如下地址进行测试。
http://219.228.60.20/http-javaapplet/index.html, 其中219.228.60.20是给A R M开发板分配的局域网I P地址, index.html是最终显示的网页文件。
综上所述, 整个系统的运行过程如下。
(1) 加载摄像头驱动。
(2) 加载boa网页服务器。
(3) 修改服务器IP地址, 以使所有局域网内的客户机访问。
(4) 运行servfox流媒体服务器。
(5) 通过浏览器对流媒体服务器进行访问。最终的实验结果如图3。
5 结语
本文设计的是一种基于B/S架构的远程实时监控系统, 具有一定的实时性、方便性和实用性。通过整个开发过程和调试, 发现影像视频图像清晰度和稳定的主要因素在于缓冲区的大小、视频帧的压缩算法。同时驱动程序和相关软件的移植质量的好坏也至关重要。
摘要:本文设计了基于B/S架构的远程实时监控系统, 介绍了Servfox流媒体服务器及Linux的V4L视频接口原理, 以及流媒体服务器与客户端之间的视频通信协议。最终在基于Linux系统的ARM板上成功地了架设BOA网页服务器, 移植Servfox数据采集器;在PC机客户端安装JAVA插件后, 便可以通过浏览器实现视频监控功能, 与传统监控方式相比, 具有较强的可移植性和便携性。
关键词:monitoring,system,ARM,Linux,Servfox
参考文献
[1] 颜建军, 宋执环, 韩波.基于嵌入式Internet的远程监控系统设计[J].机电工程, 2003, 20 (5) :55~57.
[2] 康凤, 廖婷.家用远程实时监控统的实现方法[J].成都航空职业技术学院学报2009, 78 (1) :62~64.
[3] 刘昆.linux环境下宿主机与ARM开发板NFS服务的配置[J].科技资讯, 2008, 5:133.
[4] 刘春成.基于嵌入式linux的USB摄像头驱动开发[J].计算机工程与设计, 2007, 28 (8) :1885~1888.
[5] Alan Cox Video4Linux Programming, 2000.