基于arm嵌入式的远程视频监控系统

基于arm嵌入式的远程视频监控系统

ID:14993427

大小:1.57 MB

页数:32页

时间:2018-07-31

上传者:U-10243
基于arm嵌入式的远程视频监控系统_第1页
基于arm嵌入式的远程视频监控系统_第2页
基于arm嵌入式的远程视频监控系统_第3页
基于arm嵌入式的远程视频监控系统_第4页
基于arm嵌入式的远程视频监控系统_第5页
资源描述:

《基于arm嵌入式的远程视频监控系统》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

《嵌入式系统》课程设计题目基于ARM嵌入式远程视频监控系统姓名李小宝专业物联网工程学号201360026院(系)信息工程学院指导教师何建仓完成时间2016年12月16日 目录摘要1前言21系统设计31.1视频监控系统的发展31.2课题背景41.3论文主要内容和结构安排52硬件设计62.1视屏监控系统的结构设计62.2ARM处理器简介62.3S3C6410体系结构73软件设计93.1Linux操作系统简介93.2交叉编译环境的建立93.3嵌入式Linux移植103.4Linux平台下mjpg-streamer移植123.5交叉编译mjpeg-stream134跟踪测试144.1V4L2144.2应用程序通过V4L2进行视频采集的原理154.2.1视频采集的参数初始化154.2.2申请并设置视频采集的帧缓冲区184.3用V4L2采集视频的程序流程和相关API195设计总结22 5.1TCP/IP协议简介225.2socket网络编程235.3图像传输的软件实现24结论27参考文献28致谢29 摘要本文分析了一种基于ARM嵌入式技术的网络视频监控系统。系统以嵌入式Linux和嵌入式微处理器S3C6410为核心平台,通过嵌入式平台建立的基于TCP/IP协议的视频服务器,将usb摄像头采集来的图像数据压缩后,经过网络传输,完成对监控现场的网络视频监控任务。论文首先阐述了嵌入式网络视频的监控系统的发展状况,以及整体构建,然后介绍了嵌入式Linux操作系统以及ARM处理器的发展情况,分析了主要外围电路的设计,以及如何在ARM硬件平台上进行嵌入式Linux内核的编译与移植,介绍了Bootloader的启动原理及运行过程,并对在Linux操作系统下的USB驱动程序进行了研究。本文重点讨论了图像采集、编码和网络通信程序的设计原理与实现。最后以提供的例子进行了系统整体测试,并提出了进一步开发设想。本文的研究结果具有较大的工程实际意义,并对基于IP技术的各种视屏通信应用具有一定的参考价值。关键词:ARMS3C6410嵌入式Linux视频监控28 前言当今社会是一个高速发展的社会,信息获取的方便快捷可以使我们领先一步并创造出巨大的利益,而我们或许信息的一个重要途径就是眼睛。在人的感官中有80%是来自是觉。图像时客观事物的形象、生动的描绘,是直观而具体的信息表达方式,是人类重要的信息载体。随着科学技术的快速发展和人民物质生活水平的提高,视频监控系统以其直观、方便和信息内容丰富的特点,日益受到人们的青睐,并在各行各业得到了广泛的应用。生活中有电梯监控,门禁,车库监控等等。电讯行业有基站监控,银行系统又柜员机监控,林业部门有火情监控,交通方面有违章监控和流量监控等。28 1系统设计1.1视频监控系统的发展自从摄像机和电视出现后,最初的模拟监控系统出现了。经过较长时间的发展和应用,已经非常成熟,性能也十分稳定,但由于系统中模拟图像信息为主,对图像的处理和传送都才采用模拟技术,不紧图像质量差,而且系统资源浪费严重,不易组成复杂的网络结构,主要是一种单功能、单向、集总方式的信息采集网络,监控功能可扩展性差。因此系统尽管已发展到很高的水平,已无潜力可以发掘,局限性大。随着计算机应用的普及,网络通信技术及图像压缩技术的快速发展,在视屏监控领域中,数字化和网络化成为一种趋势。上世纪末,基于pc的数字化网络视频监控技术迅速发展,部分取代了视频矩阵图像分割器、录像机为核心,辅助以其他设备的模拟视频监控系统。数字化的的视频通信在图像质量、传送距离、抗干扰能力等方面都要优越于传统的模拟通信系统,并且图像处理更加方便。因此,数字化网络视频监控系统将不然取代传统的模拟监控系统。但随着基于PC的视频监控系统的发展,在实际工程应用中也暴露出一些不足之处,主要是系统工作的实时性不高、稳定性差,而且成本较高;PC需要专门人管理,操作较为繁琐;兼容性差,采用的视频压缩对数据进行处理,因此系统一般只支持一种编码格式,无法提供其他编码方式的支持。28 进入21实际,嵌入式技术、多媒体图像处理技术的进一步发展,为嵌入式网络视频监控系统的繁重提供了技术条件。嵌入式系统是以应用为中心,软硬件可以裁减的,具有高可靠性,低成本、严要求、综合性强的专用计算机系统,它主要有嵌入式微处理器、相关支撑硬件、嵌入式操作系统及应用软件系统等组成,集软硬件于一体,能够独立工作。嵌入式系统具有实时性好、稳定性高等特点,在网络视频监控中的刀快速发展。嵌入式网络视屏监控与其他监控系统又的比较有如下特点;(1)布控区域广阔。嵌入式视频监控也可以直接接入网络,没有线缆产度和信号衰减的闲置,同时网络是没有距离概念的,彻底抛弃了地域的限制,扩展了布控区域。(2)系统具有无限的无缝扩展能力。所有设备都可以用IP地址进行标示,增加设备只是意味着IP地址的扩充。(3)可组成非常复杂的监控网络。采用局域嵌入式视频监控设备为核心的监控系统,在组网方式上与传统的模拟监控和基于PC平台的监控方式有极大不同,犹豫嵌入式视频监控设备的输出以往车了模拟到数字的转换并压缩,采用同意的协议在网络上传输[5]。(4)性能更稳定,无需专人管理。嵌入式视频监控设备实际上基于嵌入式计算机技术,采用嵌入式多任务操作系统,又由于视频采集和数据处理功能都集中到一个体积很小的设备内,直接连入局域网或广域网,即插即看,系统的实时性、稳定性、可靠性大大提高,也无需专人管理,非常适合于无人值守的环境。因此加强对嵌入式网络视频监控系统的研究,对我国监控行业今后的发展有着重要的意义。1.2课题背景28 课题来源于电梯网络视屏监控系统,电梯网络视频监控系统由位于控制柜中的服务器、客户端组成,实现一个具有视频采集压缩及传输功能的可以直接接入以太网的网络摄像机基本过程是:电梯发生故障时,由并通过以太网传送给客户端,维护人员可以通过监控客户端来实现电梯内的监控。1.3论文主要内容和结构安排针对监控系统中的关键技术进行分析,本文将重要研究一下内容(1)嵌入式操作系统的实现在ARM微处理器上运行嵌入式操作系统,可以为上层软件的开发提供统一的接口,方便系统功能的进一步扩展升级。(2)图像信号的采集与压缩通过伸向头采集视频数据后,再进行视频图像压缩。选用合适的视频图像压缩方式对远程监控的效果有很大的影响。MJPEG容易实现,成本较低。(1)视频数据的网络传输嵌入式Linux系统具有完整的TCP'/IP协议,因此,可以采用socket编程建立一个基于TCP/IP的嵌入式视频服务器。全文结构安排如下:第一章:综合论述了视频监控系统的现状和发展情况。第二章:提出了本系统的整体结构,介绍了S3C6410的体系结构。第三章:研究嵌入式Linux在ARM上的裁减和移植。第四章:简单介绍了基于V4L的视频采集程序以及图像压缩理论第五章:视屏传输的实现。介绍了建立连接的相关内容并对本系统连接测试。28 第六章:对本文的工作进行总结,并提出展望。2硬件设计2.1视屏监控系统的结构设计基于嵌入式技术的监控系统前端采用摄像头采集视频流,然后通过网络传输到接受者。整体结构如图2.1.1所示。图2.1.1嵌入式视频结构框图该系统采用基于ARM11的S3C6410X微处理器,通过在处理器上运行Linux操作系统,构建嵌入式服务器,接受来自摄像头的视频流,再进行压缩编码,再传送实现监控。2.2ARM处理器简介ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对微处理器的通称,还可以认为是一种技术的名字。ARM处理器是一个32位元精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。ARM处理器具有以下特点:1、体积小、低功耗、低成本、高性能;28 2、支持Thumb(16位)/ARM(32位)双指令集,兼容性好。 3、大量使用寄存器,指令执行速度更快;  4、大多数数据操作都在寄存器中完成;  5、寻址方式灵活简单,执行效率高;  2.3S3C6410体系结构S3C64xx系列的应用处理器芯片是三星主推的,三星目前推出了S3C6400和S3C6410,都是基于ARM11架构的,而且硬件管脚兼容,应该说大致的功能基本相同,比较明显的区别就是S3C6410带有2D/3D硬件加速。S3C6410是一个强大的应用处理器,该芯片架构如图2.3.1:28 图2.3.1S3C6410内部体系结构28 3软件设计3.1Linux操作系统简介Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者LinusTorvalds。Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux2.4版内核已经能够完全支持Intel64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。ARM技术和Linux成功的结合充分满足了各类应用对嵌入式平台高性能、低功耗和低价格的要求,通过开发环境、开源社区和ARM的商业伙伴的有时为嵌入式开发停工了灵活的选择。3.2交叉编译环境的建立28 通常嵌入式系统的软件编译和执行是两个不同平台上进行的。编译时在宿主机上进行的,执行是在目标机,及嵌入式系统的硬件平台。一般是在宿主机通过跨平台交叉编译器把源文件编译成目标平台可执行的文件在通过串口、并口或者网络下载至目标凭条的FLASH或者其他存储介质,然后由目标机来运行这些软件。本系统采用基于ARM11的S3C6410,可以使用常用的ARM交叉编译器,要成功构建完整的交叉编译环境,余姚在宿主机上创建一系列的工具,包括C/C++编译器、汇编器、连接器、嵌入式系统的标准C库和GDB代码调试器,成功建立好后便可以用这些工具进行嵌入式系统开发了。3.3嵌入式Linux移植BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMIcore的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: 1、引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。  2、Lniuxn内核。特定于嵌入式板子的定制内核以及内核的启动参数。  28 1、文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。  2、用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式应用程序。常用的嵌入式GUI有:MicroWindows和MiniGUI等。  引导加载程序是系统加电后运行的第一段软件代码。PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OSBootLoader(比如,LILO和GRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OSBootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统。通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。Boorloader的实现以来与CPU的体系结构,一般来说启动过程分为两个阶段:第一阶段以来于CPU的体系结构大代码,比如设备初始化代码等。这个阶段完成的任务如下:(1)硬件设备初始化(2)为第二阶段准备RAM空间(3)复制Bootloader的第二阶段代码到RAM空间中(4)设置好堆栈并跳转到第二阶段的C程序入口点28 第二阶段则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可持续性和移植性。这个阶段的主要任务有:(1)初始化本阶段要使用的硬件设备(2)检测系统内存映射(3)将内核映像和根文件系统从FLASH读到RAM中(4)为内核设置启动参数3.4Linux平台下mjpg-streamer移植本系统选用嵌入式Linux作为目标机操作系统,一方面由于Linux是一款免费的操作系统,能很好的见底成本,同时Linux的开发应用现在应经成为热门,有大量的资源可供学习与使用,并且Linux系统具有良好的可移植性和可裁剪性,能自动支持多任务管理。本系统采用ARM开发平台,所以依赖ARM硬件平台的代码都在arch/arm下面。根目录下面只需要修改Makefile文件,该文件主要任务是产生vmLinux文件盒内核模块,对该文件的修改主要是设置目标平台和制定交叉编译器。在/opt/mini6410目录下创建目录webcamera来作为我们本次移植工作的工作目录,输入以下命令创建:#mkdir–p/opt/mini6410/webcamera进入webcamera目录下,通过SVN下载最新的mjpg-streamer-mini2440项目源代码:#cd/opt/mini6410/webcamera/#svncheckouthttp://mjpg-streamer-mini2440.googlecode.com/svn/trunk/mjpg-streamer-mini2440-read-only28 输入以下命令进行mjpg-streamer-mini2440-read-only目录:#cdmjpg-streamer-mini2440-read-only根据以下指示修改:1)用vi编辑start_uvc_yuv.sh,将内容:./mjpg_streamer-o"output_http.so-w./www"-i"input_uvc.so-y"修改成./mjpg_streamer-o"output_http.so-w./www"-i"input_uvc.so-y-d/dev/video2"2)用vi编辑Makefilea)在clean:处删除make-Cplugins/input_s3c2410$@b)再删除以下内容:input_s3c2410.so:mjpg_streamer.hutils.hmake-Cplugins/input_s3c2410allCC=$(CC)cpplugins/input_s3c2410/input_s3c2410.so.c)再到package:处删除以下两行:input_s3c2410.sostart_s3c2410.sh3.5交叉编译mjpeg-stream执行以下命令进行编译并打包:#cd/opt/mini6410/webcamera/mjpg-streamer-mini2440-read-only/#exportCC=arm-linux-gcc#make#makepackage28 在当前目录下会生成mjpg-streamer-mini2440-bin.tar.gz,将它拷入SD卡备用。Mini6410上的摄像头Bin”目录下找到我们编译好的可执行文件,文件名为mjpg-streamer-mini6410-bin.tar.gz。4跟踪测试4.1V4L2  VideoforLinuxtwo(Video4Linux2)简称V4L2,是V4L的改进版。V4L2是linux操作系统下用于采集图片、视频和音频数据的API接口,配合适当的视频采集设备和相应的驱动程序,可以实现图片、视频、音频等的采集。在远程会议、可视电话、视频监控系统和嵌入式多媒体终端中都有广泛的应用。在Linux下,所有外设都被看成一种特殊的文件,成为“设备文件”,可以象访问普通文件一样对其进行读写。一般来说,采用V4L2驱动的摄像头设备文件是/dev/v4l/video0。为了通用,可以建立一个到/dev/video0的链接。V4L2支持两种方式来采集图像:内存映射方式(mmap)和直接读取方式(read)。V4L2在include/linux/videodev.h文件中定义了一些重要的数据结构,在采集图像的过程中,就是通过对这些数据的操作来获得最终的图像数据。Linux系统V4L2的能力可在Linux内核编译阶段配置,默认情况下都有此开发接口。V4L2从Linux2.5.x版本的内核中开始出现。V4L2规范中不仅定义了通用API元素(CommonAPIElements),图像的格式(Image28 Formats),输入/输出方法(Input/Output),还定义了Linux内核驱动处理视频信息的一系列接口(Interfaces),这些接口主要有:视频采集接口——VideoCaptureInterface;视频输出接口——VideoOutputInterface;视频覆盖/预览接口——VideoOverlayInterface;视频输出覆盖接口——VideoOutputOverlayInterface;编解码接口——CodecInterface。4.2应用程序通过V4L2进行视频采集的原理 V4L2支持内存映射方式(mmap)和直接读取方式(read)来采集数据,前者一般用于连续视频数据的采集,后者常用于静态图片数据的采集,本文重点讨论内存映射方式的视频采集。应用程序通过V4L2接口采集视频数据分为五个步骤:首先,打开视频设备文件,进行视频采集的参数初始化,通过V4L2接口设置视频图像的采集窗口、采集的点阵大小和格式;其次,申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;第三,将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;第四,驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据;第五,停止视频采集。4.2.1视频采集的参数初始化在Linux下,摄像头硬件已经被映射为设备文件28 “/dev/video0”,用open函数打开这个设备文件,获得其文件描述符fd_v4l2,然后对这个文件描述符进行参数初始化。(1)设置视频的采集窗口参数设置采集窗口就是在摄像头设备的取景范围之内设定一个视频采集区域。主要是对结构体v4l2_crop赋值,v4l2_crop由一个v4l2_buffer_type枚举类型的type和v4l2_rect类型的结构体c构成,来描述视频采集窗口的类型和大小。type设置为视频采集类型V4L2_BUF_TYPE_VIDEO_CAPTURE。c是表示采集窗口的大小的结构体,它的成员Left和Top分别表示视频采集区域的起始横坐标和纵坐标,width和height分别表示采集图像的宽度和高度。赋值后,用ioctl函数通过这个结构体对fd_v4l2进行设置。structv4l2_crop{enumv4l2_buf_typetype;structv4l2_rectc;};(2)设置视频点阵格式和点阵大小主要是对结构体v4l2_format进行赋值,它由type和联合体fmt构成,来描述视频设备当前行为和数据的格式。28 V4L2_BUF_TYPE_VIDEO_CAPTURE,表示定义了一个视频采集流类型的buffer。fmt中,pix为表示图形格式的v4l2_pix_format型结构体。需要设定pix里的几个变量,pixelformat表示采集格式,设置为V4L2_PIX_FMT_YUV420;width、height表示图像的宽度、高度,以字节为单位;sizeimage表示图像所占的存储空间大小,以字节为单位;bytesperline表示每一行的字节数。赋值后,用ioctl函数通过这个结构体对fd_v4l2进行设置。  structv4l2_format  {enumv4l2_buf_typetype;  union{structv4l2_pix_formatpix;//V4L2_BUF_TYPE_VIDEO_CAPTURE  structv4l2_windowwin;//V4L2_BUF_TYPE_VIDEO_OVERLAY  __u8raw_data[200];//user-defined  }fmt;  };(3)设置视频采集的帧率结构体v4l2_streamparm来描述视频流的属性,它由type和联合体parm构成。type同上,由于选的是V4L2_BUF_TYPE_VIDEO_CAPTURE,所以仅需设定parm中的v412_capture型结构体capture即可。在其中,v4l2_fract型结构体timeperframe表示平均每一帧所占的时间,由其元素numerator和denominator共同决定,该时长为numerator/denominator;而capturemode则表示采集模式,采集高质量图片值为1,一般设为0。赋值之后,用ioctl函数通过这个结构体对fd_v4l2进行设置。  structv4l2_streamparm  {enumv4l2_buf_typetype;  union  {structv4l2_captureparmcapture;28   structv4l2_outputparmoutput;  __u8raw_data[200];/*user-defined*/  }parm;  };4.2.2申请并设置视频采集的帧缓冲区前期初始化完成后,只是解决了一帧视频数据的格式和大小问题,而连续视频帧数据的采集需要用帧缓冲区队列的方式来解决,即要通过驱动程序在内存中申请几个帧缓冲区来存放视频数据。应用程序通过API接口提供的方法(VIDIOC_REQBUFS)申请若干个视频数据的帧缓冲区,申请帧缓冲区数量一般不低于3个,每个帧缓冲区存放一帧视频数据,这些帧缓冲区在内核空间。应用程序通过API接口提供的查询方法(VIDIOC_QUERYBUF)查询到帧缓冲区在内核空间的长度和偏移量地址。应用程序再通过内存映射方法(mmap),将申请到的内核空间帧缓冲区的地址映射到用户空间地址,这样就可以直接处理帧缓冲区的数据。(1)将帧缓冲区在视频输入队列排队,并启动视频采集在驱动程序处理视频的过程中,定义了两个队列:视频采集输入队列(incomingqueues)和视频采集输出队列(outgoingqueues),前者是等待驱动存放视频数据的队列,后者是驱动程序已经放入了视频数据的队列。应用程序需要将上述帧缓冲区在视频采集输入队列排队(VIDIOC_QBUF),然后可启动视频采集。28 (2)循环往复,采集连续的视频数据启动视频采集后,驱动程序开始采集一帧数据,把采集的数据放入视频采集输入队列的第一个帧缓冲区,一帧数据采集完成,也就是第一个帧缓冲区存满一帧数据后,驱动程序将该帧缓冲区移至视频采集输出队列,等待应用程序从输出队列取出。驱动程序接下来采集下一帧数据,放入第二个帧缓冲区,同样帧缓冲区存满下一帧数据后,被放入视频采集输出队列。应用程序从视频采集输出队列中取出含有视频数据的帧缓冲区,处理帧缓冲区中的视频数据,如存储或压缩。最后,应用程序将处理完数据的帧缓冲区重新放入视频采集输入队列,这样可以循环采集,如图4.2.1所示:    图4.2.1视频采集输入和输出队列示意图4.3用V4L2采集视频的程序流程和相关API V4L2采集视频操作基本按照打开视频设备、设置视频格式、启动视频采集,循环处理视频数据、停止视频采集、关闭视频设备,具体操作通过ioctl等函数来实现。一般操作流程如下:(1)打开视频设备文件。intfd=open("/dev/video0",O_RDWR);28 (2)查询视频设备的能力,比如是否具有视频输入,或者音频输入输出等。ioctl(fd_v4l,VIDIOC_QUERYCAP,&cap)(3)设置视频采集的参数设置视频的制式,制式包括PAL/NTSC,使用ioctl(fd_v4l,VIDIOC_S_STD,&std_id)设置视频图像的采集窗口的大小,使用ioctl(fd_v4l,VIDIOC_S_CROP,&crop)设置视频帧格式,包括帧的点阵格式,宽度和高度等,使用ioctl(fd_v4l,VIDIOC_S_FMT,&fmt)设置视频的帧率,使用ioctl(fd_v4l,VIDIOC_S_PARM,&parm)设置视频的旋转方式,使用ioctl(fd_v4l,VIDIOC_S_CTRL,&ctrl)(4)向驱动申请视频流数据的帧缓冲区请求/申请若干个帧缓冲区,一般为不少于3个,使用ioctl(fd_v4l,VIDIOC_REQBUFS,&req)查询帧缓冲区在内核空间中的长度和偏移量ioctl(fd_v4l,VIDIOC_QUERYBUF,&buf)(5)应用程序通过内存映射,将帧缓冲区的地址映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。buffers[i].start=mmap(NULL,buffers[i].length,PROT_READ|PROT_WRITE,MAP_SHARED,fd_v4l,buffers[i].offset);(6)将申请到的帧缓冲全部放入视频采集输出队列,以便存放采集的数据。ioctl(fd_v4l,VIDIOC_QBUF,&buf)(7)开始视频流数据的采集。ioctl(fd_v4l,VIDIOC_STREAMON,&type)28 (8)驱动将采集到的一帧视频数据存入输入队列第一个帧缓冲区,存完后将该帧缓冲区移至视频采集输出队列。(9)应用程序从视频采集输出队列中取出已含有采集数据的帧缓冲区。ioctl(fd_v4l,VIDIOC_DQBUF,&buf),应用程序处理该帧缓冲区的原始视频数据。(10)处理完后,应用程序的将该帧缓冲区重新排入输入队列,这样便可以循环采集数据。ioctl(fd_v4l,VIDIOC_QBUF,&buf)重复上述步骤8到10,直到停止采集数据。(11)停止视频的采集。ioctl(fd_v4l,VIDIOC_STREAMOFF,&type)(12)释放申请的视频帧缓冲区unmap,关闭视频设备文件close(fd_v4l)。以上的程序流程,包含了视频设备采集连续的视频数据的逻辑关系。而在实际运用中,往往还要加入对视频数据进行处理(如压缩编码)的工作,否则,视频流数据量相当大,需要很大的存储空间和传输带宽。上述过程中,每一个帧缓冲区都有一个对应的状态标志变量,其中每一个比特代表一个状态  V4L2_BUF_FLAG_UNMAPPED0B0000  V4L2_BUF_FLAG_MAPPED0B0001  V4L2_BUF_FLAG_ENQUEUED0B0010  V4L2_BUF_FLAG_DONE0B0100缓冲区的状态转化如图4.3.1所示:  28 图4.3.1缓冲区的状态标志转化图5设计总结要实现现场监控,出了完成视屏采集的过程,还需要吧视频图像数据通过网络传输出去,因此需要在完成视频采集的基础上建立网络服务器,实现客户端和服务器之间的数据通信。5.1TCP/IP协议简介TransmissionControlProtocol/InternetProtocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通信协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。物理层是定义物理介质的各种特性:  1、机械特性。  2、电子特性。  3、功能特性。  4、规程特性。28 5.2socket网络编程socket的英文原义是“孔”或“插座”。作为4BDSUNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。  客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。常用的Socket类型28 有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。Socket为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:intsocket(intdomain,inttype,intprotocol);domain指明所使用的协议族,通常为PF_INET,(其与addrinfo里的AF_INET在现在看来是相同的。只是历史上人们曾构想将AF(地址家族addressfamily)与PF(protocolfamily协议家族)分开,但实际上这种区分并未真正推广,所以现在AF_INET和PF_INET具有相同的意义。其中AF_INET是基于IPv4而PF_INET基于IPv6)表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。socket在测量软件中的使用也很广泛。5.3图像传输的软件实现要在Linux28 上实现通过WEB远程浏览和控制摄像头,可以使用一个开源软件mjpg-streamer来实现,而很早之前国外就已经有爱好者将mjpg-streamer移植到了mini2440并运行,并创建一个开源项目名为mjpg-streamer-mini2440在开发板的终端上输入以下命令启动mjpeg-stream:@#cd/mjpg-streamer@#./start_uvc_yuv.sh此时可以在终端看到如下的输出信息,这说明已经成功启动mjpeg-stream程序:MJPGStreamerVersion.:2.0i:UsingV4L2device.:/dev/video2i:DesiredResolution:640x480i:FramesPerSecond.:5i:Format............:YUYVi:JPEGQuality......:80o:www-folder-path...:./www/o:HTTPTCPport.....:8080o:username:password.:disabledo:commands..........:enabled在电脑上浏览摄像头上的图像,在电脑上,打开网页浏览器,在浏览器的地址输入:http://192.168.1.230:8080/stream_simple.html可看到摄像头的动态画面了,如下图5.3.1-5.3.2所示:28 图5.3.1摄像头的画面图5.3.2摄像头画面28 结论本文分析了当前嵌入式系统技术应用于网络视频监控系统,设计了一种基于嵌入式Linux和S3C6410的低成本的网络视频采集传输系统方案,主要完成了一下工作:通过大量实验熟悉了嵌入式ARM平台下的裁减和移植;USB摄像头在Linux系统下的驱动程序开发;基于V4L的视频采集程序的设计,以及图像压缩;服务器程序和客户端实现视频数据的网络传输。由于时间紧迫,本系统软硬件设计还存在很多方面的不足之处,需要进一步完善,因此本人希望在未来的工作中对一下方面加以改进:1)使用专门的视频解码芯片对图像数据进行压缩,采用更适合网络传输的视频压缩格式MPEG-4图像压缩算法已达到更好的效果。2)在PC机上开发一套完整的客户端软件,以提高系统的实用性。3)将客户端移植到Windows或者以Web方式来访问服务器以满足更多用户的需求。28 参考文献[1]文峻,网络视频的零距离沟通[N],市场报,2002.9(13)[2]刘富强,数字视频监控系统开发及应用[M],北京:机械工业出版社,2003[3]李小平等,多媒体通信技术[M],北京:北京航空航天大学出版社,2004[4]陈俊宏,嵌入式系统原理与务实[M],中国铁道出版社,2004[5]吴明晖,基于ARM的嵌入式系统开发与应用[M],人民邮电出版社,2004[6]S3C641032-bitRISCMICROPROCESSORUSERSMANUAL[J].SamsungElectronicsSemiconductors,Revision1.2[7]杨凯,基于S3C6410的多媒体数字终端的研究与实现[M],清华大学出版社,2004[8]杜春雷,ARM体系结构的与编程[M],清华大学出版社,2003[9]朱珍民,隋雪青,嵌入式实时操作系统及应用开发[M],北京邮电大学出版社,2006[10]CraigHollabaugh嵌入式Linux电子工业出版社[M],2003[11]王学龙,嵌入式Linux系统设计与应用[M],清华大学出版社[12]于明,范书瑞等,ARM9嵌入式系统设计与开发教程[J],电子工业出版社,2006[13]马忠梅,ARM&Linux嵌入式系统教程[M],北京航空航天大学出版社,2004[14]李巨光,ARM应用系统开发详解[C],清华大学出版社,200328 致谢首先,非常感谢我的导师何建仓老师,在他的悉心指导下,我们的论文得以顺利完成,在我完成课程设计这段时间,何老师给了我莫大的帮助与鼓舞,他知识渊博,思维缜密,工作踏实严谨,潜移默化地熏陶着我们,鞭策着我们。在此,向何老师表示由衷的感谢和崇高的敬意,今后都会将老师的谆谆教诲牢记于心!同时,感谢所有热情帮助过我,支持过我的所有老师同学,他们在学习和生活上给了我莫大的帮助,让我感受到了集体的温暖与力量!28

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭