基于嵌入式的家用无线视频监控系统设计

2014-06-12 06:28凌家良卓桂成陈中魁谢朝德
通化师范学院学报 2014年10期
关键词:控制板内核嵌入式

凌家良,卓桂成,陈中魁,谢朝德

(惠州学院 电子科学系,广东 惠州 516015)

1 系统总体结构设计

系统硬件方面由以三星公司的S3C2440微处理器[1]为核心的主控制板、摄像头采集模块、无线WIFI网卡模块、PC终端监控接收模块组成.软件方面由Linux内核、摄像头与无线网卡驱动、无线WIFI网卡控制管理程序、视频接发送处理程序等组成. 系统整体结构如图1所示.

图1 系统整体框图

主控制板上图像采集程序模块启动后,摄像头对图像进行采集,并通过摄像头中的特定芯片对图片进行JPEG压缩和处理,采集到的数据通过USB接口发送到主控制板上,主控制板上运行的特定程序对接收到的数据进行处理,当用户需要进行视频监控时,主控制板执行图像的发送程序,通过无线网卡将图像发送出去,最后我们可以在局域网内或互联网终端上的浏览器上输入主控制板上视频服务器的地址,即可以显示实时的监控画面.

图2 主控制板电路

2 嵌入式 Linux 开发环境的搭建

Linux 操作系统平台的应用开发环境一般由目标机(开发板)和宿主机(PC 机)构成.目标板上用到的操作系统内核、根文件系统、应用软件等都需要通过宿主机(PC 机)来完成.

(1)引导装载程序 Bootloader 的移植.

Bootloader是嵌入式操作系统上电后最先执行的一小段程序,主要完成对整个系统硬件初始化设置,完成内存空间映射表的建立,微调用操作系统内核设置正确的环境等操作后,实现对操作系统的加载,具体步骤如下.将supervivi.bin拷贝至/tftpboot/

在终端SecureCRT中依次输入:

tftp 0x30008000 supervivi.bin

nand erase 0 0x60000

nand write 0x30008000 0 0x60000

将程序烧写到地址02x30008000后,再擦除nand flash 0~0x60000地址的数据,最后将0x30008000后的数据写在地址0~0x60000内.

(2)Linux 内核的移植.

对内核的移植工作主要是修改与硬件平台相关的代码[2].本系统使用的 Linux 内核版本为 2.6.32的zImage,步骤如下:

将 zImage_x35拷贝至/tftpboot/

在终端SecureCRT中依次输入:

tftp 0x30008000 zImage_x35

nand erase 60000 500000

nand write 0x30008000 0x60000 0x500000

将内核程序烧写到地址02x30008000后,再擦除nand flash 0x60000~0x500000地址的数据,最后将0x30008000后的数据写在地址0x60000~0x500000内.

根文件系统挂载地方的不同,可以分为NFS根文件系统和YAFFS根文件系统,前者是文件系统之上的一个网络抽象,用来允许远程客户端与本地文件系统通过网络进行访问.后者是专门为NAND Flash存储器设计的,适用于大容量的存储设备的嵌入式文件系统.YAFFS让嵌入式设备有能力脱离主机独立运行.将内核与根文件系统所生成的映像文件下载到主控制板后,启动系统.

(3)提供数据压缩用的函数库zlib的移植.

解压zlib-1.2.5.tar.gz

#tar -xzvf zlib-1.2.5.tar.gz

进入源文件目录

#cd zlib-1.2.5

运行configure配置makefile

#./configure --prefix=/mnt/video/ffmpeg

#make

#make install

(4)H264编码器x264的移植.

因为编译FFMPEG时需要添加对x264的支持[3-4],所以要先编译好x264,以便让编译ffmpeg时能够找到它.

解压last_x264.tar.bz2

#tar -xvzf last_x264.tar.bz2(先用bzip解压,而后tar)

#cd x264-snapshot-20120316-2245

#./configure --host=arm-linux --prefix=/mnt/video/ffmpeg --enable-shared --disable-asm

#make

#make install

(5)视频和音频流方案FFmpeg的移植.

解压ffmpeg-1.0.tar.gz

#tar -xzvf ffmpeg-1.0.tar.gz

#cd ffmpeg-1.0

#./configure --enable-cross-compile --target-os=linux --cross-prefix=arm-linux- --cc=arm-linux-gcc --enable-shared --arch=armv6 --enable-gpl --enable-libx264 --prefix=/opt/webcam/ffmpeg --extra-cflags=-I/mnt/video/x264/include --extra-ldflags=-L/mnt/video/x264/lib/

#make

#make install

3 视频监控系统服务器端的设计与实现

视频监控系统服务器端的主要功能是利用 Linux 系统中的 V4L2 视频设备编程接口来实现对视频数据的采集,利用FFMPEG开源软件转换视频数据帧为YUV格式,使得x264可以进行H.264压缩编码,再利用基于UDP协议的 SOCKET套接字进行传输发送至客户端,客户端接收数据进行解码并利用X Windows位图显示的视窗系统实现本地回放显示[5].

(1) 视频数据的采集技术.视频采集都是围绕 V4L2定义的几种重要数据结构实现的,完成基于V4L2 的USB视频采集,就要获得相关的视频采集设备的信息和图像信息,并对采集窗口、帧状态初始化,然后才能进行视频的采集工作.

在视频采集中,应用程序首先通过int fd=open(/dev/video0 ,O_RDWR)函数,打开视频采集设备并返回一个文件描述符号 fd,而这个文件描述符就代表被打开的视频采集设备.在打开设备后,通过ioctl()函数,获取视频采集设备的相关信息,然后将获取的视频采集设备的信息放到结构体struct v4l2_capability中.最后,可以通过 close()函数,实现视频采集设备的关闭.

(2) 视频数据的转换技术.本设计的USB摄像头采集的数据帧的格式为YUYV(4:2:2),而要进行H264压缩编码,输入格式必须为YUV(4:2:0),所以要对数据帧进行格式转换.其中我们要运用到FFMPEG软件中swscale函数库的三个函数sws_getContext()、sws_scale()、sws_freeContext().

三个函数在转换过程中起到主要作用,sws_getContext()函数进行初始化确立原始的数据帧格式、图像高度和宽度,还有要转换成的数据格式、图像高度和宽度,sws_scale() 函数起到数据帧转换的主要作用,通过这个函数可以获得目标的数据帧格式,sws_freeContext() 函数是在结束数据采集时用来结束格式转换.

(3)视频数据的压缩技术.x264是一个开源代码视频编码器,在压缩之前,需要对编码器设置必要的参数, 比如param_default_preset(&ctx->param, "fast", "zerolatency"),接下来函数x264_encoder_open{}会检查编码参数是否合法,通过x264_encoder_encode (h,&nal,&i_nal,pic,&pic_out)对视频帧进行编码,最后,x264_encoder_close()结束编码,释放内存.

(4) 视频数据的传输技术.经过压缩编码后,要完成 UDP/IP 的封装.通过创建数据报套接字类型.

int socket = socket(AF_INET, SOCK_DGRAM, 0),设置为基于UDP的数据传输,通过struct sockaddr_in设置服务端.

sockaddr_in_family=AF_INET; // 协议类型是INET

sockaddr_in.s_addr=htonl(INADDR_ANY); // 本机

sockaddr_in.sin_port=htons(PORT); // 绑定端口

最后一步是 Sendto()函数的调用.视频监控前端通过调用Sendto()函数发送目标视频图像数据,通过网络信道,传输数据到视频监控终端,视频监控终端通过接收函数 recvfrom()接收视频图像数据.

4 视频监控系统客户端的设计与实现

(1) 视频数据的接收.通过创建套接字int socket = socket(AF_INET, SOCK_DGRAM, 0)设置为基于UDP的数据传输,通过struct sockaddr_in设置客户端.

sin.sin_family = AF_INET; // 协议类型是INET

sin.sin_port = htons(RECV_PORT);// 服务器端口

sin.sin_addr.s_addr = inet_addr("127.0.0.1");

调用bind的函数bind(sock, (sockaddr*)&sin, sizeof(sin)之后,该套接字sock与一个相应的地址关联,发送到这个地址的数据可以通过这个套接字来读取与使用.最后,视频监控终端就可以调用数据接收函数 recvfrom 接收视频数据.

(2) 视频数据的实时显示.利用针对X图像处理开发的扩展库MIT-SHM,可以使用共享的内存来存储XImage结构,一幅存储在共享内存中的图像文件可被多个任务同时访问[6-7].图像数据在传递或被其他进程访问时,不需作拷贝操作,只需要传递这个XImage的数据指针.

建立并使用一个基于共享内存的XImage分为以下几个步骤.

建立一个共享内存段:

用XShmCreateImage()建立一个shared Image结构. XShmCreateImage(Display display, visual*visual, unsigned int depth, unsigned int width, unsigned int height, int format, char*data, XShmSegmentInfo*shminfo).

Shminfo指向一个XShmSegmentInfo结构,用来通知该内存段的信息.

调用XShmPutImage()在X Windows显示图像,调用的接口如下:

XShmPutImage(Display*display,Drawable d,GC gc,XImage *image,int src_x,int src_y,int width,int height,int dest x,int dest y,bool send event).

最后调用XShmDestroyImage()释放图像资源.

5 总结与展望

本系统实现了对摄像头图像数据的采集,通过H264的压缩编码,减小数据的大小,通过无线WIFI网络实现了无线数据的传输,最后在监控端成功地播放摄像头采集的视频数据,如图3所示.

图3 客户端显示无线视频数据

但是,系统还存在着一些问题,比如图像传输速率不足,视频播放存在延时.另外,后续改进将增加相关传感器,如人体红外传感器和烟雾传感器等,提供外部传感器信号触发摄像头自动开启工作,以实现真正意义的家用实时无线视频监控.

参考文献:

[1]吴君钦,宋健,刘昊.基于S3C6410和ADV7180的嵌入式视频采集系统设计与实现[J].计算机工程与科学,2012(12).

[2]孙天泽.嵌入式设计及Linux驱动开发指南[M].北京:电子工业出版社,2007.

[3]毛剑飞,张杰,蒋莉.基于改进的H.264的视频监控系统[J].计算机系统应用,2014(04).

[4]江俊杰,王志明.基于X264的嵌入式视频监控系统设计[J].计算机工程与设计,2013(12).

[5]周若谷,丁峰,鲁力.视频监控系统中嵌入式Web服务器的设计与实现[J].计算机科学,2011(05).

[6]颜珂斐.嵌入式智能视频监控报警系统设计[J].实验技术与管理,2014(02).

[7]李威,田联房,李向阳.嵌入式网络视频监控系统的硬件设计与实现[J].微计算机信息,2010(08).

猜你喜欢
控制板内核嵌入式
多内核操作系统综述①
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
微软发布新Edge浏览器预览版下载换装Chrome内核
TS系列红外传感器在嵌入式控制系统中的应用
轨道交通AFC导向标识控制板设计
搭建基于Qt的嵌入式开发平台
一种集成脚本控制单元的设计与实现
一种全隔离的无刷直流电机的反馈制动控制板的研究