为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

远程视频监控系统毕业论文

2019-03-20 15页 doc 3MB 11阅读

用户头像 个人认证

蓝多多

暂无简介

举报
远程视频监控系统毕业论文远程视频监控系统毕业论文远程视频监控系统毕业论文题目:基于TCP/IP的远程视频监控系统开发学院:应用技术学院专业:电子信息工程目录5摘要6Abstract7前言9第一章相关知识概述91.1PC端开发环境介绍91.1.1GCC(forarm-linux)的搭建101.1.2Linux下Ecilpse的搭建171.2Linux下的图像采集接口(V4L2)181.3摄像头采集数据格式(YUV420)191.4图像压缩格式(H.264)201.5图像压缩实现(硬件压缩)211.6图像数据的打包发送协议(RTSP)221.7RTSP协...
远程视频监控系统毕业论文
远程视频监控系统毕业论文远程视频监控系统毕业论文题目:基于TCP/IP的远程视频监控系统开发学院:应用技术学院专业:电子信息工程目录5摘要6Abstract7前言9第一章相关知识概述91.1PC端开发环境介绍91.1.1GCC(forarm-linux)的搭建101.1.2Linux下Ecilpse的搭建171.2Linux下的图像采集接口(V4L2)181.3摄像头采集数据格式(YUV420)191.4图像压缩格式(H.264)201.5图像压缩实现(硬件压缩)211.6图像数据的打包发送(RTSP)221.7RTSP协议的实现(Live555)24第二章系统总体设计242.1硬件系统简介242.1.1S3C6410处理器242.1.2系统硬件结构252.2软件总体设计252.2.1视频采集272.2.2视频编码28第三章详细设计与实现283.1硬件实现283.1.16410开发板分类概述293.1.2飞凌OK6410开发板303.2软件设计与实现303.2.1视频采集363.2.2视频编码403.2.3H.264视频流的封装和传输443.2.4软件集成49第四章系统调试494.1硬件调试504.2软件调试504.2.1NFS配置514.2.2测试程序534.3软硬结合调试55结论56总结与体会58致谢59参考文献60附录60附录一源程序60主程序67capture.h69vcompress.h71附录二外文参考71外文原文98中文译文摘要本文从硬件设计和软件设计两个方面阐述了一种基于S3C6410处理器的视频采集传输系统的设计和实现。本系统采用基于ARM11核心的三星S3C6410处理器,通过V4L2接口编程采集外接摄像头视频数据,采用了硬件编码器进行H.264编码,提高了编码效率。采用Live555对H.264视频流封装打包,根据RTSP协议经由网络传送至PC机,使用VLC进行直播。经实验测试证明系统设计是可行的,达到了预期的功能要求。关键词:S3C6410;H.264;V4L2;RTSP;Live555AbstractDescribedthedesignandimplementationofthevideocaptureandtransmissionsystembasedonS3C6410microprocessorfromthehardwaredesignandsoftwaredesign。UsingARM11-basedS3C6410microprocessor,thesystemrealizesvideoacquisitionusingcamera,encodesthedatawithH.264coderandimprovetheefficiencyofencoder.TheH.264videostreamcapturedbycameraissendedtothePCvianetworkontheRTSPprotocolafterpackedbyLive555,thenit’splayedbytheVLC.Thelaboratorytestsprovedthesystemdesignisfeasible,achievethedesiredfunctionalrequirements。Keywords:S3C6410;H.264;V4L2;RTSP;Live555前言随着现代化企业、小区制度在我国的普及和深化发展,企业、小区的信息化建设不断深入,各企业、小区特别是大中型企业、小区都加快了信息网络平台的建设;企业、小区正逐步转向利用网络和计算机集中处理管理、生产、销售、物流、售后服务等重要环节的大量数据。在小区,为了有效的保护小区财产和工作人员的安全,最大程度的防范各种入侵,提高处理各种突发事件的反映速度,给保卫人员提供一个良好的工作环境,确保整个小区的安全;根据小区用户实际的监控需要,一般都会在小区周边、大门、住宅、仓库、机房、停车场等重点部位安装摄像机。在现代企业,为了保证高效有序的生产秩序,设备的正常安全运行,生产物资的存储供给安全和企业的统筹管理;安全保卫部门需要实现在大门、仓库、机房、配电室、生产车间、停车场等目标进行实时全天候视频监控。这时视频监控系统的市场日益扩大,市场对其功能要求趋于多样化、智能化、复杂化,远程化。然而传统的第一、第二代视频监控系统都是基于模拟图像传输,布线复杂凌乱,线材成本高,传输距离短,数据难以处理操作;而第三代视频监控系统虽然实现了IP网络的传输,但其前端设备功能的单一,管理系统相对简单,视频压缩往往不理想,视频传输宽带占用大,视频流采用非标准协议,图像远传仅局限在局域网内传输,难以完成目前监控网络的不断扩大及日益复杂的功能需求,严重的制约了远程监控、远程登录控制管理等应用。随着时代的发展,嵌入式视频监控已经成为国内外视频监控的主流,但是现在的嵌入式设备,尤其是移动音视频设备,虽然和前几年相比有了很大的发展,性能也有了很大的提高,但是处理器的性能和处理能力还是很有限的,要进行视频的编解码需要外接编码器或者采用软件方式实现,不能很好的满足日益发展的视频监控的需要。H.264是ITU-T和ISO/IEC共同开发的新一代数字视频编码标准,作为目前国际上最先进的视频编码标准,它具有高压缩率、低编码率、低带宽需求的特点。本文采用了三星公司生产的集ARM11内核和H.264硬件编码器于一体的S3C6410处理器,不仅具有较高的计算能力,而且使用硬件进行编解码,很好的满足了目前嵌入式系统中视频编解码的问题,适用于视频数据在不同的网络传输。而且数据流采用标准的RTSP协议,能使用一般的通用播放器进行直播,只要网络条件许可,不受距离的约束,因而具有一定的实用价值。第一章相关知识概述1.1PC端开发环境介绍1.1.1GCC(forarm-linux)的搭建(1)从飞凌开发板附带的关盘中拷贝“arm-linux-gcc-4.3.2.tgz”至虚拟机,并解压至“/opt”目录下:图1-1(2)添加环境变量:在终端里面输入“gedit/etc/environment”,打开文件后在末尾添加GCC路径“/opt/GCC/bin”,然后保存退出:图1-2在终端输入“source/etc/environment”,以使修改生效,然后在终端输入“arm-linux-gcc–v”看GCC路径是否已经被识别。1.1.2Linux下Ecilpse的搭建1、在Linux下使用Eclipse进行C/C++开发的意思Linux是一个以C/C++开发为主的平台,无论是Kernel或是Application,主要都使用C/C++开发。传统在Linux下开发程序,是在文字模式下,利用vi等文字编辑器撰写C/C++程序存盘后,在Commandline下使用gcc编译,若要debug,则使用gdb。这种开发方式生产力并不高,若只是开发学习用的小程序则影响不大,但若要开发大型项目时,程序档案个数众多,需要用project或solution的方式管理;且debug时breakpoint的加入,单步执行,观察变量变化等,都需要更可视化的方式才能够增加生产力;最重要的,由于现在的程序语言皆非常的庞大,又有复杂的函式库,要程序员熟记所有的程序语法和function名称,实在很困难,所以语法提示(Intellisense)的功能就非常重要,这些就必须靠IDE来达成。在Windows平台上,若要开发C/C++程序,我们有MicrosoftVisualStudio、BorlandC++Builder可用,这些都是很好用的IDE,但可惜仅能在Windows下使用,但是在Linux平台呢?基于以下理由,我推荐使用Eclipse开发C/C++程序:(1)Eclipse是一个用Java所撰写IDE,因此可跨平台,所以在Linux和Windows平台下皆可使用Eclipse,可降低程序员熟析IDE的学习曲线。(2)Eclipse虽然主要拿来开发Java程序,但事实上Eclipse为一个『万用语言』的IDE,只要挂上plugin后,就可以在Eclipse开发各种语言程序,所以我们只要挂上CDT(C/C++DevelopmentToolkit)后,就可以在Eclipse开发C/C++程序,除此之外,目前的主序语言,如C/C++、C#、Java、PHP、Perl、Python、Ruby、Rebol、JavaScript、SQL、XML、UML等,皆可在Eclipse上撰写,所以只要熟析Eclipse的IDE环境,将来若开发其它语言程序,就不用再重新学习IDE环境了。(3)最重要的,Eclipse和CDT是OpenSource且完全免费,取得相当容易,事实上Fedora5已经包含Eclipse和CDT了,虽然预设Fedara5安装时并没有含Eclipse,只要手动另外加选即可。2、Linux下EclipseforC++安装教程1.下载档案(1)下载JRE:进入网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html。选择JRE:图1-3选择版本并下载:图1-4(2)下载EclipseSDK。进入网址:http://www.eclipse.org/downloads/。选择C++版本:图1-52.安装(1)把下好的JRE和Eclipse解压放置在“/opt”下:图1-6(2)创建JRE的链接:图1-7图1-8(3)把JRE的链接移动至Eclipse目录下,并改名为“jre”:图1-9(4)运行:图1-10(5)编译成arm版本的可执行程序:新建项目:图1-11图1-12进入新建工程的项目属性,在“Setting”属性菜单下,把编译器、编译器、链接器等“Command”属性添加“arm-linux-”前缀:图1-13这样在编译后生成的就是arm版本的可执行文件了。1.2Linux下的图像采集接口(V4L2)Linux中的Video4Linux模块为视频应用程序提供了一套统一的API接口,使得应用程序可以使用统一的API函数操作不同的视频设备,极大地简化了视频系统的开发和维护。由于V4L有很多缺陷,BillDirks等人对其进行了重新设计,并取名为VideoforLinuxTwo(V4L2),最早出现于Linux2.5.x版本。V4L2相比于V4L有更好的扩展性和灵活性,并且支持的硬件设备更多。它向虚拟文件系统注册视频设备文件,应用程序通过访问视频设备文件实现对视频设备的操作。V4L2可以支持多种设备,它可以有以下几种接口:  1.视频采集接口(videocaptureinterface):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的。 2.视频输出接口(videooutputinterface):可以驱动计算机的外围视频图像设备--像可以输出电视信号格式的设备。  3.直接传输视频接口(videooverlayinterface):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU。  4.视频间隔消隐信号接口(VBIinterface):它可以使应用可以访问传输消隐期的视频信号。  5.收音机接口(radiointerface):可用来处理从AM或FM高频头设备接收来的音频流。1.3摄像头采集数据格式(YUV420)YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大。YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式。YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码(属于PAL)。YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的带宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是通过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面—色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了GB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。YUV的优点之一是,色度频道的采样率可比Y频道低,同时不会明显降低视觉质量。有一种表示法可用来描述U和V与Y的采样频率比例,这个表示法称为A:B:C表示法:YUV420格式,每像素占用12位,YUV色彩模型来源于RGB模型,该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。YUV420与RGB的换算关系:Y'=0.299*R'+0.587*G'+0.114*B'U'=-0.147*R'-0.289*G'+0.436*B'=0.492*(B'-Y')V'=0.615*R'-0.515*G'-0.100*B'=0.877*(R'-Y')R'=Y'+1.140*V'G'=Y'-0.394*U'-0.581*V'B'=Y'+2.032*U'。1.4图像压缩格式(H.264)  H.264是一种高性能的视频编解码技术。目前国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。而H.264则是由两个组织联合组建的联合视频组(JVT)共同制定的新数字视频编码标准,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高级视频编码(AdvancedVideoCoding,AVC),而且它将成为MPEG-4标准的第10部分。因此,不论是MPEG-4AVC、MPEG-4Part10,还是ISO/IEC14496-10,都是指H.264。H.264最大的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1!H.264为什么有那么高的压缩比?低码率(LowBitRate)起了重要的作用,和MPEG-2和MPEG-4ASP等压缩技术相比,H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。H.264是在MPEG-4技术的基础之上建立起来的,其编解码流程主要包括5个部分:帧间和帧内预测(Estimation)、变换(Transform)和反变换、量化(Quantization)和反量化、环路滤波(LoopFramedFilter)、熵编码(EntropyCoding)。H.264/MPEG-4AVC(H.264)是1995年自MPEG-2视频压缩标准发布以后的最新、最有前途的视频压缩标准。通过该标准,在同等图象质量下的压缩效率比以前的标准提高了2倍以上,因此,H.264被普遍认为是最有影响力的行业标准。1.5图像压缩实现(硬件压缩)S3C6410中负责视频编码的MFC模块针对视频编码器的各功能模块均采用硬件实现,相对传统视频编码器的全软件实现,采用全硬件的视频编码器在编码速度上优势明显,并且对处理器的处理速度要求也进一步降低。下面分别说明S3C6410的MFC模块对H.264,MPEG4,H.263三种格式的硬件解码器的解码原理。H.264视频格式的硬件编码器结构图1-14所示,与软件编码器不同的是,硬件编码器中的许多硬件功能模块内置缓冲区,这些缓冲区部分用于本模块数据处理;另一部分可以为下一功能模块缓存所需的输入数据。在图1-14中,运动估计模块一方面从外部SDRAM中读取参考帧宏块,从PrP模块中读取经旋转处理后的当前帧宏块,并对二者进行处理,计算出运动向量;另一方面又将缓存的当前帧宏块发送给残差模块,将缓存的参考帧亮度信号宏块发送给和运动发送给帧间预测模块。残差模块接收当前帧宏块,读取预测宏块缓冲区的中预测宏块,通过两者计算出差值宏块。这里的预测宏块是由帧内预测或帧间预测模式产生的。差值宏块经变换,量化后的变换系数一方面发送到系数缓存中进行重排序并缓存;另一方面被量化模块发送到反量化模块中进行反量化,反变换处理。系数缓存中经重排序后的系数和其它信息,如:运动向量,量化步长,宏块预测类型等,一起经BIT处理器的的CAVLC熵编码技术处理后的压缩数据流被写入外部SDRAM中。被量化模块发送给反量化模块的变换系数经反量化,反变换处理后再次得到差值宏块,但这里的得到的差值宏块由于经过了量化处理,所以与残差模块产生的差值宏块存在差异。差值宏块同存放在预测宏块缓冲区中的预测宏块一起经重构模块处理后,得到未滤波的重构宏块,用于帧内预测。未滤波的重构宏块在被写入外部SDRAM的同时,又被发送给去方块滤波器进行滤波处理,处理后生成滤波但未被旋转的宏块,用于帧间预测。滤波但未被旋转的宏块在被写入外部SDRAM的同时,又被发送到PP旋转模块,经旋转处理后,得到滤波并被旋转的宏块,写入外部SDRAM中,用于显示。图1-14S3C6410H.264硬件编码器结构图1.6图像数据的打包发送协议(RTSP)RTSP(RealTimeStreamingProtocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETFRFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流,它的语法和运作跟HTTP1.1类似,但并不特别强调时间同步,所以比较能容忍网RTSP络延迟。而前面提到的允许同时多个串流需求控制(Multicast),除了可以降低服务器端的网络用量,更进而支持多方视讯会议(VideoConference)。因为与HTTP1.1的运作方式相似,所以代理服务器〈Proxy〉的快取功能〈Cache〉也同样适用于RTSP,并因RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中于同一服务器而造成延迟。实时流协议(RTSP)是应用级协议,控制实时数据的发送。RTSP提供了一个可扩展框架,使实时数据,如音频与视频,的受控、点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如UDP、组播UDP与TCP,提供途径,并为选择基于RTP上发送机制提供方法。实时流协议(RTSP)建立并控制一个或几个时间同步的连续流媒体。尽管连续媒体流与控制流交换是可能的,通常它本身并不发送连续流。换言之,RTSP充当多媒体服务器的网络远程控制。RTSP连接没有绑定到传输层连接,如TCP。在RTSP连接期间,RTSP用户可打开或关闭多个对服务器的可传输连接以发出RTSP请求。此外,可使用无连接传输协议,如UDP。RTSP流控制的流可能用到RTP,但RTSP操作并不依赖用于携带连续媒体的传输机制。  1.7RTSP协议的实现(Live555)Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。Live555实现了对多种音视频编码格式的音视频数据的流化、接收和处理等支持,包括MPEG、H.263+、DV、JPEG视频和多种音频编码。同时由于良好的设计,Live555非常容易扩展对其他格式的支持。目前,Live555已经被用于多款播放器的流媒体播放功能的实现,如VLC(VideoLan)、MPlayer。Live555StreamingMedia整体框架:图1-15Live555整体框架图第二章系统总体设计本视频采集传输系统主要由视频采集发送终端、网络和负责视频回放的PC机三部分组成。终端是采用S3C6410嵌入式处理器的开发板,运行嵌入式Linux操作系统,方便用户的各种操作和应用软件的开发。开发板外接摄像头进行视频数据的采集,视频经过编码压缩后经由局域网传送到局域网内的一台PC机上,PC机上运行Linux操作系统Fedora11,负责接收终端传输过来的数据,并进行解码、显示和播放。2.1硬件系统简介2.1.1S3C6410处理器S3C6410是韩国三星电子基于ARM1176JZF-S内核构建的高性能多媒体应用处理器,它不仅具有强大的硬件编解码单元,完善的外设,而且拥有高达667MHz的运行频率。它采用由AXI、AHB和APB总线组成的64/32-bit内部总线结构,集成了众多强大的硬件加速器以完成视频处理、音频处理、3D图像加速、显示操作与缩放等任务。内部集成的多媒体解码器(MFC)支持MPEG4/H.263/H.264的编码与解码,并支持VC1解码。这种H/W编码/解码器支持实时视频会议系统以及NTSC和所有PAL制式的电视信号输出,因而广泛用于消费类电子、车载导航、多媒体终端等电子产品的开发和设计。2.1.2系统硬件结构本系统采用广州飞凌科技生产的OK6410开发板作为硬件平台,它采于韩国三星公司生产的ARM11处理器S3C6410,具有128MB的DDR内存以及1GB的NANDFLASH,系统具有体积小、耗电低、处理能力强等特点,能够装载和运行嵌入式Linux操作系统。下图为终端的硬件结构图。图2-16410开发板系统硬件结构图2.2软件总体设计系统的软件设计可分为系统软件平台的建立和应用软件的设计,系统软件平台的搭建按照REALARM6410使用手册上的步骤即可分别进行bootloader、内核和文件系统的建立。应用软件的设计可以分为3个部分,分别是视频采集、数据H.264编码和数据网络传输。2.2.1视频采集Linux中的Video4Linux模块为视频应用程序提供了一套统一的API接口,使得应用程序可以使用统一的API函数操作不同的视频设备,极大地简化了视频系统的开发和维护。由于V4L有很多缺陷,BillDirks等人对其进行了重新设计,并取名为VideoforLinuxTwo(V4L2),最早出现于Linux2.5.x版本。V4L2相比于V4L有更好的扩展性和灵活性,并且支持的硬件设备更多。它向虚拟文件系统注册视频设备文件,应用程序通过访问视频设备文件实现对视频设备的操作。Linux下使用V4L2进行视频采集的流程如下所示。图2-2视频采集流程图2.2.2视频编码视频的编码由S3C6410编解码单元来实现,它具有高性能的视频编解码功能,支持MPEG4、H.263、H.264的编码与解码,并能对VC-1进行解码。用户的多媒体应用程序可以调用API以使用S3C6410多格式编码器/解码器提供的编码和解码的多媒体数据功能。下面是使用编码器提供的API进行H.264编码的步骤。图2-3视频压缩流程第三章详细设计与实现3.1硬件实现由于本毕业设计是基于嵌入式Linux智能操作系统开发的,软件运行在操作系统之上,属于应用级软件,使用的为一般通用型硬件开发平台,所以硬件方案比较成熟,市面上充满各种硬件解决方案。考虑到本设计方案要使用H.264图像编码,硬件计算量复杂,对硬件规格要求较高,如果采用软件编码,在嵌入式平台势必有很大的压力,所以我采用核心为S3C6410的开发板。该CPU内部具有H.264硬件编码器,能应付普通码流的视频编码,而价格又适中,是很好的硬件解决方案。3.1.16410开发板分类概述随着微电子技术的快速发展,ARM处理器经历了包括ARM7、ARM9在内的多个发展历程,而ARM11的成熟应用必将为嵌入式的发展带来新的活力,使更高端的产品应用成为可能。S3C6410是由三星公司推出的一款低功耗、高性价比的RSIC处理器,它基于ARM11内核(ARM1176JZF-S),可广泛应用于移动电话和通用处理等领域;S3C6410内部集成了一个MFC(Multi-FormatvideoCodec)支持MPEG4/H.263/H.264编解码和VC1的解码,能够提供实时的视频会议以及NRSC和PAL制式的TV输出;由于以上突出的性能表现,著名的苹果公司手机IPHONE就是基于S3C6410处理器。OK6410是基于SAMSUNG的16/32位RSIC微处理器S3C6410X的一款开发平台,S3C6410包括很多硬件功能外设:Camera接口,TFT24bit真彩色LCD控制器,系统管理单元(电源时钟等),4通道的UART,32通道的DMA,4通道定时器,通用I/O口,I2S总线,I2C总线,USBHost,高速USBOTG,SDHost和高速MMC卡接口以及内部的PLL时钟发生器。3.1.2飞凌OK6410开发板飞凌OK6410开发板基于三星公司最新的ARM11处理器S3C6410,拥有强大的内部资源和视频处理能力,可稳定运行在667MHz主频以上,支持MobileDDR和多种NANDFlash。飞凌OK6410开发板上集成了多种高端接口,如复合视频信号、摄像头、USB、SD卡、液晶屏、以太网,并配备温度传感器和红外接收头等。这些接口可作为应用参考帮助用户实现高端产品级设计。飞凌OK6410开发板采用‘核心板+底板’结构,核心板尺寸规格为‘5CM×6CM’,底板尺寸为‘10.5CM×14CM’,核心板与底板之间采用4组高质量进口连接器(镍金工艺,接触好、抗氧化),共计320个引脚(80×4),方便客户进行二次开发,进行各种形式的扩展应用。图3-1飞凌OK6410开发板视图3.2软件设计与实现3.2.1视频采集由于在进行H.264硬件压缩时,输入的视频流格式必须为YUV420的格式,所以在开发板上必须采集到该格式的视频,在初始化摄像头硬件参数时,使用的是Linux摄像头V4l2编程接口,不仅要设置分辨率,还要设置好采样格式,为了保证采样速率,笔者采样设备内存直接映射的方式进行帧读取,然后进行文件储存。程序结束后,把储存为YUV420格式的视频文件拷贝至Windows下进行播放测试,使用的播放器为“YUVPlayer”。Linux下使用V4L2进行视频采集的流程如下图所示。图3-2YUV420图像采集流程图视频采集中主要的函数有以下: 功能 函数介绍 摄像头打开函数 函数名 intOpenCam(unsignedchar*dev) 功能介绍 根据摄像头设备名打开驱动,返回设备号 摄像头设备初始化函数 函数名 intCamInit(intfd) 功能介绍 根据摄像头设备号设置图像采集高宽、格式 映射摄像头内存空间函数 函数名 intMmapCam((intfd,void**buf) 功能介绍 根据摄像头设备号映射设备内存空间,返回内存地址 采集图像并保存 函数名 SaveYuv(constchar*filename,intfd,inttime) 功能介绍 根据设备号采集图像并保存为路径名“filename” 摄像头关闭函数 函数名 voidCloseCam(intfd,void*buf) 功能介绍 释放内存映射,关闭摄像头表3-1摄像采集主要函数表摄像采集流程关键代码描述:(1)打开设备文件,返回设备号intOpenCam(unsignedchar*dev) StartOpenCamfd←open(dev,O_RDWR)iffd<0ThenPRINT"Opencamerafailed!\n"Return-1EndIfReturnfdEndOpenCam(2)设置视频的制式和帧格式intCamInit(intfd) StartCamInitDimfmtAsv4l2_formatfmt.type←V4L2_BUF_TYPE_VIDEO_CAPTUREfmt.fmt.pix.width←640fmt.fmt.pix.height←480fmt.fmt.pix.pixelformat←V4L2_PIX_FMT_YUV420ifioctl(fd,VIDIOC_S_FMT,&fmt)<0ThenPRINT"Setformatfailed!\n"Return-1EndIftype←V4L2_BUF_TYPE_VIDEO_CAPTUREifioctl(fd,VIDIOC_STREAMON,&type)<0ThenPRINT"Errorioctlstreamon\n"Return-1EndIfReturn1EndCamInit(3)对摄像头进行设备内存的映射intMmapCam((intfd,void**buf) StartMmapCam*buf←mmap(0,640*480*3>>1,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)if*buf=MAP_FAILEDThenPRINT"MAP_FAILED\n"Return-1EndIfReturn640*480*3>>1EndMmapCam(4)图像的采集和保存SaveYuv(constchar*filename,intfd,inttime) StartSaveYuvfp←fopen(filename,"wb")ifMmapCam(fd,&mmapbuf,640*480*3>>1)<0Then`PRINT"MmapCamERR\n"Return-1EndIfDimfdsAsfd_setFD_ZERO(&fds);FD_SET(fd,&fds);DoWhiletime-->0ifselect(fd+1,&fds,NULL,NULL,NULL)>0Thenfwrite(mmapbuf,640*480*3>>1,1,fp)EndIfEndWhilefclose(fp)Return1EndSaveYuv(5)视频采集结束、关闭视频设备。voidCloseCam(intfd,void*buf) StartCloseCamIfbuf!=NULLThenmunmap(buf)EndIfclose(fd)(6)采样数据的验证使用YUVPlayer对采集后保存的文件进行播放,其播放效果如下:图3-3YUV420视频播放效果截图3.2.2视频编码在对摄像头进行YUV420的图像采集后,就可以使用S3C6410的编码单元MFC对YUV420的视频数据进行H.264的压缩了。S3C6410的编码单元MFC具有高性能的视频编解码功能,支持MPEG4、H.263、H.264的编码与解码,并能对VC-1进行解码。用户的多媒体应用程序可以调用API以使用S3C6410多格式编码器/解码器提供的编码和解码的多媒体数据功能。该方式使用硬件电路完成,所以压缩速率很快,相对于软件压缩,更适宜在嵌入式开发平台的使用。在笔者使用的OK6410开发板上已经拥有H.264硬件压缩的驱动,具体位置为“/dev/s3c-mfc”。Linux下硬件编码流程如下图所示。图3-4H.264硬件编码流程图视频编码主要的函数有以下: 功能 函数介绍 打开输入输出文件 函数名 intOpenFile(int*in_fd,int*out_fd) 功能介绍 打开输入输出文件,返回文件句柄 打开MFC并初始化设备 函数名 void*mfc_encoder_init(intwidth,intheight,intframe_rate,intbitrate,intgop_num) 功能介绍 打开MFC,并设置图像宽高、帧率、波特率、图像质量 执行视频压缩 函数名 void*mfc_encoder_exe(void*handle,unsignedchar*yuv_buf,intframe_size,long*size) 功能介绍 压缩YUV420图像,返回H.264视频数据内存指针表3-2视频编码主要函数表摄像采集流程关键代码描述:(1)打开输入输出文件并获得输入量的大小intOpenFile(int*in_fd,int*out_fd) StartOpenFile*in_fd←open(“/mnt/disk/1.yuv”,O_RDONLY)*out_fd←open(“/mnt/disk/1.264”,O_RDWR|O_CREAT|O_TRUNC,0644)DimsAsstatDimfile_sizeAsIntfstat(*in_fd,&s)file_size←s.st_sizeReturnfile_sizeEndOpenFile(2)打开MFC设置参数,初始化void*mfc_encoder_init(intwidth,intheight,intframe_rate,intbitrate,intgop_num) Startmfc_encoder_initDimframe_size,retAsIntDimhandleAsvoid*frame_size←(width*height*3)>>1handle←SsbSipH264EncodeInit(width,height,frame_rate,bitrate,gop_num);ifhandle=NULLThenLOG_MSG(LOG_ERROR,"Test_Encoder","SsbSipH264EncodeInitFailed\n")ReturnNULLEndIfret←SsbSipH264EncodeExe(handle)ReturnhandleEndmfc_encoder_init(3)YUV420图像压缩成H.264void*mfc_encoder_exe(void*handle,unsignedchar*yuv_buf,intframe_size,long*size) Startmfc_encoder_exeDimp_outbuf,p_inbufAschar**p_inbuf←SsbSipH264EncodeGetInBuf(handle,0)memcpy(p_inbuf,yuv_buf,frame_size)SsbSipH264EncodeExe(handle)p_outbuf←(unsignedchar*)SsbSipH264EncodeGetOutBuf(handle,size)Returnp_outbuf;Endmfc_encoder_exe(4)编码后视频播放效果以下是保存为H.264数据文件的播放效果:图3-5H.264视频播放效果截图3.2.3H.264视频流的封装和传输笔者在对H.264视频数据进行封装打包时,使用的是RTSP协议。RTSP(RealTimeStreamingProtocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输,使用RTCP完成相应的控制操作。由于RTSP协议的实现比较复杂,笔者采样的是已有的开源第三方RTSP应用库“Live555”,Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。Live555结构设计合理,功能强大,扩展移植能力强,已经成功应用于多款播放器的流媒体播放功能的实现,如VLC(VideoLan)、MPlayer、QuickTimePlayer。Live555项目的源码包括四个基本的库、测试代码及MediaServer。四个基本库分别是:UsageEnvironment&TaskScheduler、groupsock、liveMedia、BasicUsageEnvironment,而笔者要使用的正是这四个基本库。在使用Live555前我们要做以下工作:(1)Live555的下载进入网站http://www.live555.com/liveMedia/public/,选择“live555-latest.tar.gz”并下载,入下图所示:图3-6(2)基本库的提取在Live555的源码目录下,复制出“BasicUsageEnvironment”,“groupsock”,“liveMedia”,“UsageEnvironment”四个文件夹,如下图所示:图3-7Live555基本类的目录视图把“live”目录复制至源代码中。(3)头文件路径的导入由于live555基本库文件众多,然而库文件之间的引用都是文件名,所以为了能让编译器找到这些文件,我们要导入头文件的路径。步骤一:进入Eclipse建立的C++工程的选项菜单:图3-8步骤二:点击上图菜单中的“Add”按钮,添加路径:图3-9步骤三:点击上图菜单中的“Workspace”按钮,选择路径:图3-10依次导入“BasicUsageEnvironment”,“groupsock”,“liveMedia”,“UsageEnvironment”四个文件夹下的“include”文件夹即可。(4)Live555基本库的使用我们在我们编写的程序中通过引用“liveMedia.hh”,“BasicUsageEnvironment.hh”,“GroupsockHelper.hh”即可:图3-113.2.4软件集成在本章的3.2.1和3.2.2小节,我们已经成功的采样到了YUV420格式的视频数据,并且能压缩成H.264图像帧,现在接下来最关键的是各程序模块的组装和RTSP协议的封包。笔者的方案是新建一个类WebcamOndemandMediaSubsession继承自OnDemandServerMediaSubsession,来处理会话任务;新建一个WebcamFrameSource继承自FramedSource,来产生图像数据。在Main函数内,代码如下:图3-12主函数截图在主函数内有以下几个重要步骤:(1)新建“TaskScheduler”和“UsageEnvironment”对象用于事件的调度,实现异步读取事件的句柄的设置以及错误信息的输出;(2)新建“RTSPServer”对象用于构建一个RTSP服务器,该类其内部定义了一个RTSPClientSession类,用于处理单独的客户会话;在“RTSPServer”对象创建过程中:先建立Socket(ourSocket)在TCP的1234端口进行监听,然后把连接处理函数句柄(RTSPServer::incomingConnectionHandler)和socket句柄传给任务调度器(taskScheduler)。(3)新建“ServerMediaSession”类用来处理会话中描述,它包含多个(音频或视频)的子会话描述(ServerMediaSubsession)。该对象在建立时,绑定了“UsageEnvironment”对象;通过其“addSubsession”方法,又把新建的“WebcamOndemandMediaSubsession”的对象与之绑定。(4)“RTSPServer”对象通过“addServerMediaSession”方法把“ServerMediaSession”绑定。(5)调用“TaskScheduler”对象的“doEventLoop”方法;主程序开始进入任务调度器的主循环(doEventLoop),在主循环中调用系统函数select阻塞,等待网络连接。(6)当RTSP客户端输入(rtsp://192.168.0.232:1234/webcam)连接服务器时,select返回对应的scoket,进而根据前面保存的对应关系,可找到对应处理函数句柄。在incomingConnectionHandler中创建了RTSPClientSession,开始对这个客户端的会话进行处理。(7)“WebcamFrameSource”被建立,调用其构造函数:图3-13WebcamFrameSource构造函数截图在该构造函数内,摄像头和硬件编码器被打开、初始化;并返回句柄。然后其“doGetNextFrame”被调用,其函数原型如下:图3-14doGetNextFrame函数截图在该函数内,“WebcamFrameSource”的公用函数“getNextFrame”被“TaskScheduler”绑定,这样“TaskScheduler”将循环执行“getNextFrame”函数。(8)在“WebcamFrameSource”对象的“getNextFrame”函数内,又简单的调用了“getNextFrame1”函数,其原型如下:图3-15getNextFrame1函数截图在“getNextFrame1”函数内,摄像头图像被采集并进行H.264编码,然后使用“memmove”把数据复制到“fTo”内存指针,这样数据就通过网络被送出去了。第四章系统调试4.1硬件调试本设计使用的是嵌入式Linux开发平台,硬件使用的是购买的飞凌OK6410开发板,不存在硬件设计工作,这里的硬件调试主要讲解开发板系统软件环境的搭建和对开发板的基本操作使用。(1)参考购买开发板随机配送的光盘里面的用户使用手册,按照次序依次把光盘里面的U-boot,Linux内核,yaffs文件系统烧写进开发板NandFlash即可。在重启开发板后用串口连接开发板,在“SecureCRT”工具内,输入“vi/etc/eth0-setting”打开网络配置文件,修改成以下内容:图4-1网络配置修改截图保存修改后的配置文件并退出,重启开发板,并插上网线;这时把PC的局域网IP地址改成与开发板处于同一网段,在windows下使用“ping”命令测试是否能通过网络访问开发板,如果访问成功,那么进行下一步工作。(2)打开虚拟机,进入Ubuntu系统,在终端内使用telnet工具,如下图所示:图4-2使用Telnet工具控制开发板示意图这样就通过网络进入开发板终端,这样就可以很方便控制开发板。4.2软件调试4.2.1NFS配置在4.1节,我们通过网络就能进入开发板的终端,这样控制开发板就非常方便了,但是如果要共享文件,比如说把程序复制到开发板通常要使用移动优盘,这样要经常插拔很是麻烦,而使用NFS映射的话,PC上的某个目录就可以通过网络映射在开发板文件系统的节点上,使用起来就像是开发板上的一个文件夹,很是方便。以下便是配置过程:1、安装UbuntunfsUbuntu上默认是没有安装Ubuntunfs服务器的,因此我们首先安装Ubuntunfs服务器端:$sudoapt-getinstallnfs-kernel-server2、配置/etc/exportsUbuntunfs允许挂载的目录及权限在文件/etc/exports中进行了定义。例如,我们要将根目录下的“home”目录共享出来,那么我们需要在/etc/exports文件末尾添加如下一行:/home*(rw,sync,no_root_squash)其中:/home是要共享的目录,*代表允许所有的网络段访问,rw是可读写权限,sync是资料同步写入内存和硬盘,no_subtree_check是Ubuntunfs客户端分享目录使用者的权限,如果客户端共享“home”目录的子目录时,nfs不检查父目录的权限(默认)。3、Ubuntunfs重启服务$sudo/etc/init.d/portmaprestart$sudo/etc/init.d/nfs-kernel-serverrestart4、测试Ubuntunfs此时可以运行以下命令来显示一下共享出来的目录:$showmount-e或者可以使用以下命令把它挂载在本地磁盘上,例如将/home挂载到/mnt下:$sudomount-tnfslocalhost:/home/mnt可以运行df命令查看是否挂载成功。查看后可以使用以下命令卸载:$sudoumount/mnt4.2.2测试程序在调试程序时,笔者采用NFS方式进行“在线”调试,这些可以省去频繁的文件拷贝操作,可以实时修改程序,实时调试程序。在前面4.1和4.2.1笔者已经讲述了telnet工具的使用,NFS的配置,接下来讲述使用这些工具对程序的调试:(1)在前面的准备工作完毕后,启动开发板,连上网线,通过telnet工具进入开发板终端,输入命令“mount-tnfs-otcp,nolock,hard,i
/
本文档为【远程视频监控系统毕业论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索