0 引言
随着汽车客运事业发展,营运人员在营运过程中的安全以及管理也越来越被重视。由于存在乘客与营运人员经常因逃票、服务态度等问题而产生纠纷、客运过程中交通事故双方的责任鉴定比较模糊、车内盗窃事件缺乏有力的证据以及车辆失窃和司机酒驾等问题,本文提出基于ARMLinux的3G无线车载视频监控系统,可有效减少上述事件的发生,给予车乘人员以及车辆安全保障。此系统在Linux操作系统下,利用嵌入式开发板S3C2440搭建硬件环境,通过USB摄像头以及GPS模块采集车内实时的视频和位置信息,视频数据通过H.264的高效压缩编码,既可以得到高压缩比又拥有高质量流畅的图像,可以大大减少需要传输的数据量,并且将3G无线网络作为传输媒介,既可以解决传统有线网络对运动中的监控不能实现的问题,提供更加灵活的组网方式,满足不能架设线路的监控点的监控需求,还可以提供比GPRS和CDMA更宽的数据传输带宽,满足移动视频监控的要求。最终监控终端通过Web浏览器可以实时监控车辆内部的视频画面以及车辆所在的位置速度等信息。
1 系统的总体设计
3G无线视频监控系统主要由车载移动监控终端、网络传输、远程客户端3部分组成。系统的总体结构如图1所示。整个视频监控系统采用B/S结构。车载移动监控终端主要包括S3C2440平台上运行的GPS数据采集以及视频采集、视频的编码、嵌入式Web服务器、流媒体服务器。网络传输以TCP/IP协议为基础构建,实现RTP、RTCP、HTTP、TCP、UDP等传输协议。远程客户端实现车辆位置以及视频数据的接收、视频流的解码播放、网络状况反馈等功能。系统工作原理为:通过USB摄像头获取实时车辆内情况和司机驾驶状况,通过GPS定位模块获取GPS数据(经纬度、高度、时间、速度),并传送给ARM处理器,处理器对接收数据进行H.264编码并将编好码的NAL单元传送给流媒体服务器,流媒体服务器对压缩好的数据进行RTP封装并通过内部总线送到内置的boa服务器,并根据RTCP反馈回来的控制信息对H.264编码器和视频采集速率进行控制。Boa小型嵌入式服务器结合CGI技术来实现监控端和客户端的交互。远程客户端通过无线网络与boa服务器连接,采用ActiveX技术实现视频数据的接收、RTP报文的解封装、发送RTCP反馈信息、H.264视频解码、Web浏览器的显示。
2 系统的硬件组成及选型设计
2.1 车载移动终端
车载移动终端的组成如图2所示,主要由4部分组成:ARM处理器、GPS模块、3G无线数据发送模块、图像采集模块。主控处理器芯片选用三星公司推出的16/32位RISC微处理器S3C2440A,S3C2440A采用ARM920t内核,0.13μm的CMOS标准宏单元和存储器单元,最高运行频率达到400MHz,它的低功耗、简单、考究和全静态是专门为需要考虑花费和功耗的应用设计的,特别适用本系统。S3C2440A提供了丰富的片内资源,支持Linux。集成在芯片上的功能有:16 KB的指令和数据Cache、LCD控制器、AC97音频接口、摄像头接口、DMA控制器、PWM定时器、MMC接口等。它能完成整个系统的调度工作,在系统上电时配置所有需工作芯片的功能寄存器,完成视频流的编码,并通过3G无线网络向监控终端发送视频码流。
GPS模块使用u_blox公司的LEA-5H。LEA-5H具有50个通道的u-blox引擎,一百多万个有效相关器,热启动和辅助启动首次定位时间小于1 s,-160 dBm的SuperSense捕获和跟踪灵敏度,运行限制速度515 ms。系统通过该模块实时接收定位信息,保证中心控制模块可以实时处理定位数据。
图像采集模块的硬件资源选用了带USB接口的中星微摄像头。该款摄像头造价低廉,成像效果好,体现出了较好的性价比。与此同时。主板还预留了多个外围接口,以便扩展功能。
无线通信模块采用SIMCOM公司的SIM5218模块。无线SIM5218是一款WCDMA/HSDPA/GSM/GPRS/EDGE模块解决方案,支持下行速率达7.2 Mb/s和上行速率为5.76 Mb/s的数据传输服务,这对视频和图像等数据量相对较大的信号传输而言是非常理想的选择。同时,它还具有丰富的接口包括UART,USB 2.0,GPIO,I2C,GPIO,GPS,摄像头传感器和内嵌SIM卡等。在费用方面,3G因为是借助分包交换的技术,所以,网络使用的费用是以消费者的数据传输量来定。
2.2 监控中心
车辆监控中心由显示屏幕、监控服务器、主控工作台、路由器和存储器等硬件组成。按功能区分,其基本功能模块有数据接收模块、解码模块、显示模块和存储模块等。由于监控中心硬件可采用通用器件,故不需要进行专门的选型设计。
3 系统软件实现
系统选择Linux操作系统。Linux具有源代码开放、成本低廉、内核可裁减性强等特点,且集成有TCP/IP协议,对网络的支持是相对于其他操作系统的优势。基于ARM Linux的视频监控终端的软件设计主要完成三方面的工作:第一在硬件上搭建一个软件平台,搭建嵌入式Linux软件开发平台需要完成UBOOT移植、嵌入式Linux操作系统内核移植以及嵌入式Linux操作系统的设备驱动程序的开发等工作;第二在软件平台的基础上,借助交叉编译工具,开发视频监控终端上运行的采集、压缩、流媒体服务器程序;第三监控中心运行的接收、解压缩、显示程序。
3.1 S3C2440A的Linux平台的搭建
构建嵌入式Linux开发平台需要先构建交叉编译环境。一套完整的交叉编译环境包括主机和目标机。在开发中主机是一台装有Centos 5.5操作系统的PC机,目标机是基于S3C2440A的视频监控终端。选用的嵌入式Linux内核源代码包版本号为2.6.28,交叉编译器是GCC 4.3.2。编译内核之前首先要配置内核,裁减掉冗余的功能模块。具体步骤如下:
(1)通过命令make menuconfig,对内核进行配置,选择YAFFS文件系统,支持NFS启动,启用USB设备支持模块,包括USB设备文件支持模块、USB主控制器驱动模块等。此外,USB摄像头属于视频设备,还需要启用Video4Linux模块;
(2)用make dep命令生成内核程序间依赖关系;
(3)make zlmage命令生成内核映像文件;
(4)make modules和make modules_install命令生成系统可加载模块。这样就生成了zlmage内核映像文件,把它下载到目标平台的FLASH中。
本设计采用USB外置摄像头,在内核配置时要求以模块形式动态加载。首先要完成驱动程序驱动中需要提供基本的I/O操作接口函数open、read、write、close的实现,对中断的处理实现,内存映射功能以及对I/O通道的控制接口函数ioctl等,并把他们定义在struct file_operations中。接着把USB驱动程序编译成可以动态加载的模块。
3.2 车载移动终端软件设计
3.2.1 GPS模块程序设计
GPS接收机GPS15L输出数据格式符合NMEA-0183标准。NMEA-0183协议是由美国国家海洋电子协会制定的一种串行通信的数据协议,所有输入输出信息均为一行ASCII字符。它的一条消息称为语句(Sentence),每条语句都以“$”开始,以回车换行符(
由图3可以看出,GPS模块启动后首先对串口的初始化也就是对GPS模块的初始化,包括设置波特率、数据位、校验位等;然后后开始接收GPS数据,即从串口读数据,并将读到的数据保存到BUF中,接着进入数据的解析和提取阶段,判断BUF[5]是否等于“c”以判断是否为MYMGPR MC,若是,则开始提取经纬度、时间等信息并存入结构体GPS_DATA中。
3.2.2 视频采集模块设计与实现
视频采集模块是通过嵌入式Linux操作系统调度V4L(Video4Linux)及影像设备驱动程序来完成视频采集。V4L是Linux影像系统与嵌入式影像的基础,是Linux kernel里支持影像设备的一组API。在Linux操作系统中,外部设备被作为设备文件来管理,从而使得对外部设备的操作就转变成对设备文件的操作。其采集流程如图4所示。
主要过程如下:
(1)打开视频设备。调用函数int open(constchar * pathname,int flags),若返回值为-1,表示打开失败,否则,表示所打开设备的文件描述符。
(2)读取设备信息。Ioctl(cam_fp,VIDIOC_QUERYCAP,&cap)函数来取得设备文件的属性参数并存储存于cap结构中,其中cam_fp指的是打开的视频设备文件描述符。
(3)选择视频的输入方式。通过ioetl(cam_fp,VIDIOC_S_INPUT,&chan)函数设置视频设备的输入方式,其中chan的数据结构类型是V4L2 _input,用来指定视频的输入方式。
(4)设置视频帧的格式。通过ioctl(cam_fp,VIDIOC_S_FMT,&fmt)函数设置视频的帧格式,其中fmt的数据结构类型是V4L2_format,用来指定视频的宽度、高度、像素大小等。
(5)读取视频数据。通过read(cam_fp,g_yuv,YUV_SIZE)函数,把摄像头一帧的数据存放到g_yuv中,其中YUV_SIZE指的是每帧数据的大小。
(6)关闭视频设备。通过close(cam_fp)函数来实现视频设备的关闭。根据流程图可对其进行相应操作。当摄像头通过USB接口连接后,程序中调用V4L API对设备文件的读操作read(),即可完成视频数据采集到内存中,视频数据可用图4形式保存,也可压缩后封装进数据包。本文是先将采集数据进行H.264压缩后再封装进数据包,并传输到监控PC进行处理。
3.2.3 视频压缩模块设计
因视频采集模块采集的视频数据信息量非常大,为了提高数据传输速度、降低网络数据流量、保证监控的实时性,有必要对车载摄像头采集的数据压缩编码。文中采用H.264硬编码方式(硬编码具有不占用CPU资源,运算速度快等优点,从而满足视频数据实时性的要求)将摄像头采集的图像系列压缩编码成流媒体。具体编码的过程如图5所示。
(1)创建H.264编码结构。调用SsbSipH264Encodehlit(width,height,frame_rate,bitrate,gop_num)函数实现,其中width表示图像的宽度,height表示图像的高度,frame_rate表示帧频,bitrate表示比特率或码率,gop_num表示两个相离关键帧之间最多包含多少个帧(B或P帧)。
(2)初始化H.264编码结构,调用SsbSipH264Encode Exe(handle)函数。
(3) 获取视频输入地址,调用SsbSipH264EncodeGetInBuf(handle,0)函数来实现,该函数返回视频输入的首地址,存放在p_inbuf中。
(4)输入视频数据,调用memcpy(p_inbuf,yuv_bur,frame_size)函数实现,p_inbuf存放需要编码的数据,yuv_buf存放原始视频数据,frame_size表示数据的大小。
(5)编码视频数据,对p_inbuf内容进行H.264编码,调用SsbSipH264EncodeExe(handle)函数实现。
(6) 输出已编码的数据,调用 SsbSipH264EncodeGetOutBuf(handle,size),该函数返回已编码图像的首地址,size表示已编码图像的大小。
(7)关闭硬编码设备,调用SsbsipH264Encode DeInit(handle)函数实现的。
3.2.4 嵌入式服务器boa移植
Linux支持boa、HTTPD、THTTPD等几种Web服务器,其中boa Web服务器更适合于嵌入式系统,因为它是一个单任务、支持CGI(Common Gateway Interface,通用网关接口)功能的Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发出连接请求,可执行代码只有约60K。
首先进入boa源码目录的src子目录,执行命令./con-figure生成Maketile文件,然后修改Makefile文件找到CC=gcc,将其改成CC=arm-linux-gcc,再将CPP=gcc-E改成CPP=arm-linux-gcc-E,并保存退出。然后运行make进行编译,得到的可执行程序为boa,之后执行命令arm-linux-strip boa,将调试信息去掉,得到的最终程序。第二步完成boa的配置,使其能够支持CGI程序的执行。Boa需要在/etc目录下建立一个boa目录,里面放入boa的主要配置文件boa.conf,主要文件的含义有:AccessLog/var/log/boa/access_log访问日志文件。如果没有以/开始,则表示从服务器的根路径开始;VerboseCGILogs是否记录CGI运行信息,如果没有注释掉,则记录,注释掉则不记录;Document Root/var/wwwHTML文档的主目录,如果没有以/开始,则表示从服务器的根路径开始;DirectoryMaker/usr/lib/boa/boa_indexer当HTML目录没有索引文件时,用户只指明访问目录时,boa会调用该程序生索引文件给用户,因为该过程比较慢最好不执行,可以注释掉;Scri ptAlia/cgi-bin//var/www/cgi-bin/指明CGI脚本的虚拟路径对应的实际路径。一般所有的CGI脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+CGI脚本名。对boa.conf进行修改的必须要保证是使其他的辅助文件和设置必须和boa.conf里的配置相符,不然boa就不能正常工作。另外还需要创建日志文件所在目录/var/log/boa,创建HTML文档的主目录/var/www,将mime.types文件拷贝到/etc目录,创建CGI肢本所在目录/var/www/cgi-bin/。
3.2.5 CGI程序的设计
CGI提供了一个Web服务器的外部程序通道,运行在服务器上,由浏览器输入触发,是Web服务器和系统中其他程序的连接通道。CGI程序就是符合这种接口的程序。服务器接收到用户的请求,并将数据送给CGI程序。CGI程序接收到数据后,启动编写好的应用程序,并按照用户提供的数据执行。应用程序执行完成后,返回执行结果,并通过Web服务器传送给用户浏览器显不。
CGI模块程序的设计主要包括如下几部分:Web服务器的配置、HTML页面的编写、CGI脚本实现。
(1)Web服务器的配置
嵌入式Web服务器采用boa,其配置是以文本的形式提供,放在文件系统中的/etc/httpd/conf/目录下面,其主要配置在以上的boa服务器移植中讲述过了。
(2)HTML页面的编写
因为系统的设计的主要方向是能够通过USB摄像头进行实时监控。所以为了实现简单化,抛开一些不必要复杂的选择项。主要的HTML页面有登录界面、注册界面和监控界面。这些HTML放在嵌入式文件系统的/var/www目录下。
(3)CGI脚本实现
实现动态Web页面的第二步是用C编写CGI程序,CGI程序分为以下几部分:根据POST方法或GET方法从提交的表单中接收数据;URL编码的解码;用printf()函数来产生HTML源代码,并将经过解码后的数据正确地返回给浏览器。
3.2.6 远程视频数据接收模块设计
目前流行的浏览器有IE、FireFox、Chrome等,对于普通的文本及HTML文件支持的GIF、JPEG等格式的图片都可以轻松的显示,但对于实时视频数据,这些普通浏览器无法正常的显示。所以实时视频数据接收模块主要完成的工作是视频数据的接收、RTP报文的解封装、发送RTcP反馈信息、H.264视频解码和Web浏览器的显示。
本系统采用ActiveX控件技术,嵌入在Web页面中,来完成视频数据的接收、RTP协议、解码和最后的显示工作。最重要的一点,系统采用双缓冲技术,来满足视频的解码速度的问题,实现实时播放。具体流程图如图6所示。
4 系统的测试与结论
本文设计了一种基于ARM S3C2440的嵌入式视频监控系统,首先通过USB采集中星微摄像头作为服务器,实现利用V4L2技术对USB摄像头进行数据采集,并将数据送入H.264编码模块进行数据的压缩,压缩后的数据经过视频服务器RTP封装打包,最后通过嵌入式Web服务器与远程视频监控客户端进行交互。本系统在实际的运营网络中进行了测试,目标定位信息接收速率为1次/s,动态定位精度小于等于10 m;能实现动态视频传输,且视频传输流畅,图像最大分辨率可达VGA(640×480像素),视频传输的质量优于基于2.5G网络的车辆监控系统(图像最大的分辨率为320×240像素,且基本上只能传输静态图像)。