基于嵌入式Linux视频监控系统.docx
- 文档编号:8543693
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:13
- 大小:99.45KB
基于嵌入式Linux视频监控系统.docx
《基于嵌入式Linux视频监控系统.docx》由会员分享,可在线阅读,更多相关《基于嵌入式Linux视频监控系统.docx(13页珍藏版)》请在冰豆网上搜索。
基于嵌入式Linux视频监控系统
目录
一、引言1
二、嵌入式视频监控系统简介2
三、系统总体设计方案4
四、系统硬件选型及设计5
4.1硬件开发平台5
4.2bootloader概述及移植6
五、系统环境搭建7
5.1交叉编译环境的搭建7
5.2NFS环境的搭建8
六、流媒体服务器设计9
6.1视频采集模块设计9
6.2视频压缩模块设计10
6.3视频传输模块设计11
6.4视频解码与回放13
七、嵌入式服务器13
7.1Thttpd服务器的实现14
八、展望与小结16
一、引言
随着计算机技术及网络技术的迅猛发展,公安、安防行业及生活中的发展趋势必然是全面数字化、网络化。
传统的模拟闭路电视监控系统有很多局限性:
传输距离有限、无法联网,而且模拟视频信号数据的存储会耗费大量的存储介质(如录像带),查询取证时十分烦琐。
基于个人计算机的视频监控系统终端功能较强,但稳定性不好,视频前端(如电压耦合元件等视频信号的采集、压缩、通讯)较为复杂,可靠性不高。
基于嵌入式Linux视频的网络监控系统不需要用于处理模拟视频信号的个人计算机,而是把视频服务器内置一个嵌入式Web服务器,采用嵌入式实时多任务操作系统。
由于把视频压缩和Web功能集中到一个体积很小的设备内,可以直接连入局域网,即插即看,省掉复杂的电缆,安装方便(仅需设置一个IP地址),用户也无需安装任何硬件设备,仅用浏览器即可观看。
基于嵌入式Linux的视频网络监控系统将嵌入式Linux系统连接上Web,即视频服务器内置一个嵌入式Web服务器,摄像头传送来的视频信号数字化后由高效压缩芯片压缩,通过内部总线传送到内置的Web服务器上,实现视频的监控。
二、嵌入式视频监控系统简介
视频监控系统是安全防范系统的组成部分,它是一种防范能力较强的综合系统。
视频监控以其直观、方便、信息内容丰富而广泛应用于许多场合。
近年来,随着计算机、网络以及图像处理、传输技术的飞速发展,涌现出大量的嵌入式视频监控系统。
1.嵌入式系统的优缺点
a、系统为专用系统,所以系统小,指令精简,处理速度快
b、系统数据置于ROM/FLASHMEMORY,调用速度快,不会被改变,稳定性好
c、系统处理实时性好,性能稳定
d、文件管理系统更适合于大量的视频数据
e、该类系统目前四路以上机型还较为少见
f、在网络功能、音视频同步等方面也难令人满意。
2.数字网络视频监控系统的原理
数字网络视频监控系统的关键设备是网络视频信号采集终端(也被称为视频服务器),网络视频信号采集终端采用嵌入式实时多任务操作系统。
摄像头送来的视频信号在网络视频信号采集终端数字化后由高效压缩芯片压缩,通过内部总线送到网络接口发送到网络上,网络上用户可以直接用在PC机上用浏览器观看网络视频信号采集终端传送过来的摄像机所拍摄的图像,授权用户还可以通过计算机网络透过网络视频信号采集终端控制摄像机镜头和云台的动作或对系统进行配置操作。
由于把视频压缩和网络功能集中到一个体积很小的设备内,可以直接连入局域网,达到即插即用,省掉多种复杂的电缆,安装方便(仅需设置一个坤地址),用户也无需安装任何硬件设备,仅通过PC机用浏览器即可观看。
3.数字网络视频监控系统与其它监控系统的比较
a、布控区域广阔
.数字网络视频监控系统的网络视频信号采集终端直接连入网络,没有线缆长度和信号衰减的限制,同时网络是没有距离概念的,彻底抛弃了地域的概念,扩展布控区域。
b、系统具有几乎无限的无缝扩展能力
所有设备都以IP地址进行标识,增加设备只是意味着口地址的扩充。
c、可组成非常复杂的监控网络
采用基于网络视频信号采集终端为核心的监控系统,在组网方式上与传统的模拟监控和基于PC平台的监控方式有极大的不同,由于视频信号采集终端输出已完成模拟到数字的转换并压缩,采用统一的协议在网络上传输,支持跨网关、跨路由器的远程视频传输。
d、性能稳定可靠,无需专人管理
视频信号采集终端实际上基于嵌入式电脑技术,采用嵌入式实时多任务操作系统,又由于视频压缩和网络功能集中到一个体积很小的设备内,直接连入局域网或广域网,即插即看,系统的实时性、稳定性、可靠性大大提高,也无需专人管理,非常适合于无人值守的环境。
e、当监控中心需要同时观看较多的摄像机图像时,对网络带宽就会有一定的要求。
三、系统总体设计方案
嵌入式Linux视频网络监控系统是电工电子装置、计算机软硬件以及网络、通信等多方面的有机组合体,它以智能化、网络化、交互性为特征,结构比较复杂。
如果利用OSI七层模型的内容和形式,把相应的数据采集控制模块硬件和应用软件以及应用环境等有机组合,可以形成一个统一的系统总体框架,其系统总体框架示意图如图1所示。
系统总体框架示意图
摄像头传送来的视频信号数字化后,经过压缩,通过RS-232/RS485将数据送到内置的Web服务器,嵌入式Linux系统的10/100M以太网口实现接入Internet网络,将现场信号送到客户端。
整个系统的核心是嵌入式Linux系统。
监控系统启动后,嵌入式Linux系统启动WebServer服务程序,接收授权客户端浏览器的请求,WebServer将根据通信协议完成相应的监测。
四、系统硬件选型及设计
4.1硬件开发平台
本系统选用飞凌公司设计生产的嵌入式开发板OK6410,该平台基于三星公司的ARM处理器S3C6410。
S3C6410是由三星公司推出的一款低功耗、高性价比的RSIC处理器,它基于ARM11内核(ARM1176JZF-S),可广泛应用于移动电话和通用处理等领域;S3C6410为2.5G和3G通信服务提供了优化的硬件性能,内置强大的硬件加速器:
包括运动视频处理、音频处理、2D加速、显示处理和缩放等;集成了一个MFC(Multi-FormatvideoCodec)支持MPEG4/H.263/H.264编解码和VC1的解码,能够提供实时的视频会议以及NRSC和PAL制式的TV输出;除此之外,该处理器内置一个采用最先进技术的3D加速器,支持OpenGLES1.1/2.0和D3DMAPI,能实现4Mtriangles/s的3D加速;同时,S3C6410包含了优化的外部存储器接口,该接口能满足在高端通信服务中的数据带宽要求。
由于以上突出的性能表现,著名的苹果公司手机IPHONE就是基于S3C6410处理器。
OK6410开发板基于三星公司最新的ARM11处理器S3C6410,拥有强大的内部资源和视频处理能力,可稳定运行在667MHz主频以上,支持MobileDDR和多种NANDFlash。
OK6410开发板上集成了多种高端接口,如复合视频信号、摄像头、USB、SD卡、液晶屏、以太网,并配备温度传感器和红外接收头等。
这些接口可作为应用参考帮助用户实现高端产品级设计。
OK6410的软件系统目前支持WinCE6.0、LINUX2.6.28、Android2.1以及uC/OS-II,提供标准板级支持包(BSP)并开放源码,其中包含了所有接口的驱动程序,客户可以直接加载使用。
另外,该板可连接飞凌公司与之相配套使用的串口扩展板、WIFI模块、摄像头模块等。
本系统采用LINUX2.6.28内核的Linux系统和飞凌公司的CMOS摄像头实现了硬件平台的搭建。
系统硬件结构如图1所示
图1系统硬件结构图
4.2bootloader概述及移植
BootLoader是在操作系统内核或用户应用程序运行之前运行的一段小程序。
它对开发板上的主要部件如CPU,RAM,FLASH,串口等基本硬件进行初始化,建立内存空间的映射图(包括设置系统堆栈和系统启动参数区等),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
然后跳转到操作系统内核的入口,将系统控制权交给操作系统,之后系统的运行和BootLoade再无任何关系。
目前比较流行并且支持Linux操作系统的几种BootLoader有:
GRUB、LILO、U-boot、vivi等。
本系统采用的BootLoader为:
U-Boot,U-Boot是德国DENX小组开发的用于多种嵌入式CPU的BootLoader程序,应用最为广泛。
因为要在开发板上运行,所以要对U-Boot进行交叉编译。
U-Boot的工作过程分两个阶段,第一阶段的主要任务有:
本地硬件设备初始化(屏蔽所有中断、关闭处理器内部指令/数据cache等),为第二阶段准备RAM空间,复制第二阶段代码到RAM,设置堆栈跳转到第二阶段程序入口点。
第二阶段的主要任务有:
初始化本阶段所使用的硬件设备,检测系统内存映射,将内核映像和根文件系统映像从Flash上读入RAM中,为内核设置启动参数,调用内核。
U-Boot的移植操作,实际上就是根据嵌入式系统硬件资源,对相关的文件进行修改,包括两个方面的移植:
第一层面是针对CPU的移植,第二层面是针对BOARD的移植,同时需要移植相关的头文件。
按照开发板说明对相关文件进行修改、编译,然后烧写到开发板的Flash中。
这样就完成了U-Boot的移植。
五、系统环境搭建
软件平台采用的嵌入式操作系统为Linux2.6.28,Linux具有内核小、效率高、源码开放、内核直接提供网络支持等优点,但嵌入式系统的硬件资源有限,因此需根据实际需求对内核进行裁剪,配置所需的功能模块,然后再移植到硬件平台上。
嵌入式系统的软件开发采用交叉编译调试的方式,在宿主机上安装Linux系统,建立交叉编译环境,在宿主机编写程序代码,再利用交叉编译工具生成目标机上可用的可执行文件,最后向目标机平台移植。
5.1交叉编译环境的搭建
交叉编译就是在一个平台上生成另一个平台上的可执行代码。
在进行嵌入式开发时,由于ARM平台的系统资源有限,不可能在ARM平台上进行本机编译,因此我们可以在PC机上编译出针对ARM平台的可移植程序,然后下载到开发板上执行。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具然后用这个交叉编译工具编译程序的源码,最终生成可以在开发板上执行的代码。
目标板的系统是Linux,我们要进行Linux下的程序开发,首先要安装Linux系统。
我们选用Ubuntu10.10作为主机开发环境。
在虚拟机里安装好Ubuntu,由于嵌入式交叉编译时经常需要用到root用户权限,为避免日后频繁要求输入密码,我们可以通过编辑/etc/gdm/目录下的custom.conf文件把Ubuntu设置为root用户自动登录。
在custom.conf中添加以下内容即可。
[daemon]
TimedLoginEnable=true
AutomaticLoginEnable=true
TimedLogin=root
AutomaticLogin=root
TimedLoginDelay=30
设置Ubuntu的IP地址为固定IP,方便以后程序的调试。
交叉编译器我们选用飞凌公司提供的cross-4.2.2,首先将cross-4.2.2-eabi.tar.bz2文件拷贝到Ubuntu中,输入以下命令安装:
mkdir/usr/local/arm
tarjxvfcross-4.2.2-eabi.tar.bz2–C/usr/local/arm(将文件解压到/usr/locsl/arm目录下)
安装好后可用/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc–v命令查看版本信息,若编译器安装成功则会显示出交叉编译器的版本信息,否则需要重新安装。
为了方便日后调试程序我们可以把安装目录加入环境变量中,编辑/etc下的profile文件,加入:
exportPATH=”$PATH:
/usr/local/arm/4.2.2-eabi/usr/bin”
修改完后重启系统,然后在终端输入arm-linux-gcc若提示noinputfile则交叉编译环境搭建成功。
5.2NFS环境的搭建
在嵌入式开发过程中,交叉编译好的程序要在开发板上运行,就要烧写到目标板的flash上,对于应用程序,我们需要频繁调试,这样每次都要烧写一遍,严重影响开发效率。
为了方便程序调试,我们搭建了NFS系统。
NFS是NetworkFileSystem的简称,是分布式计算机系统的一个组成部分,用它可实现在已购网络上共享和装配远程文件系统。
可以通过网络让不同操作系统的计算机可以共享数据。
可以通过它把远程主机的目录挂载到本机,使得访问远程主机的目录就像访问本地目录一样方便快捷。
Ubuntu上默认没有安装NFS服务器,首先要安装NFS服务程序,在终端输入:
sudoapt-getinstallnfs-kernel-server这样系统会自动帮我们安装好NFS服务器,这样宿主机就相当于NFSServer。
NFS是一个RPC服务程序,所以在使用它之前,先要映射好端口——通过portmap设定,在启动NFS之前,需要启动portmap服务。
修改/etc/exports,添加一个共享目录:
/var/nfs/*(rw,sync),其中/var/nfs/是要共享的文件夹,*是表示所有用户都可以挂载这个共享文件夹,(rw,sync)表示以读写方式挂载,并且使资料同步写入存储器中。
使用命令sudoexportfs-r更新,使用命令/etc/init.d/portmapstart和/etc/init.d/nfs-kernel-serverrestart重新启动portmap服务和nfs-kernel-server服务。
在开发板上输入命令:
mount-tnfs192.168.1.242:
/var/nfs/mnt-onolock将远程主机/var/nfs目录挂在到本地的/mnt目录下。
-t选项指定文件系统的类型为NFS,-o选项禁用锁定。
六、流媒体服务器设计
6.1视频采集模块设计
视频采集模块通过嵌入式Linux操作系统调用Video4Linux(V4L)和底层设备驱动程序来完成视频捕获。
V4L是Linux中关于视频设备的内核驱动,它为Linux下的各种视频设备提供了统一的编程接口,应用程序通过这些接口函数就可以操纵各种不同的设备。
视频采集流程如图2所示。
图2视频采集流程
(1)打开视频设备。
Linux下的视频设备文件一般为“/dev/video0”,通过调用函数v4l_open(),利用vd->fd=open(“/dev/video0”,O_RDWR)打开设备并获得设备文件描述符vd->fd。
(2)获取设备和图像信息。
通过v4l_get_capability()函数获取设备信息,通过v4l_get_picture()函数获取图像信息。
(3)内存映射。
获取图像的方式有两种:
read()直接读取和mmap()内存映射。
直接读取方式通过内核缓冲区来读取图像数据,而本文使用内存映射方式mmap(),内存映射方式可以直接把设备文件映射到内存中,进程可以像访问普通内存一样对文件进行访问,读取效率更高。
初始化内存映射时,需在内存中开辟一块空间,利用ioctl(vd->fd,VIDIOCGMBUF,&(vd->mbuf))操作取得需要映射的内存空间大小vd->mbuf.size,利用mmap()函数,即vd->map=(unsignedchar*)mmap(0,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,0)操作,把设备文件的内容映射到内存,vd->map指针所指向的内存区即为采集的图像数据,且此内存区具有可读写和共享属性。
(4)初始化采集参数。
设置采集视频图像的宽度、高度、格式等信息。
(5)采集视频数据。
利用ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->mmap))操作采集一帧图像并存放到内存映射区,采集一帧图像后要进行同步操作,利用ioctl(vd->fd,VIDIOCSYNC,&(vd->frame_current))操作判断该帧图像是否获取完毕。
对于获取到的视频图像,通过视频压缩模块压缩成MPEG-4视频流,再通过视频传输模块把数据发送到以太网进行传输。
6.2视频压缩模块设计
从摄像头直接采集过来的图像由于数据量较大,不利于进行网络传输,因此需先对其进行压缩编码。
MPEG-4是目前网络多媒体传输的主要格式,具有高效的压缩率,它利用很窄的带宽,通过帧重建技术来压缩图像数据,以求利用最少的数据获得最佳的图像质量,可满足实时视频传输的要求。
本文用软件方式进行视频编码,选择开源高效的Xvid视频编码器对采集的视频图像数据进行MPEG-4压缩编码。
Xvid视频编码器选用0.9.2版本,因为该版本已经实现了MPEG-4的SimpleProfile(SP)特性,而1.0以后的版本增加了很多AdvancedSP(ASP)特性及其他功能,ASP特性的加入会增加运算复杂度,降低编码速度,由于嵌入式系统的处理能力有限,一般只使用Xvid的SP特性,因此实验选用Xvid0.9.2编码器,交叉编译并移植到嵌入式系统内。
在宿主机Linux操作系统中对Xvid0.9.2进行交叉编译的步骤如下:
(1)解压缩Xvid源码:
tar–xzvfxvidcore-0.9.2.tar.gz
(2)进入build/generic目录,创建编译配置文件。
由于Xvid没有针对ARM的汇编优化,因此编译时需将汇编关闭;还需指定程序所运行的平台为arm-linux。
执行命令:
./configure--disable-assembly--host=arm-linux
(3)编译:
make;makeinstall。
(4)交叉编译完成后会生成静态库libxvidcore.a和动态库libxvidcore.so.*,用户程序可利用库文件所提供的编程接口调用Xvid里面的函数。
摄像头采集的视频帧为YUV420格式,通过Xvid编码器的encoder_encode函数实现视频压缩,该函数定义如下:
intencoder_encode(Encoder*pEnc,XVID_ENC_FRAME*pFrame,XVID_ENC_STATS*pResult);其中,pEnc为编码器实例的句柄;pFrame是XVID_ENC_FRAME类型的结构体变量,负责传递参数信息给编码器,这些信息包含色彩空间、编码质量、输入输出数据缓冲区指针等;pResult是XVID_ENC_STATS类型的结构体变量,可以返回编码操作执行的状态信息。
6.3视频传输模块设计
视频传输模块负责把压缩后的视频流传输到以太网,对实时性要求较高,本文使用实时传输协议(Real-timeTransportProtocol,RTP),它可以在一对一或者一对多的网络环境中实现流媒体数据的实时传输。
JRTPLIB[7]是一个利用C++语言实现的开源RTP库,它完全遵循RFC1889设计,使用SOCKET机制实现网络通讯,可运行于包括Linux和Windows在内的多种不同操作系统上。
本文使用JRTPLIB进行实时流媒体编程,发送端操作系统为Linux,接收端为Windows。
在Linux平台上用JRTPLIB进行实时多媒体编程前,需先对JRTPLIB进行交叉编译。
(1)JRTPLIB初始化通过调用RTPSessionParams类的SetOwnTimestampUnit()方法设置一个恰当的时间戳,调用SetMaximumPacketSize()方法设置允许传输的最大RTP包字节数(默认为1400字节);通过调用RTPUDPv4TransmissionParams类的SetPortbase()方法设置发送端数据传输所用的端口号(需为偶数)。
初始化完这两个变量后,通过RTPSession类的Create()方法创建一个RTP会话。
(2)JRTPLIB数据传输RTP会话创建完成后,还需指定数据发送的目标地址,RTP协议允许一个会话包含多个目标地址,增加或删除目标地址可通过RTPSession类的AddDestination()、DeleteDestination()、ClearDestinations()方法来实现。
目标地址指定之后,通过RTPSession类的SendPacket()方法即可向指定的目标地址发送流媒体数据。
SendPacket()是一个重载函数,具有多种形式,本文使用的形式为:
intSendPacket(constvoid*data,size_tlen,uint8_tpt,boolmark,uint32_ttimestampinc);
当一帧数据所占字节数大于允许传输的最大RTP包字节数MaxPacketSize时,需对一帧数据进行分割传输,使每次发送的字节数不大于MaxPacketSize,可使用SendPacket()的mark参数来标识传输的RTP包是否属于同一帧数据,若一帧数据需分成N次发送,则前N-1次发送的RTP包的mark标志设为0,第N次发送的RTP包的mark标志设为1,即以mark=1来判断分割传输的数据是否发送完成。
实现过程如下:
do{
if(length>MaxPacketSize){
mark=0;
发送长度为MaxPacketSize的RTP包;
length=length-MaxPacketSize;
}
else{
mark=1;
发送长度为length的RTP包;
break;//一帧数据发送完成
}
}while
(1);
(3)JRTPLIB数据接收
接收数据时,以BeginDataAccess()函数开始,以EndDataAccess()函数结束。
为了能正确接收同一数据源的数据报,必须先对数据源表(sourcetable)加锁,BeginDataAccess()函数可实现这一加锁操作,确保在使用数据源表的同时轮询(poll)线程不能访问它,此时可进行数据接收操作,当正确接收一个数据报后,调用EndDataAccess()函数即可实现对数据源表的解锁。
图3RTP发送与接收流程图
RTP发送与接收流程图如图3所示。
对于分割传输的RTP包,根据RTP包的mark标志来判断一帧数据是否接收完成,若mark=0,则表示此RTP包为分割传输的数据包,需循环接收直到mark=1为止,然后把这些RTP包重新组合成完整的一帧数据。
6.4视频解码与回放
接收到的视频流数据经过Xvid解码器的decoder_decode函数进行解码,该函数定义如下:
intdecoder_decode(DECODER*dec,XVID_DEC_FRAME*frame);
其中,dec为解码器实例的句柄,frame为XVID_DEC_FRAME结构体变量,包含解码前后图像数据的缓冲区指针、码流长度等信息。
解码后的图像可在客户端软件上显示出来。
七、嵌入式服务器
Linux环境下的嵌入式主流Web服务器,包括Apache、httpd、thttpd和Boa等几种。
httpd是最简单的一种Web服务器,它的功能最弱,不支持认证,不支持CGI。
如果Web服务器仅需提供一些静态页面,例如简单的在线帮助、系统介绍等,完全可以用静态服务器httpd来实现。
thttpd和Boa都支持认证、CG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 嵌入式 Linux 视频 监控 系统