1.2 监控系统软件方案设计
本系统选择Linux操作系统作为软件开发平台,编译环境采用交叉编译调试的方式,嵌入式Linux的内核选用2.6.13,根文件系统采用yaffs。
一套完整的视频监控系统应该至少包含视频数据的采集、处理、传输、存储与控制等功能,为了很好地实现以上功能,本系统划分为三大功能模块:嵌入式流媒体服务器、嵌入式Web服务器和用户视频监控端。嵌入式流媒体服务器模块主要实现视频数据的采集、存储和传输等功能;嵌入式Web服务器模块负责处理监控端发来的请求并通过与浏览器的交互为用户提供监控平台;用户视频监控端模块实现对远程视频的实时监控,并且可以控制视频的亮度和对比度等。
2 嵌入式流媒体服务器的实现
流媒体服务器模块的主要功能有视频采集、视频压缩、视频存储和视频传输。本系统采用中星微公司生产的ZC0301芯片的USB摄像头,ZC0301主要由五大功能模块组成,即系统控制、图像信号处理、次取样和水平扫描模块、JPEG编码器和USB设备控制[4]。采用该芯片的摄像头应用最广泛,方便购买和维护,经过此芯片处理后得到的是JPEG编码的位流,实现了视频的压缩。
2.1 基于Video4Linux的视频采集
Video4Linux(简称“V4L”)是Linux中关于视频设备的内核驱动,它是针对视频设备的应用程序编程提供的一系统接口函数。视频采集的基本流程如图2所示。利用V4L对USB摄像头的编程需要用到Linux下2个系统调用,分别是ioctl()调用和mmap()调用。
在V4L标准中提供了多个数据结构和控制命令, 程序通过调用函数对设备进行控制, 完成视频采集的任务。ioctl()函数中主要的设备控制命令有:
(1)VIDIOCGCAP:获取采集设备基本信息,比如支持最大最小分辨率等;
(2)VIDIOCSPICT、VIDIOCGPICT:分别为设置和获取采集图像的各种属性;
(3)VIDIOCGMBUF:获取缓冲区信息,比如每帧大小、最多支持的帧数等;
(4)VIDIOCMCAPTURE:捕捉图像,获取图像信息;
(5)VIDIOCSYNC:等待采集一帧图像完毕。
应用程序获取摄像头采集的图像数据有两种方法,分别是read()(直接读取的方法)和mmap()(内存映射的方法)。mmap()系统调用使得进程之间通过映射同一个文件而实现内存共享,优点是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝,加速了I/O访问,本系统就采用此方法。