基于ARM Linux的3G无线车载视频监控系统
由图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所示。
- 基于GPS和GPRS的小型追踪器设计方案(05-20)
- 基于GPSOne技术的个人定位终端(07-30)
- 2010年中国(成都)电子展胜利闭幕(08-15)
- 基于DSP的车载GPS/DR组合导航系统硬件设计(09-13)
- ARM-Linux平台下GPS信号的采集与处理研究(07-25)
- 基于MiniGUI的GPS导航定位系统设计(02-20)