基于ARM无线视频监控系统及其数据传输研究

2017-08-09 01:34齐彦甫
网络安全与数据管理 2017年13期
关键词:解码嵌入式摄像头

张 喆,陈 以,齐彦甫

(桂林电子科技大学 电子工程与自动化学院,广西 桂林 541004)



基于ARM无线视频监控系统及其数据传输研究

张 喆,陈 以,齐彦甫

(桂林电子科技大学 电子工程与自动化学院,广西 桂林 541004)

为了解决视频数据太大而无法进行传输和传输过程中存在丢帧或失真问题,通过研究视频编解码将H.264编码与FFmpeg解码相结合来搭建监控系统,并采用移动目标检测法将移动的目标进行图片和视频保存。服务器端采用ARM9为硬件平台,USB摄像头采集图像数据,经H.264编码后传输给客户端。客户端接收数据后通过FFmpeg进行解码,OpenCV函数进行显示监控画面,并通过网页浏览保存好的图片和视频。系统测试表明:视频数据的格式转换不失真及丢帧率较低,使用x264库对视频进行压缩编码、FFmpeg对视频解码,达到了监控系统预期理想的效果。

H.264;FFmpeg;编解码;移动目标检测

0 引言

嵌入式系统以及对视频数据处理技术的不断成熟,使得市场上涌现出以嵌入式设备为核心的监控系统[1]。嵌入式监控设备具有操作简单、占用空间小、价格低等优点。其次嵌入式设备上运行着可裁剪的Linux操作系统[2]。摄像头获取的图像数据通过软件库进行压缩,通过网络进行传输。嵌入式服务器具有数据通信、操作系统、处理视频图像数据等功能,使视频监控更加灵活、方便、范围变广[3]。

视频监控系统经历3个阶段:模拟化视频监控、数字化视频监控、智能化视频监控。在本系统中,图像数据通过USB摄像头获取,并将图像数据压缩编码成H.264格式,然后将每个视频帧打包到UDP包中进行传输,在接收端中采用FFmpeg进行解码及OpenCV函数进行显示视频数据[4],并且通过移动目标检测法将图片和视频保存,使用网页进行浏览。

1 系统结构

无线视频监控系统由ARM服务器、PC以及无线路由器3部分组成,其系统结构如图1所示。系统采用Mini2440硬件平台,添加设备谷客HD10摄像头、无线网卡。系统使用USB摄像头获取实时视频图像数据,并将原始数据转换为YUV420P格式,用H.264标准对数据进行压缩编码,再通过网络进行数据传输,客户端接收数据后采用FFmpeg进行解码,最后采用OpenCV函数显示视频图像。采用移动目标检测法将移动目标的图片和视频保存下来,并通过网页进行浏览[5]。

图1 系统总体结构

2 服务器实现

服务器端主要包括嵌入式平台、摄像头以及无线网卡。此外,设备驱动程序也是需要Linux平台搭建交叉编译环境后才能运行。平台采用Mini2440为硬件开发平台,适用于成本低以及功率小的嵌入式系统场合。采用谷客HD10摄像头,使用CMOS传感器,在接口上也能保持与Mini2440的一致性。

2.1 搭建嵌入式Linux平台

任何一个嵌入式系统都需要启动加载程序、Linux内核、根文件系统等3部分。在本系统中,首先在虚拟机中搭建交叉编译环境,然后对uboot进行编译移植到开发板上,再对内核Linux-2.6.32进行裁剪和配置。最后制作最小根文件系统,并移植到平台上。至此嵌入式Linux平台搭建完成[6]。

2.2 采集端

摄像头驱动程序采用的是V4L2接口协议,再将其程序加载到Linux内核中。其工作流程为:打开设备、检查和设置设备属性、设置帧格式、设置一种输入输出方式、循环获取数据、关闭设备。

加载完驱动程序后即可操作摄像头设备。如定义id,通过id=open(“/dev/video0”,O_RDWR)来打开摄像头,再通过close(id)来关闭摄像头[7]。在整个采集端中,ioctl函数十分重要。使用ioctl函数来管理设备驱动程序中对设备的I/O通道,如使用ioctl(id,VIDIOC_QUERYCAP,&caps)来判断当前设备和driver是否支持V4L2规范。使用ioctl函数来检查是否支持MMAP或者是USERPTR。通过ioctl(id,VIDOC_QUERYBUF,&buf)查询申请到的内存并获取分配的buf,且mmap到进程空间中。然后再枚举设备所支持的图像格式,获取USB摄像头所采取视频数据格式为YUV422,然而H.264编码所需图像格式为YUV420P,则采用FFmpeg中函数sws_scale()进行图像转换。最后将转换后的图像数据再重新入列到BUF中,并循环获取视频数据。

2.3 H.264编码

视频压缩标准H.264是1995年发布的。它是由ITU-T和ISO/IEC联合共同开发。因此,H.264被普遍认为是最有影响力的行业标准。H.264具有低码流、图像清晰度高、容错能力强、网络适应性强等优点[8]。

系统采用了开源软件x264对视频数据进行编码。将x264软件进行部分的修改和优化,再通过交叉编译后移植到平台上。先通过x264_param_default_preset(&ctx->param,“fast”,“zerolatency”)函数设置编码属性,再填充ctx->param结构体。然后通过x264_encoder_open(&ctx->param)函数来打开编码器。再通过函数x264_picture_init(&ctx->picture)初始化图像结构体并填充图像结构体&ctx->picture。接下来,就是十分重要的编码了,通过函数x264_encoder_encode(c->x264,&nals,&nal_cnt,pic,&pic_out)来编码一帧图像并使用do-wile语句不断循环进行编码。将编码后的数据放入到内存中,等待网络发送。其编码流程如图2所示。

图2 编码流程

2.4 视频数据传输

通过摄像头采集数据,并对数据进行编码,最后对数据进行传输。系统采用UDP协议进行传输,通过socket(AF_INET,SOCK_DGRAM,0)函数确定采用IPv4地址以及UDP协议,再经sendto()函数传输数据。整个过程就是不断进行获取视频数据、压缩视频数据、传输视频数据、等待等一系列过程。

2.5 移动目标检测法

移动目标检测法在一定程度上模拟大脑的能力,实现智能监控。目前,人工智能水平还比较低级,智能监控程度也比较有限。现阶段监控也只能针对特定情况下的运用,如人脸识别、车牌扫描、移动目标检测等。

系统采用开源软件motion作为移动目标检测法,通过编译motion软件,将motion命令和配置文件拷入ARM中,就可以对图像数据进行处理和分析,并将图片和视频保存。分析motion源码,程序通过采集图像数据,将前一帧图像数据与后一帧图像数据进行比较,当达到一定数目像素,就会判断有无移动目标,并通过方框标注移动目标,且将会保存图片和视频。motion主函数main产生两个重要的线程,一个线程是在函数start_motion_thread()中调用static void *motion_loop()函数,进入线程motion_loop()函数,该函数实现motion的主要功能,如读取配置文件、采集图像、检测运动等。另一个线程通过函数pthread_create()进入Web网页浏览视频控制函数void *motion_web_control(),用以远程控制motion。

3 客户端实现

3.1 FFmepg简介

FFmpeg是音视频多种格式的集录影、转换、编解码等功能为一体,采用了LGPL或GPL许可证。FFmpeg库需要在平台上进行交叉编译后才能运行。FFmpeg包含了音视频编解码库libavcodec以及音视频格式转换函数库libavformat。FFmpeg支持H.264、MPEG4、DV、FLV等40 多种编码,同时支持H.264、MPEG、ASF、AVI等90多种解码[9]。

3.2 解码

FFmpeg解码的核心函数为avcodec_decode_video()。客户端接收到视频帧数据后,将其存储到AVPacket格式的内存空间,采用avcodec_decode_video()函数解码。其解码流程如图3所示。

图3 解码流程图

以下对过程中各个函数的作用进行说明:

(1) avcodec_register_all():注册库中所有文件格式和编解码器;(2) avcodec_find_decoder():查找解码器,对解码器参数codec进行初始化。如codec=avcodec_find_decoder(CODEC_ID_H264),寻找H.264格式解码器;(3) avcodec_alloc_context():为AVCodecContext分配内存;(4) avcodec_open():打开解码器;(5) avcodec_alloc_frame():为解码帧分配内存,frame=avcodec_alloc_frame(),其中frame为AVFrame格式;(6) AVPacket pkt:使用AVPacket结构建立缓冲区装载数据;(7) avcodec_decode_video():进行解码一帧数据;(8) sws_cale():转换视频数据格式以待显示;(9) avcodec_close():关闭解码器。

3.3 视频显示

在经过FFmpeg解码后,视频数据格式为YUV420P。但是OpenCV显示函数中需要视频数据格式为RGB。则必须通过FFmpeg中的sws_scale()函数将数据进行格式转换。在OpenCV的显示函数中,其核心函数为cvShowImage(char *name, Ipllmage *dst)。通过FFmpeg转换过来的RGB格式转换为OpenCV格式的Ipllmage数据,然后通过函数cvNamedWindow("Test Window", CV_WINDOW_AUTOSIZE)建立窗口,最后通过核心函数显示。

3.4 网页设计

系统采用Boa服务器作为嵌入式Web服务器。Boa服务器具有体积小、功能全、内存使用较少且支持CGI交互程序等特点。CGI是外部扩展应用程序与WWW服务器交互的一个标准接口。通过CGI应用程序可以处理浏览输入的数据,从而完成客户端与服务器的交互操作。

移植Boa服务器,进行交叉编译。修改配置文件boa.conf,并在根文件系统中的etc目录下新建boa文件,将boa配置文件放到该目录下,将boa命令放在sbin目录下,最后在终端运行boa。移植cgic库,使用的是cgic205版,进行交叉编译。在根文件下新建目录/web,/web/cam。在主网页设计中,对图片和视频显示代码为,。

而代码中image.cgi需要将显示图片的C程序编译成cgi程序,其中显示图片核心代码fprintf(cgiOut, "",g_img[i].name),将image.c程序通过交叉编译即arm-linux-gcc -L ./cgic205/ -lcgic -I ./cgic205/ image.c -o image.cgi,将image.cgi程序拷贝到/web/cam目录下。同样,将movie.cgi程序拷贝到/web/cam目录下。在PC输入http://192.168.1.4就可以浏览到图片和视频。

4 系统测试

在Fedore14系统中编译服务器程序以及客户端程序,并将服务器程序通过串口下载到ARM开发板上,设置开发板ip地址为192.168.1.4。在SecureCRT界面中输入命令,运行服务器端程序和motion程序,注意到ARM开发板通过USB摄像头获取图像信息。最后在Fedore14系统中运行客户端程序,跳出窗口,显示监控画面,如图4所示。并登录网页输入开发板的ip地址,浏览图片以及视频,如图5所示为图片浏览,图6所示为观看视频。

图4 监控画面

图5 浏览图片

图6 观看视频

在系统测试过程,分别在客户端和服务器端打印信息。根据所打印的信息,可以看出视频数据在压缩、传输、解码的过程中,受损较小,这使得画面得以清晰。

为了计算客户端解码帧率[10],通过服务器端采集2 000帧视频图像,统计客户端解码后所显示帧数以及计算FPS(每秒显示的图像数)。测试结果如表1所示。通过以下数据,表明对于320×240的视频图像,客户端显示能达到10帧/s,显示较为流畅,偶尔会丢帧,结果达到预期目标。而对于640×480视频图像情况,由于数据量变大其客户端显示只能达到2帧/s左右,显示效果不太流畅,丢帧现象严重,需要优化或修改方案。

表1 测试结果表

5 结束语

视频数据格式越来越繁复多样,视频数据的格式转换要求不失真或丢帧率较低,所以编解码技术及其选择将显得尤其重要。本文使用开源软件x264库对视频进行编码,使用FFmpeg对视频进行解码,系统监控达到预期理想的效果,实现跨平台清晰的无线视频监控过程。实验测试表明,本系统为视频编解码传输提供了一种可行方法。

[1] 辛长春,娄小平,吕乃光.基于FFmpeg的远程视频监控系统编解码[J].电子技术,2013(1): 3-5.

[2] 马毅. 基于Linux的远程视频监控嵌入式系统的设计与实现[D].上海:上海交通大学,2001.

[3] 王必安.基于H.264的嵌入式远程视频监控系统的设计与实现[D].武汉:武汉科技大学,2012.

[4] 汪洋.李垚.黄鲁.基于Qt和OpenCV的无线视频监控系统[J].微型机与应用,2015,34(10):68-69.

[5] 陈娟,李元,李万国.基于B/S模式的嵌入式系统测试方法与实现[J].电子技术应用,2016,42(2): 52-56.

[6] 赖于树.ARM微处理器与应用开发[M].北京:电子工业出版社,2007.

[7] Joratban Corbet.Linux设备驱动程序(第三版)[M].北京:中国电力出版社,2005.

[8] 毕厚杰.新一代视频压缩编码标准—H.264/AVC[M].北京:人民邮电出版社,2004.

[9] 蒋志峰.FFMPEG的快速音视频开发方法[J].单片机与嵌入式系统应用,2008(1):69-71.

[10] 李保国.基于嵌入式ARM的远程视频监控系统研究[D].南京:南京理工大学,2009.

Research on wireless video surveillance system and its data transmission based on ARM

Zhang Zhe, Chen Yi, Qi Yanfu

(Institute of Electrical Engineering and Automation, Guilin University of Electronic Technology, Guilin 541004,China)

For solving the problem that the video data is too large to be transmitted and lost frame or distortion in video data transmission, the video surveillance system is constructed by combining H.264 encoding with FFmpeg decoding by studying video codec,and motion detection method is used to save the moving object image and video. The server part uses ARM9 as the embedded hardware platform, and captures video data by the USB camera. Through H.264 encoding, the video data is sent to client part. The client part decodes the

data by FFmpeg, then through OpenCV function to display the monitor screen and through the web to browse pictures and videos. The system test results show that the format conversion of the video data is not distorted and the frame loss ratio is low. Using x264 library for video compression coding,FFmpeg for video decoding, can achieve the desired effect of the monitoring system expected.

H.264; FFmpeg; encoding and decoding; motion detection

TP277

A

10.19358/j.issn.1674- 7720.2017.13.016

张喆,陈以,齐彦甫.基于ARM无线视频监控系统及其数据传输研究[J].微型机与应用,2017,36(13):52-54,58.

2017-02-09)

张喆(1991-),通信作者,男,在读硕士研究生,主要研究方向:精密测量与智能控制。E-mail: 624097565@qq.com。

陈以(1963-),男,硕士,教授,主要研究方向:精密测量与智能控制。

齐彦甫(1989-),男,硕士研究生,主要研究方向:精密测量与智能控制。

猜你喜欢
解码嵌入式摄像头
浙江首试公路非现场执法新型摄像头
《解码万吨站》
摄像头连接器可提供360°视角图像
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
解码eUCP2.0
TS系列红外传感器在嵌入式控制系统中的应用
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机
搭建基于Qt的嵌入式开发平台
奔驰360°摄像头系统介绍