摘 要:以ARM9处理器S3C2440为核心芯片搭建硬件平台,采用嵌入式Linux操作系统为软件开发平台,设计了一种基于B/S模式的嵌入式视频监控系统的设计方案。通过构建流媒体服务器,完成视频数据的采集、压缩、传输和保存。采用TCP/IP网络协议,移植了Web服务器,开发了Java Applet程序,用户通过浏览器即可对远程视频进行实时监控。系统具有实时性强、体积小、成本低廉、性能稳定、交互性好等特点,具有广泛的应用价值。
关键词:嵌入式;视频采集;视频监控;TCP/IP;B/S
视频监控系统将被监控现场的实时图像和数据等信息准确、清晰、快速地传送到监控中心服务器,监控中心将实时、直接地掌握各个被监控现场的当前情况(包括图像、声音及其他敏感数据),从而对敏感事件进行快速反应[1]。视频监控正朝着数字化、网络化、集成化的嵌入式视频监控方向蓬勃发展。相比传统的视频采集监控系统,嵌入式视频监控系统具有可靠性高、组网方便、可远程监控等优点,因而更适用于工业控制、银行、政府部门的安防系统中[2]。
本文设计了一种具有用户零维护、价格低廉、性能稳定等特点的嵌入式视频监控系统。该系统以ARM处理器S3C2440和嵌入式Linux操作系统为核心平台,通过USB摄像头采集视频数据,基于TCP/IP协议进行网络传输,用户通过浏览器即可监控远程视频,视频可以保存,以便回放。
1 视频监控系统方案设计
1.1 监控系统硬件平台设计
监控系统硬件平台是整个监控系统的基础,在系统设计中占有至关重要的地位,硬件选择的成功与否直接决定着系统功能的优劣。本设计中主要硬件有NAND Flash、嵌入式处理器S3C2440、SDRAM、网卡、USB接口摄像头等。
视频监控系统的硬件结构方案如图1所示。系统以S3C2440处理器为核心,外扩其他外围设备。S3C2440处理器是Samsung公司基于ARM公司的ARM920T处理器核,它是一款高度集成的芯片,主频为400 MHz,提供了一套较完整的通用外围设备接口,支持性价比非常高的NAND Flash启动,可支持Linux等多种操作系统的移植[3]。
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访问,本系统就采用此方法。
2.2 基于TCP/IP协议的视频传输
TCP/IP协议指的是Internet上使用的两种网络协议,即传输控制协议和网际协议。TCP协议是一个可靠的点到点之间的协议,IP协议是一个传输层的协议。TCP/IP协议族可以将各种操作系统和网络部件连接起来,它提供了一种在各种系统间移动数据的标准方法[5]。
本系统中,首先服务器通过socket函数创建套接字,并使用bind函数将套接字与某端口进行绑定;然后调用listen函数,服务器将处于监听状态,等待用户监控端请求连接指定端口;当接收到用户监控端的连接请求后,服务器调用accept函数来建立与用户监控端间的通信;在成功建立通信后,就可以通过read函数或write函数进行通信。
本系统可以人机交互,用户通过网页可以向视频服务器传递控制信息,比如调节帧速、亮度等。当建立连接后,首先用户监控端发送一个包含控制信息的client_t结构体数据给视频服务器;然后视频服务器根据控制信息采集一帧视频数据,并生成一个包含这一帧视频信息的frame_t结构体数据,把它们发送给用户监控端。这就完成了一次人机交互,这样不断地循环,就实现了数据传输。
3 嵌入式Web服务器的实现
3.1 嵌入式Web服务器的选择
Linux下嵌入式Web服务器主要有3个,分别是httpd、thttpd和Boa。httpd是最简单的一个Web服务器,它的功能最弱,不支持认证,不支持CGI。thttpd和Boa都支持认证和CGI等,功能都比较全。本系统采用Boa Web服务器,它通过建立HTTP请求列表来处理多路HTTP连接请求,节省了系统资源,这对嵌入式系统来说至关重要。同时它还具有自动生成目录、自动解压文件等功能。Boa具有很高的HTTP请求处理速度和效率,在嵌入式系统中具有很高的应用价值。
3.2 Boa在ARM上的移植与配置
(1)移植过程
从http://www.boa.org/下载Boa源码,选择boa-0.94.13.tar.gz,输入解压命令“tar xzvf boa-0.94.13.tar.gz”;进入解压生成的源码目录下的src子目录,输入命令“./configure”,生成Makefile文件;修改Makefile文件,将CC和CPP的值改成交叉编译器安装的路径;输入命令“make”即可交叉编译生成可执行文件Boa,通过串口下载到根文件系统下的/ bin下就实现了移植。
(2)配置
在/etc目录下新建一个Boa目录,里面存放Boa的主要配置文件boa.conf,在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改;修改Group nogroup为Group root,修改User nobody为User root,这里的root是开发板存在的组和用户;修改#ServerName www.your.org.here为ServerName cs2440;修改DocumentRoot /var/www为DocumentRoot /www,设置HTML文档的主目录/www,其他采用默认设置即可。此外,还需要将mime.types文件复制到/etc目录下,通常可以从Linux主机的/etc目录下直接复制即可。
4 基于B/S模式的用户视频监控端实现
系统采用B/S模式,相比C/S模式,用户不需要做任何维护,这对用户人力、物力、时间、费用的节省是显而易见的,并且可以跨平台操作,真正方便了用户。
系统通过开发Java Applet应用程序,并嵌入网页中,网页名称设为Boa Web服务器默认主页名,把它们保存在/www中,用户在浏览器地址栏中输入视频服务器的IP地址,就能在网页里显示摄像头的监控图像。通过Java Applet与视频服务器进行交互,实现对视频数据的控制、传输和播放。Java Applet程序中主要功能步骤和主要函数可描述为:
(1)创建套接字、输入流和输出流。
connection=new Socket(m_strServer,port);
in=connection.getInputStream();
out=connection.getOutputStream();
IP地址及端口都是由嵌入在HTML中部分的参数传入的,并创建此Socket对象的输入流和输出流。
(2)分配接收缓冲区:byte[]buffer=new byte[512*1024];
(3)发送一个用户控制信息。它由用户用鼠标点击图标而生成。当用户点击浏览器中的视频窗口时,在上方会显示亮度等图标,通过点击图标两侧的“+”和“-”而写入控制信息;当点击图标以外的地方,图标就会消失,实现全窗口的视频,便于监控,操作简单。
Public void mouse(MouseEvent evt) {…};
out.write(b);//b是包含控制信息的字符数组名
(4)读取一帧图像头信息,确认图像数据的正确性和获取图像数据的大小。
n=in.read(buffer,0,HDRLEN);//HDRLEN为图像信息头长度,设置为50 B
对头信息中包含的约定字符进行判断,若正确就可以继续接收图像数据,不正确则返回(3)。
(5)读取图像数据,把头信息后的图像数据写入缓冲区,以供播放显示。
r=in.read(buffer,HDRLEN,buffer.length-HDRLEN);
(6)实现图像显示。由于缓冲区中包含图像头信息,为单独使用图像数据,需把图像数据拷贝到另一缓冲区buffer2中。
BufferedImage image= ImageIO.read(new ByteArrayInputStream(buffer2));
ImageIcon ii=new ImageIcon(image);
m_label.setIcon(ii);//显示图像
通过以上(3)到(6)的不断循环运行,用户从监控网页上可以看到连续动态的图像,效果很好,画面流畅,不存在明显的延时,实现了视频监控。
本文提出的这种基于B/S的嵌入式视频监控系统相比传统C/S模式,真正实现了用户零维护,可以跨平台监控,方便用户。采用嵌入式处理器和Linux操作系统相结合,很好地体现了本监控系统具有集成化、网络化、功耗低等优点,可广泛扩展应用在工业控制、可视电话、交通管理等诸多领域。
参考文献
[1] 刘富强.数字视频监控系统的开发及应用[M」.北京:机械工业出版社,2003:2-16.
[2] 于明,范书瑞,曾祥烨.ARM9 嵌入式系统设计与开发教程[M].北京:电子工业出版社,2006:15-75.
[3] Samsung Electronics.S3C2440A 32-Bit CMOS Microcontroller User’s Manual[S],2004.
[4] Vimicro Corporation.ZC0301 Preliminary Data Sheet[M/CD].2002.
[5] 张曦煌,柴志雷.Linux中TCP/IP协议实现及嵌入式应用[M].北京:北京航空航天大学出版社,2008:5-12.