基于Android的MJPEG网络摄像机设计
扫描二维码
随时随地手机看文章
深入研究了MJPEG视频压缩算法,阐述了算法实现过程,并设计出基于Android操作系统的3G手机网络摄像机客户端软件。本系统通过实地安装与测试达到了预期效果,突破了传统网络摄像机客户端固定地域的限制,有良好的应用前景。
1 系统硬件组成与网络架构
摄像机硬件核心采用三星公司推出的基于ARM9架构的S3C2440A芯片,该处理器主频达到400 MHz可以满足实时压缩,MJPEG视频流可以达到320&TImes;240分辨率25 fps的性能要求。外围搭配64 MB SDRAM、256 MBNAND Flash,网络功能由DM9000以太网MAC控制芯片负责,摄像头模块由USB控制器控制,系统供电由3片LM71117组成,分别输出3.3 V、1.8 V、1.25 V电压,辅助外围接口构成摄像机硬件结构。S3C2440A系统硬件框图如图1所示。
网络摄像机是互联网上的TCP/IP设备,系统网络拓扑图如图2所示。其中在家庭区域内根据安防的特点在大门走廊、客厅内、阳台区域分别布置摄像机,再由网线连接到路由器,配置路由器参数映射每个摄像机独立端口与IP地址,即完成Internet接入。远端由固定位置的PC机,移动位置的3G笔记本和随身携带的3G Android手机组成,PC机可以通过WEB浏览器访问与控制网络摄像机,Android手机通过客户端实现实时访问。
2 系统软件设计
2.1 网络摄像机软件设计
搭建摄像机需要Linux系统环境,首先移植Bootloader,对Linux 2.6.32内核进行裁剪,加载Linux UVC(USB video device class)驱动及相关驱动,将编译好的Linux系统镜像烧写到ARM板Nand Flash中,对Bootloader没置启动引导地址,即完成软件运行环境搭建。
分析网络摄像机性能需求与拓展性,须满足下列条件:
◆视频监控实时性;
◆支持多客户端同时连接;
◆图像识别算法或预留接口;
◆功能模块化满足后期开发可扩展。
因此,采用多线程架构与互斥锁机制来保证实时性、模块化的思想设计代码结构。软件程序主流程如图3所示。
其中主要实现如下功能。
①初始化Linux V4L2接口,必须按照V4L2标准结构初始化结构体,其中包括struct v412_capability cap;struct v412_format fmt;struct v412_buffer buf;struct v412_requestbuffers rb;struct v412_streamparm setfps。此外将视频设备名、视频宽度、视频高度、帧率、视频格式和抓取方法传递给函数init_videoIn(struct vdIn*vd,char*device,int width,intheight,int fps,int format,int grabmethod)实现初始化。值得注意的是众多USB camera并不支持JPEG格式视频流直接抓取,针对YUYV格式抓取却有广泛支持。后期进行图像识别算法操作时直接分析YUYV原始图像数据,将节省JPEG压缩数据转换为原始图像数据的大量运算开销,因此采用YUYV抓取模式。
②创建核心图像处理线程。在该线程内实现:抓取功能。
◆UVC设备单帧抓取,uvcGrab(struct vdIn*vd)函数实现单帧YUYV格式的原始图像拷贝到内存,采用高效的mmap内存映射方法读取;
◆JPEG核心算法实现,JPEG压缩算法占用大量CPU时间,下一小节将详细讨论。
③创建套接字接口。为实现多用户同时连接网络摄像机,必须采用socket服务线程,每当有新用户连接同时产生一个新线程与之对应,实现多用户端同步监控。
④搭建基于Web浏览器访问方式的Web主页。嵌入式设备资源有限,轻量级的Web Server主要有:Boa、Httpd、Thttpd等。本设计选用开源的Boa、交叉编译Boa源码配置boa.conf文件,配置系统etc自启动shell加入Boa程序,将编写HTML页面文件放入系统中对应的www目录后即可正常工作。