基于嵌入式的农场智能监控系统研究

冉耀宗
摘 要: 由于利用有线网络进行通信以及监控端体积过大,导致视频监控系统的隐蔽性差,视频监控的威慑力和灵活性受到影响,基于此,利用DaVinci平台的Linux嵌入式系统设计了一套网络视频传输系统,完成了基于DaVinci平台的农场视频网络传输系统设计,包括H.264编码、农场视频的采集以及基于RTP协议的网络传输等功能。嵌入式的农场智能监控系统运行成功后,采用本地计算机上的VLC播放器能对摄像机采集的视频进行实时播放,通过对系统测试分析证明此系统稳定可靠,完全满足视频网络传输的需求。
关键词: 监控系统; 农场视频监测; VLC播放器; 视频网络传输
中图分类号: TN919?34; TM417 文献标识码: A 文章编号: 1004?373X(2017)21?0023?04
Research on farm intelligent monitoring system based on embedded system
RAN Yaozong
(Department of Physics & Electronic Information Engineering, Tongren University, Tongren 554300, China)
Abstract: The communication using wired network and oversize volume of monitoring terminal may result in the poor concealment of video surveillance system, and affect the deterrence and flexibility of video surveillance. Therefore, a network video transmission system based on Linux embedded system of DaVinci platform is designed for farm video, which can realize the functions of H.264 encoding, farm video acquisition and network transmission based on RTP protocol. After the successful operation of the embedded farm intelligent monitoring system, the VLC player in local computer can be used to play the video captured by camera in real time. The system test and analysis results verify that the system is stable and reliable, and can fully meet the reqirement of video network transmission.
Keywords: monitoring system; farm video monitoring; VLC player; video network transmission
近年来,随着国民经济的快速发展,城市中植物工厂、都市菜园、智能农场的数量迅速增加,由此带来的监控问题也日益凸显,传统有线网络进行通信以及监控端体积过大,导致视频监控系统的隐蔽性差,视频监控的威慑力和灵活性受到影响[1]。本文的研究目标是设计一套智能的农场视频监控系统,该系统能够将视频采集、H.264编码以及基于RTP协议的网络传输等功能很好的实现,并对农場植物的生长情况进行记录和视频分析处理,最终实现农场视频监控的智能化。
1 系统总体架构设计
嵌入式的农场智能监控系统分为视频采集、视频编码、视频显示以及网络传输四个模块,可以将网络摄像头收集的农场视频信号经过H.264编码后,依照RTP/RTCP网络协议通过网络传输到监控主机,四个模块的具体功能如下:
视频采集模块:通过摄像头将农场的视频信号进行采集,并且运用 PAL制式将信号输入到TVP5158视频解码芯片中,该解码芯片可以将信号转换为YUV格式的数字信号,DM6446处理器接收YUV格式的数字视频信号进行下一步的处理[2]。
视频编码模块:受网络带宽的限制,数字视频信号要想实现网络传输必须经过压缩编码处理,本模块采用H.264编码技术,实现视频的高效压缩,为视频的网 络传输做好准备。
视频显示模块:为方便调试,摄像头采集的视频能在本地的液晶屏上显示,从而实现对摄像头采集视频信号的实时观察。同时,应用OSD(On?Screen Display)技术,ARM核和DSP核的负载率、视频编码过程中的动态参数(如分辨率、比特率、帧率等)也将显示在本地LCD液晶屏上[3]。
网络传输模块:此模块为系统最为关键的部分,通过对H.264编码后的视频数据流进行分析,提取出H.264的NALU(网络抽象层单元),结合RTP协议的载荷数据格式对压缩后的视频数据进行打包,然后发送到以太网上。在本地计算机上将能够播放摄像头采集的实时视频。
2 系统应用程序设计
2.1 系统主程序
系统主程序由主线程main()组成,主要负责对必要的初始化任务以及其他线程的创建。首先,通过输入输出控制FBIO_GETSTD实现视频标准的检测;然后对命令行参数解析、环境变量的设置以及CodecEngine及其日志跟踪模块的初始化;其次,初始化Rendezvous对象和Pause对象;再次,根据前面参数的解析结果创建其他的4个线程;最后调用函数void*Ctrl Thread(void*arg),主线程变成控制线程[4?5]。
2.2 视频采集模块
视频采集模块调用视频采集线程void*Capture Thread(void*arg),完成原始视频帧的采集并把它们发送给视频显示线程和编码线程[6]。首先调用函数Init Capture Dev()完成对视频捕捉设备的初始化。在此函数中,视频输入选择了复合视频输入,并能自动检测视频输入标准(PAL或NTSC)。然后,分配三个视频采集Buffer,并把这些Buffer映射到用户空间。当完成初始操作之后会等待其他线程全部完成初始化之后,再进行视频采集线程的主循环程序,开始采集视频流。
2.3 视频编码模块
视频编码模块调用视频编码线程void*Video Thread(void*arg),从采集线程得到原始图像Buffer,并应用H.264视频编码算法对其进行视频编码,然后,经编码的视频帧被发送给网络传输线程,发送到以太网上。其中,视频编码线程的初始化主要完成以下工作:
(1) 使用函数Engine_open()打开一个CodecEngine,此函数返回一个Codec引擎句柄。
(2) 使用函数VideoEncodeAlgCreate()创建H.264视频编码算法。
(3) 分配与网络传输线程数据交互的Buffer。首先使用函数Memory_Alloc()分配连续的Buffer,然后使用函数FifoUtil_put()把Buffer发送到网络传输线程。
(4) 分配与视频采集线程数据交互的Buffer。首先应用函数Memory_contigAlloc()分配连续的Buffer,之后通过函数FifoUtil_put()给视频采集线程发送Buffer。
当完成初始操作之后会等待其他线程全部完成初始化之后再进行视频采集线程的主循环程序,在循环的过程中,只要任意一个地方报错就会立即跳出循环,进行纠错步骤。
2.4 视频显示模块
视频显示模块包括实时视频数据的本地显示和图像动态参数信息的OSD显示,分别调用视频显示线程void*Display Thread(void*arg)和控制线程void*CtrlThread(void*arg) [7]。
(1) 视频显示线程
为了在本地液晶屏幕上实时显示摄像头采集的视频图像,在原始视频图像被编码之前,视频处理子系统前端所采集到的原始视频数据会进行往视频处理子系统后端复制的步骤。
线程中调用函数InitDisplayDev()初始化视频显示设备,设定视频的分辨率(D1格式,720×480)以及每个像素的位数(16位)[8]。视频显示线程完成其初始化程序后,再通过运用Rendezvous对象同步其他线程,等其他线程均已完成初始化程序以后,视频显示线程便可以进入其主循环。
(2) 控制线程
控制线程主要负责完成OSD显示模块的绘制和更新。除了初始化OSD设备和在OSD上创建并绘制静态文本之外,控制线程还负责从其他的线程中得到图像的性能参数(例如,比特率、帧率等),并把它们显示在OSD上,这些数据每秒会被更新一次。DM6446的ARM核和DSP核的负载率也会被显示在OSD上,图1为控制线程程序流程图。
2.5 网络传输模块
网络传输模块调用网络传输线程void*Internet Thread(void*arg),网络传输线程接收从视频编码线程中传过来经H.264编码后的视频帧Buffer,对其解析后,应用RTP协议把视频帧发送到以太网上[9]。
Socket编程技术被用来进行网络通信程序设计,Socket能够完成不同主机进程之间的通信。
Socket通信分为面向无连接的通信以及面向连接的通信两种,两者均需要通过相应Socket對象的创建来实现,不过,两者也有区别,面向连接的TCP通信方式需要双方建立可信的数据连接后才能通信,而面向无连接的UDP通信方式则只要将数据发送到目的主机即可。系统采用的是面向无连接的UDP通信方式。首先,调用函数Rtp_Init()完成Socket通信的会话初始化。此步主要目的是创建Socket,并完成服务器的连接,主要包括服务器的IP地址、应用程序目的端口及网络通信协议簇的设置。其次,在等待其他线程完成初始化后进入网络传输线程主循环,从视频编码线程得到一个H.264编码后的视频图像Buffer,并调用Rtp_H246_Send()函数进行发送,最后将此Buffer返回到视频编码线程。具体的网络传输线程程序流程如图2所示。
在视频传输线程中Rtp_H246_Send()函数的实现是程序的关键部分,此函数主要完成对H.264数据流结构的解析,提取出NALU,并根据NALU的大小对其进行RTP协议打包并发送。通过检测NALU的起始码0x000001来提取出一个完整的NALU。根据NALU的大小来判断是否对其进行分包发送,最后加上NALU单元头和RTP协议的包头信息就可以发送了。在程序中要根据实际情况分别对NALU单元头和RTP协议包头进行赋值填充。
2.6 线程间的交互
视频采集线程从视频处理子系统前端设备得到原始的视频Buffer,使用FifoUtil_put()函数把采集到的原始图像Buffer发送到视频显示线程,以便在视频编码之前能显示在本地屏幕上。之后视频采集线程能够在视频编码线程处得到一个原始的空白Buffer,采集到的原始视频Buffer可以复制到这个从编码线程得到的Buffer中,用来进行视频的编码。视频编码线程接收到视频采集线程捕获的原始视频Buffer,并使用函数FifoUtil_get()从视频网络传输线程取得一个Buffer,经过编码后的视频数据将会被放到这个Buffer中。当运行在DSP核的视频编码器完成视频编码后,这个Buffer将会通过函数FifoUtil_put()被发送到网络传输线程。最后网络传输线程完成对H.264编码数据的RTP网络传输。
當视频显示线程复制原始视频Buffer到前端视频显示设备后,视频编码线程开始对原始视频Buffer进行编码,编码过程调用函数VIDENC_process(),在DSP端进行。当运行在DSP核的H.264视频编码器完成对采集图像帧的编码后,编码后的Buffer将通过FifoUtil_put()函数传送到网络传输线程,原始的视频Buffer将被返回到采集线程用于采集新一帧图像。
网络传输线程从编码线程得到编码后的视频Buffer后,将会通过RTP协议发送,完成后会把此Buffer返回到视频编码线程。
3 系统测试
当系统程序设计完成以后,对其编译、链接,最终生成一个可执行文件video_surveillance。把此文件拷贝到DM6446的根文件系统的文件目录\home\dm6446\video_surveillance下。此文件夹下共包含如下文件:
Data/:此文件夹下存放用于OSD功能的字库信息。
cmemk.ko,dsplinkk.ko,loadmodules.sh,unloadmodules.sh:这四个文件用于分配或释放ARM核和DSP核的共享内存池。
encodeCombo.x64P:此文件为运行在DSP端的可执行程序,里边包含用到的H.264编解码算法。
video_surveillance:此文件为ARM端运行的应用程序。运行此程序时可设置分辨率、码率等参数。默认分辨率为720×480。
启动系统后,进入/home/dm6446/video_surveillance/目录下,依次运行如下命令启动视频的网络传输系统程序:
#cd/home/dm6446/video_surveillance
#./loadmodules.sh
#./video_surveillance?vrtp.264
程序启动后,在客户端就可以通过播放器来查看监控视频画面了。本文设计的视频传输系统客户端在Windows XP系统,采用开源播放器VLC 2.0来接收H.264视频码流的RTP包。经测试当系统视频分辨率为720×480,帧率为25 f/s,比特率/码率为1 Mb/s时,视频播放十分流畅,也没有出现马赛克或者丢包等现象。播放器播放的农场监控视频现场画面如图3,图4所示。
4 系统运行结果分析
系统运行OSD参数显示如表1所示,其中包括视频分辨率、视频编码算法、ARM和DSP负载率、视频帧率、视频比特率等参数。在系统运行时,分别设置不同视频分辨率以完成对DSP核以及ARM核负载率的测试,测试结果如表2所示。从表2中结果能够得出,随着视频分辨率以及视频图像处理数据量的增大,ARM和CPU的负载率会随之增高,但离100%还有一定差距,也就是说即使分辨率达到最大,即720×480时,DM6446 CPU处理速度也完全满足系统要求。
5 结 论
本文完成了一个基于DaVinci平台的嵌入式农场智能监控系统的设计,该监控系统由视频采集、视频编码、视频显示以及视频网络传输四个模块组成。通过摄像头完成视频采集模块对农场视频信号的采集,并且运用PAL制式将信号输入到TVP5158视频解码芯片中,该解码芯片可以将信号转换为YUV格式的数字信号,最后送入DM6446处理器进行处理。
其中,采用H.264编码技术完成视频编码模块的设计,实现视频的高效压缩,为视频网络传输做好准备。视频显示模块将摄像头采集的视频实时地显示在本地的液晶屏上,同时,应用OSD技术显示ARM核和DSP核的负载率、视频编码过程中的动态参数(如分辨率、比特率、帧率等)等动态信息。
网络传输模块通过对H.264编码后的视频数据流进行分析,提取出网络抽象层单元(H.264的NALU),采用RTP协议对压缩后的视频数据进行打包,然后发送到以太网上。在本地计算机上应用网络播放器VLC 2.0将可以播放摄像头采集的实时视频。最后,通过对系统测试分析,证明此系统稳定可靠,完全满足农场智能视频网络传输的需求。
参考文献
[1] 黄凯奇,陈晓棠,康运锋,等.智能视频监控技术综述[J].计算机学报,2015,20(6):1093?1118.
[2] 屈召贵.嵌入式多源高清视频监控系统设计与实现[J].现代电子技术,2016,39(3):68?71.
[3] 张雅楠,杨璐,郑丽敏.基于Android手机的远程视频监控系统的设计与开发[J].计算机应用,2013,33(z1):283?286.
[4] 辛长春,娄小平,吕乃光.基于FFmpeg的远程视频监控系统编解码[J].电子技术,2013(1):3?5.
[5] 董向华,杨勇.基于网络的视频监控系统的设计与实现[J].通信技术,2013(2):64?66.
[6] 曾欣慧.面向Android客户端的无线视频监控系统设计[J].现代电子技术,2016,39(12):6?9.
[7] 陈飞玲,陈湘军,郁建桥,等.移动视频监控系统设计[J].电子测量技术,2014,37(4):103?107.
[8] 任克强,曹宏强.基于Android和H.264的实时视频监控系统[J].计算机测量与控制,2013,21(9):2448?2450.
[9] 张广,侯立刚,曹江涛.基于ARM9的网络视频监控系统设计与实现[J].电子设计工程,2013,21(12):161?163.
[10] 宁跃飞,李艳萍.视频监控设备网络管理研究与实现[J].现代电子技术,2016,39(15):70?73.