毕业设计(论文)成绩评定书.doc

基于Android手机的无线视频监控

收藏

压缩包内文档预览:
预览图
编号:36648757    类型:共享资源    大小:7.30MB    格式:ZIP    上传时间:2020-01-03 上传人:遗**** IP属地:湖北
25
积分
关 键 词:
基于 Android 手机 无线 视频 监控
资源描述:
基于Android手机的无线视频监控,基于,Android,手机,无线,视频,监控
内容简介:
长安大学毕业设计(论文)开题报告表课题名称基于Android手机的无线视频监控课题来源自选课题课题类型工程设计指导教师冯兴乐学生姓名崔静学 号2403100126专 业电子信息工程一课题的意义:当今的世界已经开始进入飞速发展的信息时代,信息产业已经成为国民经济的主导产业了,通信技术则成为信息产业中发展进步最快,最迅速的行业。与此同时人们对于安全保障的要求也越来越高,基于嵌入式移动终端设备和无线网络的远程视频监控已经成为监控研究领域的热点。传统的视频采集和传输虽然性能稳定,技术成熟,但在实际应用中存在一些不足:(1)视频采集传输设备比较复杂,线路固定,成本及维护费用昂贵。(2)受地域限制等当今通过采取嵌入式技术,不但实现了视频监控系统的体积微小化、安装简单化、配置灵活化、而且降低了成本。由于将视频压缩和网络功能集中到了体积较小的嵌入式设备内,通过网络对视频监控设备进行远程监控,即可获取监控视频。目前,网络视频监控已经不再是企业级客户的应用,视频监控应用将逐渐向平民化方向发展,利用视频监控的数据为大众服务,如数字化矿工系统、交通导航、旅游景点人流及景点查看。网络视频监控系统采用现有的网络系统,由嵌入式的视频服务器和视频终端组成。嵌入式系统凭借其以应用为中心和系统可裁剪等优点在工业领域中有着广泛的应用。Android作为系统式基于Java的嵌入式操作系统,运行在Linux内核的移动终端设备之上,系统小巧而且拥有全特征。本课题提出一种基于Android平台的无线局域网络视频监控系统方案,不仅为人们的生活带来极大的便利,而且具有良好的发展前景。二 国内外发展状况:在国内外市场上,主要推出的是数字控制的模拟视频监控和数字视频监控两类产品。前者技术发展已经非常成熟、性能稳定,并在实际工程应用中得到广泛应用,特别是在大、中型视频监控工程中的应用尤为广泛;后者是新近崛起的以计算机技术及图像视频压缩为核心的新型视频监控系统,该系统解决了模拟系统部分弊端而迅速崛起,但仍需进一步完善和发展。目前,视频监控系统正处在数控模拟系统与数字系统混合应用并将逐渐向数字系统过渡的阶段。(1)模拟视频监控系统,也可以称为第一代视频监控系统,出现于20世纪90年代初期,主要由摄像机、视频矩阵、监视器、录像机等组成。该监控系统以模拟方式采用同轴电缆进行传输,传输距离不能太远,而且信号质量不高,主要用于扩展能力有限的小范围内监控系统,一般只能在控制中心进行查看,并且系统的成本高。(2)20世纪90 年代中期,随着视频压缩编码技术的不断发展产生了基于PC 机的第二代视频监控系统。在远端视频监控现场,通过若干个摄像头、各种检测、报警探头以及数据处理设备,首先将摄像头采集到的模拟视频信号转化成数字信号,再利用专用压缩卡对数字信号进行压缩处理,通过各自的数据传输通道,与多媒体监控终端PC 机连接,监控终端的PC 机对视频数据进行解压后,就能够显示远端的图像。基于PC 的视频监控系统与传统的模拟视频监控系统相比,具有图像质量高、应用灵活活性好、传输距离远、数据的保存成本低等特点,并且数字化的视频数据可以通过各种方式被连接在网络计算机上共享。因此,基于PC 的视频监控系统自出现后被广泛应用,但是该系统也存在很多不足,稳定性较差、结构相对复杂、体积较大、可扩展性差。(3)到了20 世纪90 年代末特别是近几年来,由于网络带宽、计算机处理能力和存储内存等的迅速提高,以及各种实时视频信息处理技术的出现,加速了第三代视频监控系统,即基于嵌入式技术的网络视频监控系统的出现。基于嵌入式技术的网络视频监控系统将嵌入式技术引入到视频技术中,可以很好地解决基于PC 的视频监控系统中存在的问题。基于嵌入式技术的网络视频监控系统的主要工作原理是:采用嵌入式实时操作系统,将摄像机传送来的视频信号数字化后由高效压缩芯片压缩,通过内部总线传送到内置的服务器。与基于PC的视频监控系统相比基于嵌入式技术的视频监控系统具有体积小,安装方便,备置灵活,成本低,稳定性高等特点。因此,基于嵌入式技术的网络化视频监控系统必将有良好的应用与发展前景。三 本课题的研究内容、方法、手段及预期结果:3.1本课题研究内容(1)掌握Android开发平台。(2)Android手机内的文件存储和提取。(3)Android手机的多媒体播放,利用Android手机camera来录制视频。(4)Java下的socket通信。3.2本课题研究方法与手段:(1)通过互联网和相关书籍搭建Android开发平台。(2)翻阅相关书籍,了解不同视频的录制方法,制定我的视频录制方法。(3)画出该应用程序的流程图,然后编写代码的整体框架使之可以大体完成,所需要求。 3.3本课题的预期结果:(1)熟悉掌握Android应用程序的开发流程,并学会开发一些简单的应用软件。(2)了解并掌握socket编程原理,能够运用socket正确编写出符合要求的网络应用程序(3)掌握Android手机的内存访问。(4)该应用程序可以实现视频实时监控功能。四进度安排序号 设计(论文)各阶段名称 日期(教学周)(1) 查找相关资料,完成开题报告 3月1日-3月14日 (第1-2周) (2) 了解常见的视频录制方法 3月15日-3月28日 (第3-4周)(3) 系统整体框架的设计 3月29日-4月11日 (第5-6周)(4) 撰写论文 4月12日-5月9日 (第7-10周)(5) 完善论文 5月10日-5月16日 (第11周)(6) 准备答辩 5月17日-6月10日 (第12-14周)五完成任务所具备的条件因素:(1)老师悉心的指导和帮助;(2)老师提供设备、实验室等各方面优越的条件;(3)对本课题的浓厚的兴趣; 指导教师意见及建议: 指导教师签名: 年 月 日注:1、课题来源分为:国家重点、省部级重点、学校科研、校外协作、实验室建设和自选项目;课题类型分为:工程设计、专题研究、文献综述、综合实验。 2、此表由学生填写,交指导教师签署意见后方可开题。 毕业设计任务书课题名称 基于Android手机无线视频监控 学 院 信息工程学院 专 业 电子信息工程 班 级 24031001 学生姓名 崔静 学 号 2403100126 3 月 1 日至 6 月 17 日共 14 周指导教师(签字) 教学院长(签字) 2014年 3月 3日一、设计内容本文这要实现的是基于Android开发平台的视频监控系统的设计与研究,该监控系统集中运用了嵌入式技术、图像编码技术、网络传输技术,Java编程等诸多方面的知识。在初步了解嵌入式系统理论知识的基础上,对Android操作系统作了较为深入的学习,在pc上应用Eclipse的ADT插件以及SDK对Android手机客户端进行开发。手机客户端实现使用Android手机摄像头进行图像数据的获取,经过压缩,利用socket通信把数据实时的发送到电脑服务端进行实时播放。Pc服务端通过向JFrame添加Jpanel组件,通过Jpanel组件来实现图片的动态显示,达到监控的目的。2、 设计原始资料1. Java语言基础;2. 各类视频录制的方法;3. Android手机的文件存储方法;4. Socket通信的基础知识。三、设计完成后提交的文件和图表1. 计算说明书部分:无2、 图纸部分:1.实物操作说明图四、毕业设计进程安排:序号 设计(论文)各阶段名称 日期(教学周)1 查找相关资料,完成开题报告 3月1日-3月14日(第1-2周) 2 了解常见的视频录制方法 3月15日-3月28日(第3-4周)3 系统整体框架的设计 3月29日-4月11日(第5-6周)4 撰写论文 4月12日-5月9日 (第7-10周)5 完善论文 5月10日-5月16日(第11周)6 准备答辩 5月17日-6月10日(第12-14周)五、主要参考资料1 靳岩,姚尚朗.Google Android开发入门与实战M.北京:人民邮电出版社,2010:P1-120.2 杨文志.Google Android程序设计指南M.北京:电子工业出版社,2009:P1-23.3 关东升,赵志荣.Android开发案例驱动教程M.北京:机械工业出版社,2012:P23-45.4 张思明.Android应用程序设计M.北京:清华大学出版社,2013:P1-57.5 Google API大全编委会.Google API大全M.北京:电子工业出版社,2009:P1-110.6 余志龙.Android SDK开发范例大全M.北京:人民邮电出版社,2009:P45-89.7 王东华.Android开发实例大全M. 北京:电子工业出版社,2012:P1-56.8 韩敬海. Android程序设计M. 北京:电子工业出版社,2012:P1-46.9 熊斌. Android多媒体开发技术实战详解M. 北京:电子工业出版社,2012:P1-78.10 GONG Lei,ZHOU Cong.Development and Research of Mobile Termination Application Based on AndroidJ. Computer &Modernization. 2008.8(1):P1-20.11 Enck,W., Ongtang,M.,McDaniel,P. Understanding Android SecurityJ. Security & Privacy, IEEE.2009,7(1):P50-57. 12 Sandeep Kumar. Location Based Services using AndroidC. Internet Multimedia Services Architecture &Applications (IMSAA), 2009 IEEE International Conference. P1-5.13 罗伟Android平台的即时通讯系统的研究与实现D硕士学位论文.湖南师范大学,2008:P2-14.14 黄舜.基于Android平台的手机软件开发.学士学位论文.浙江师范大学.2012:P8-10.15 Enck,W., Ongtang,M.,McDaniel,P. Understanding Android SecurityJ. Security & Privacy, IEEE.2009,7(1):P50-57.16 RetoMeier Professional.Android Application developmentM.USA:Weox,2010:P1-13.17 韩超.Android系统原理及开发要点详解M.北京:电子工业出版社,2010:P34-57.18 赵亮,张维.基于Android技术的界面设计与研究J.电脑知识技术,2009:P45-169.19 马越.Android的架构与应用D.北京,中国地质大学,2008:P1-5.20 姚一文.基于Android的移动学习终端平台的开发与研究D.中南大学,2008:P12-78.21 Jerome(J.F.)DiMarzio.AndroidTMA Programmer GuideM.London,2009:P1-23.22 李亮.Android系统开发问题杂谈J.程序员,2009:P1-9.23 张岩.基友Java手机平台移动多媒体系统的设计与实现.哈尔滨工业大学,2006:P2-34.24 谢涛.基于视频压缩标准H.264编码器的实现与优化.浙江大学硕士学位论文,2006:P1-10025 公磊,周聪.基于Android的移动终端应用程序开发与研究J.计算机与现代化,2008:P2-34.装订线基于Android手机的无线视频监控二 一 四 届 毕 业 设 计基于Android手机的无线视频监控 学 院:信息工程学院专 业:电子信息工程姓 名:崔静学 号:2403100126指导教师:冯兴乐完成时间:2014年6月10日 二一四年六月摘 要随着无线网络技术、流媒体技术以及视频压缩技术的进步,视频监控系统的应用已经日益广泛和深入了。基于Linux操作系统的Android系统如今已经非常流行与稳定,并且它在监控领域也得到了很好的发展。本文设计了基于Android手机和无线局域网的远程监控系统,可以利用Android手机的摄像头即时采集图像信息并实时传送到PC服务端,PC服务端就可以对远端进行监控。本文设计了在Android手机客户端通过实现Camera.PreviewCallback接口,在其onPreviewFrame重载函数里面获取摄像头当前图像数据,然后通过无线网络传输把图像信息传送到服务器。PC端服务器采用Java语言编写,通过监听相应的端口,再获取数据后进行相应的命令解析和图像数据还原,然后将图像数据传递至ImagePanel控件中用于显示。通过这些基本的操作,就可以达到无线视频监控的目的。关键词 Android操作系统,无线网络,监控 ABSTRACTWith the development of wireless network technology, streaming media technology and video compression, the application of video monitoring system is becoming widely and deeply.The Android system based on Linux operating system has been very popularly and stably, and it also has a good development in the field of monitoring.This article designs the Remote Video Monitoring System based on Android mobile phones and WLAN, which can use the Android mobile phones camera to capture image information and transmit to the PC Server in time, at the same time, PC Server can monitor the distance.This article by implementing Camera.PreviewCallback interface in the Android mobile client ,and in its onPreviewFrame overloaded function to get the cameras current data, and then sends the image information to the Server through the socket. The PC Server uses Java language, by listening to the corresponding port to get the data and does some corresponding command to restore the image data, and then transmits the image data to the ImagePanel to display. Through this basic operation, we can realize the purpose of wireless video monitoring.KEY WORDS Android Operating System, wireless network, monitoring目 录第一章绪论11.1课题背景及意义11.2国内外发展现状和趋势11.3本文的设计思路2第二章 Android手机无线视频监控相关技术介绍32.1 Android手机开发平台32.1.1 Android手机开发平台基本介绍32.1.2 Android应用程序构成分析52.1.3 Android的API102.1.4 Android平台的优势112.2 Java Swing112.3 Socket网络通信12第三章 Android手机无线视频监控的设计与实现143.1界面设计143.1.1手机端界面设计143.1.2 PC服务端界面设计183.2视频数据采集与处理203.2.1视频数据采集过程203.2.2 YUV和RGB简介223.2.3 Android SurfaceView技术说明223.3无线视频传输实现233.3.1无线视频传输方式的选择233.3.2网络通信模块实现253.4 PC端视频播放模块设计273.5课题结果展示30总结与展望34参考文献与资料35致谢36附录37第一章 绪论1.1课题背景及意义当今的世界已经开始进入飞速发展的信息时代,信息产业已经成为国民经济的主导产业了,通信技术则成为信息产业中发展进步最快,最迅速的行业。与此同时人们对于安全保障的要求也越来越高,基于嵌入式移动终端设备和无线网络的远程视频监控已经成为监控研究领域的热点。传统的视频采集和传输虽然性能稳定,技术成熟,但在实际应用中存在一些不足:(1)视频采集传输设备比较复杂,线路固定,成本及维护费用昂贵。(2)受地域限制等当今通过采取嵌入式技术,不但实现了视频监控系统的体积微小化、安装简单化、配置灵活化、而且降低了成本。由于将视频压缩和网络功能集中到了体积较小的嵌入式设备内,通过网络对视频监控设备进行远程监控,即可获取监控视频。目前,网络视频监控已经不再是企业级客户的应用,视频监控应用将逐渐向平民化方向发展,利用视频监控的数据为大众服务,如数字化矿工系统、交通导航、旅游景点人流及景点查看。网络视频监控系统采用现有的网络系统,由嵌入式的视频服务器和视频终端组成。嵌入式系统凭借其以应用为中心和系统可裁剪等优点在工业领域中有着广泛的应用。Android作为系统式基于Java的嵌入式操作系统,运行在Linux内核的移动终端设备之上,系统小巧而且拥有全特征。本课题提出一种基于Android平台的无线局域网络视频监控系统方案,不仅为人们的生活带来极大的便利,而且具有良好的发展前景。1.2国内外发展现状和趋势在国内外市场上,主要推出的是数字控制的模拟视频监控和数字视频监控两类产品。前者技术发展已经非常成熟、性能稳定,并在实际工程应用中得到广泛应用,特别是在大、中型视频监控工程中的应用尤为广泛;后者是新近崛起的以计算机技术及图像视频压缩为核心的新型视频监控系统,该系统解决了模拟系统部分弊端而迅速崛起,但仍需进一步完善和发展。目前,视频监控系统正处在数控模拟系统与数字系统混合应用并将逐渐向数字系统过渡的阶段。(1)模拟视频监控系统,也可以称为第一代视频监控系统,出现于20世纪90年代初期,主要由摄像机、视频矩阵、监视器、录像机等组成。该监控系统以模拟方式采用同轴电缆进行传输,传输距离不能太远,而且信号质量不高,主要用于扩展能力有限的小范围内监控系统,一般只能在控制中心进行查看,并且系统的成本高。(2)20世纪90年代中期,随着视频压缩编码技术的不断发展产生了基于PC 机的第二代视频监控系统。在远端视频监控现场,通过若干个摄像头、各种检测、报警探头以及数据处理设备,首先将摄像头采集到的模拟视频信号转化成数字信号,再利用专用压缩卡对数字信号进行压缩处理,通过各自的数据传输通道,与多媒体监控终端PC 机连接,监控终端的PC 机对视频数据进行解压后,就能够显示远端的图像。基于PC 的视频监控系统与传统的模拟视频监控系统相比,具有图像质量高、应用灵活性好、传输距离远、数据的保存成本低等特点,并且数字化的视频数据可以通过各种方式被连接在网络计算机上共享。因此,基于PC 的视频监控系统自出现后被广泛应用,但是该系统也存在很多不足,稳定性较差、结构相对复杂、体积较大、可扩展性差。(3)到了20 世纪90 年代末特别是近几年来,由于网络带宽、计算机处理能力和存储内存等的迅速提高,以及各种实时视频信息处理技术的出现,加速了第三代视频监控系统,即基于嵌入式技术的网络视频监控系统的出现。基于嵌入式技术的网络视频监控系统将嵌入式技术引入到视频技术中,可以很好地解决基于PC 的视频监控系统中存在的问题。基于嵌入式技术的网络视频监控系统的主要工作原理是:采用嵌入式实时操作系统,将摄像机传送来的视频信号数字化后由高效压缩芯片压缩,通过内部总线传送到内置的服务器。与基于PC的视频监控系统相比基于嵌入式技术的视频监控系统具有体积小,安装方便,备置灵活,成本低,稳定性高等特点。视频监控系统的发展方向随着视频监控系统的逐渐发展,监控前端一体化、视频数字化、监控网络化、系统集成化成为视频监控系统公认的发展方向,而数字化是网络化的前提,网络化则又是系统集成化的基础,所以,视频监控系统发展的最大两个特点就是数字化和网络化。(1)监控系统数字化监控系统数字化是21 世纪的显著特征,是以信息技术为核心的电子技术发展的必然。视频监控系统的数字化是将系统中信息流(包括视频、音频、控制等)从模拟状态转为数字状态,从根本上改变视频监控系统信息采集、数据处理、传输、系统控制等方式和结构形式。信息流的数字化、编码压缩、协议的开放化,使视频监控系统与安防系统中其它各子系统间实现无缝连接,并在统一的操作平台上实现管理和控制,这也是系统集成化的含义。(2)监控系统网络化视频监控系统的网络化意味着系统的结构将由集总式向集散式系统过渡。集散式系统采用多层分级的结构形式,具有微内核技术的实时多任务、多用户、分布式操作系统以实现抢先任务调度算法的快速响应。组成集散式监控系统的硬件和软件采用标准化、模块化和系列化的设计,系统设备的配置具有通用性强、开放性好、系统组态灵活、控制功能完善、数据处理方便、人机界面友好以及系统安装、调试和维修简单,系统运行互为热备份,容错可靠等优点。系统的网络化打破了布控区域和设备扩展的地域和数量界限。系统网络化将使整个网络系统硬件和软件资源的共享以及任务和负载的共享变为可能,这也是系统集成的一个重要概念。1.3本文的设计思路本文实现的是基于Android开发平台的视频监控系统的设计与研究,该监控系统集中运用了数据存储技术、嵌入式技术、图像编码技术、网络传输技术,Java编程等诸多方面的知识。在初步了解嵌入式系统理论知识的基础上,对Android操作系统作了较为深入的学习,在电脑上应用Eclipse的ADT插件以及SDK对Android手机客户端进行开发。手机客户端实现使用Android手机摄像头进行图像数据的获取,经过压缩,利用socket通信把数据实时的发送到电脑服务端进行实时播放。PC服务端通过向JFrame添加Jpanel组件,通过Jpanel组件来实现图片的动态显示,达到监控的目的。第二章 Android手机无线视频监控相关技术介绍2.1 Android手机开发平台2.1.1 Android手机开发平台基本介绍Android开发平台是一个开源而且免费的手机平台,一个Linux内核、多操作、多线程的OS。Android不是一个驱动或者产品,开发者能够自定义DVR、GPS、MP3player等应用程序。下面介绍一下Android平台的技术架构。 Android平台技术架构Android平台采取了软件叠层的架构,由低到高一共分为四部分:Linux内核层,中间层,应用程序框架,应用层,如图2.1所示。 图2.1 Android平台架构aLinux内核层:该层是比较基础,包括各种驱动,并提供操作系统的内存管理、进程(Process)管理、执行线程(Thread)管理等基本功能。b中间层:包含程序库和Android运行时环境。c应用程序框架:该层是编写核心应用所使用的API框架,开发者可以使用这些框架来开发自己的应用,但必须遵守该框架的开发原则。d应用层:依据User的期望而将AF的组件及Library组件组合而成的高级服务。该层是各种应用软件,包括通话、短信、日历、地图、浏览器等核心应用程序,这些应用程序都是使用Java编写的。 Android架构分析Android核心为嵌入式Linux2.6作业系统,向上搭配Google为Android开发的类库及Android运行时。在开发应用程序时,应用程序架构内已经具备多种不同的基础组件,就可以直接调用这些组件来使用,可以节省开发应用程序的心力及时间。Android系统内核采用Linux2.6以上版本,是硬件和软件之间的抽象层,主要用于保障进程管理、安全性、内存管理和驱动模型等。Android对操作系统的使用包括核心和驱动两部分,驱动包括一些与移动设备相关的驱动程序,如显示驱动,Flash内存驱动,相机驱动,音频驱动,视频驱动,WiFi驱动,键盘驱动,蓝牙驱动,电源管理等。应用程序框架:开发者可以访问Android应用程序框架中的API,该应用程序架构简化了组件的重用,任何一个应用程序都可以发布它的功能块,并且任何其他的应用程序都可以使用这些发布的功能块。同样,该应用程序的重用体制也使用户可以方便的替换程序组件。Android提供一系列的服务和管理器,其中包括以下内容。a一套强大和可扩展的视图系统:用来建构一个应用程序的基本组件,包括列表、网格。b内容提供器:使得应用文本框、按钮、web浏览器等,这些视图可以用来构建应用程序。程序可以访问另一个应用程序的数据,或者可以共享他们自己的数据;c资源管理器:提供非代码资源的访问,例如本地字符串、图形和布局文件等;d通知管理器:使得应用程序可以在状态栏中显示自定义的提示信息;e活动管理器:用来管理应用程序的生命周期,并且提供常用的导航回退功能。例如:启动应用程序要用到的资源准备及关闭应用程序时释放内存及相关资源等工作。f视窗管理器:用来管理所有启动程序的视窗。g位置管理器:用来管理地图服务的相关功能。h电话管理器:用来管理用户拨打与接听电话的相关功能。i包管理器:管理所有安装在Android系统内的包。Android程序库:Android包含一个能被Android系统中各种不同组件所使用的CC+库,该库通过Android应用程序框架为开发者提供服务,主要包括以下内容。 a系统C库:一个从BSD继承的标准C系统函数库,是专门基于嵌入式Linux设备定制的;b媒体库:该库支持多种常用的音频、视频格式文件的回放和录制,同时支持静态图像文件,编码格式包括MPEG4、H.264、MP3、AAC、AMR、JPG和PNG等; cSurface Manager:管理显示子系统,并且为多个应用程序提供2D和3D图层的无缝融合; dSGL:底层的2D图形引擎; e3D库:该库可以使用3D硬件加速或者使用高度优化的3D软加速; fFree Type:用于位图和矢量字体显示; gWeb Kit:Android内建的浏览器,是以Web Kit的浏览引擎为基础所开发成的。Wed Kit是一个开源浏览器网页排版引擎,配合Android手机的功能,可以在浏览网页时,达到更好的效果,例如:局部性的缩放网页上的资讯、触控式的操作等效果。 hSQLite库:SQLite是一个用于本地存储的、轻型关系型数据库引擎。SQLite提供结构化的数据存取。目前已经在很多嵌入式产品中使用了它,它占用的资源非常低。它无需安装和管理配置,同时它还支持事务功能和并发处理等等。SQLite也是一套开放性的关联式资料库,其特点在于轻量性方面的设计结构,更适合在手机上使用。 iSSL:中文名为“安全套接层协议层”,它是网景公司提出的基于WEB应用的安全协议。SSL协议指定了一种在应用程序协议(如HTTP、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。SSL协议位于TCP协议与各种应用层协议之间,为数据通讯提供安全支持。 SSL协议可分为两层:SSL记录协议:它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议:它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL协议提供的服务主要有:a认证用户和服务器,确保数据发送到正确的客户机和服务器;b加密数据以防止数据中途被窃取;c维护数据的完整性,确保数据在传输过程中不被改变。Android运行时的组件:Android运行时环境由一个核心库和Dalvik虚拟机组成。核心库Java编程语言核心库的大多数功能。虽然Android是用Java语言来开发、撰写应用程序,但不使用Java运行时组件来执行Java程序,而是用Android自有的Android Runtime来执行。而Android Runtime有俩个重要的组件,一是Core Libraries-核心函数库,另一个则是Dalvik Virtual Machine-Dalvik虚拟机器。它在保证API方面的兼容的同时,针对移动手机进行了大幅优化,占用资源更小,运行效率更高。每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成在一个设备中可以同时有效地运行多个虚拟系统,它依赖于Linux内核的一些功能,如线程机制和底层内存管理机制等。所有的类有Java编译器编译,最后由Dalvik虚拟机执行。2.1.2 Android应用程序构成分析Activity简介Activity是四个Android构造块中最基本的组件。一个Activity通常是一个单独的屏幕。每一个Activity作为一个独立的类来实现,均继承自Activity基类。您的Activity类将显示一个由若干Views控件组成的用户界面并对事件做出响应。大多数应用程序包含多个屏幕。举例来说,一个文本消息应用程序也许会有一个屏幕,用来显示联系人列表,第二个屏幕用来编辑短消息,还有用来浏览历史消息或者用来更改设置的屏幕。每一个这样的屏幕都将作为一个Activity。切换屏幕是通过打开一个新的Activity来实现的。在一些实例中,一个Activity会将返回值返回给前一个Activity,比如,一个允许用户选择图片的Activity将返回选中的图片到调用方。在Activity类中将使用setContentView()方法来显示由视图控件组成的用户界面,并对通过这些视图控件所触发的事件做出相应Android会把每个从主菜单打来的程序保留在堆栈中。当打开一个新屏幕时,之前的屏幕会被置为暂停状态并且压入历史堆栈中;在包含多个Activity类的情况下,这些Activity可以通过一个Activity栈来进行管理,当一个新的Activity启动的时候,它首先被放置在Activity栈顶并成为运行状态的Activity,之前正在运行的Activity也在栈中,将被保存在新的Activity后边,只有当这个Activity推出以后,之前的Activity才能重回到前台界面。Activity生命周期Activity具有生命周期,由Android框架进行管理,而不是由应用程序直接控制。通常,每一个应用程序,都会占据一个进程。当系统内存即将不足的时候,会依照优先级自动进行进程的回收。不管是使用者或开发者,都无法确定应用程序何时会被回收。Activity生命周期的几个过程:如图2.2所示启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。 图2.2 Activity生命周期 Intent Receive使用Intent Receiver可以使自己的应用程序响应外部事件,比如数据网络可用,晚上时,电话呼入。Intent Receiver 可以使用NotificationManager来提醒用户一些他们可能感兴趣的消息,但并不显示用户界面。Intent Receiver在Androidmanifest.xml中完成注册,也可以通过Context.registerReceiver()在自己的代码中完成注册。系统会在您需要的时候启动你的应用程序,Intent Receiver 被触发时,自己的应用程序不必调用Intent Receiver。也可以通过将自身的intent广播给其他的应用程序。ServerServer组件分为本地和远程两种类型,其中远程的Server是Android平台基础,、如Android框架中的定位服务、音频服务、电话服务等都是通过远程Server实现的。Service是Android中另一个很重要的组件,它与broadcast Receiver都被称为非UI后台组件。Service不是用于与用户交互的组件,常见的例子如:音频播放器程序,再转到后台播放的时候它仍然能够保持歌曲播放;又如文件下载程序,他可以在后台执行文件的下载。本地Server是一种进程内的通信,与调用组件在一个应用中;远程Server,一般用于进程间通信,与调用组件不在一个应用中。与其他组件一样,Service也是运行在主线程中的。这意味着,如果Service要进行消耗CPU或者阻塞的操作,它意味着应该产生新的线程,在新的线程中进行这些工作。每个Service都必须在AndroidManifest.xml()和Context.bingService()在其他组件中启动。两种Service各自有不同的生命周期,但都继承了一个类:Android.app.Service类。Service的生命周期:本地Service要通过Context.startService()方法启动,Android会根据intent查找这个Service。然后调用它的onCreate()方法,然后调用它的onStart(intent ,int)方法,客户端数据可以通过onStart方法发的intent参数传递给Service。Service开始运行直到客户端调用Context.stopService()或者Service调用stopSelf()方法,Service销毁的时候会调用onDestory(),可以再这个方法中释放一些资源。远程Service生命周期,在客户端组件中通过Context.bindService()方法启动远程Service,Android会根据intent查找这个Service比建立连接。接着就会调用它的onCreate()方法,然后在调用它的onBind(Intent intent)方法重新绑定这个Service。客户端调用unbindService(Service Connection)方法结束与Service的绑定,Service销毁的时候调用onDestroy(),可以再这个方法中释放一些资源。见图2.3所示:图2.3 Server远程和近程服务 Content ProviderAndroid系统是基于Linux的,对于文件的访问权限控制很严格,不同的用户启动不同的应用,不同的应用之间的访问就是不同用户之间的访问。由于权限的限制,不同应用之间无法互相访问数据,访问模型如图2.4所示。Android平台提供了一种共享数据技术Content Provider ,Content Provider能够实现不同应用之间的数据共享,使用Content Provider 访问如图2.5所示。Content Provide除了能够实现数据共享外,还可以提供一定程度上的数据抽象,并提供一个访问接口,使上层调用者不用关心下层数据存储的实现环节。这与DAO接口很相似,Content Provide屏蔽了数据存储细节。Android系统提供了很多Content Provider,这些Content Provider包括多媒体音频文件、视频文件、联系人、短信访问、图片、电话记录。除了这些Android内置的Content Provider 以外,我们自己也可以定义Content Provider。图2.4不同用户之间的访问图2.5使用Content Provider访问2.1.3 Android的APIAndroid API主要又以下几个部分组成:AndroidManifest.xml Android系统开放了很多底层应用提供用户调用,与其他系统不同,Android系统具有自己特殊的调用底层的方式。因此,它需要通过某种方式设置Activity许可才可以运行相应的应用。AndroidManifest.xml是系统控制文件,它通知系统该如何处理所创建的所有的应用组件。在AndroidManifest.xml中它可以配置应用程序的权限,这种方式提供了程序使用系统应用的安全性的保证,底层应用只有用相应的权限允许才可能被用户程序使用,不然程序运行出现错误。 Android系统提供了很多许可,用户使用相应的底层服务的时候,需要在AndroidManifest.xml中添加相应的权限就可。如允许程序打电话,允许程序获取网络状态信息等等。活动 活动是最基本的Android应用程序组件。在应用程序之中,一个活动通常就是一个独立的屏幕。每个活动都通过继承活动的基类而被实现成为一个独立的活动类,活动类就会显示由视图控件组成的用户接口,然后对事件作出响应。 大部分的应用程序都是由多个屏幕显示组成的,这里的每个屏幕都将是一个活动,很容易实现从一个屏幕到另一个屏幕然后完成新的活动。Android会把每个从主菜单打开的程序保留在堆栈之中,用户就可以通过回退操作退回到之前打开过的屏幕,也能够选择性地移去一些没有必要保留的屏幕。视图 视图它可以将其自身绘制到屏幕之上。Android的用户界面由一系列的视图树构成,接口全部由一组以树的形式出现的视图组成的。开发者能够通过创建一个新的视图的方法来运用自定义的图形处理技术。Intent Intent是用来描述应用程序的功能的。它利用消息实现应用程序间的交互机制,就能够在程序运行的过程中连接两个不同的组件了。Intent描述了应用中一次操作的动作、数据和附加数据,向Android系统表达某种请求或者意愿,Android系统就会根据Intent描述的内容选择适当的组件来发起响应,并将Intent传递给这个组件,完成组件的调用。 与Intent相关的有两个类IntentFilter与IntentReceiver。当Intent请求做任意一个动作时,IntentFilter用于描绘一个活动或者广播接收器能够操作哪些Intent,而IntentReceiver可以使应用程序对外部事件做出相应。Intent之中两个最重要的部分为动作和动作对应的数据。典型的动作类型包括活动的查看、选取、编辑等,而动作对应的数据而是以URI形式表示。服务服务为Android应用程序中有较长的生命周期但是它没有用户界面的程序。它运行在后台,而且可以与其他程序进行交互。服务与活动的级别相似,但是它不能独立运行,而需要通过某一个活动来调用。 Android应用程序的生命周期是由Android系统来决定的,不是由具体的应用程序的线程来控制。如果应用程序要求在没有界面显示的情况还能正常运行,此时就需要用到Service了。通知 通知将以小图标的形式展现在状态栏里的,用户可以通过与图标的交互来接收消息。最常见的通知有短信息、通话记录和语音邮件,然而应用程序也可以创建它们自己的通知事件。内容提供者 Android应用程序可以运用文件或者SQLite数据库来存储数据,内容提供者提供了一个多应用之间数据共享的方式。当某个应用程序的数据需要和其他应用程序共享时,内容提供器就会发挥它作用。一个Content Provider类,实现一组标准的方法,它能够让其他的应用储存或者读取此内容提供器处理的各种各样数据类型,即一个应用程序能够通过实现一个Content Provider的抽象接口把自己的数据暴露出去。外界根本不能看,也不用看到该应用程序暴露的数据是如何储存的,外界可以通过这一套标准和统一的接口读取应用程序的数据,它也可以删除应用程序的数据。2.1.4 Android平台的优势Android与其他手机操作系统相比,Android 具有以下四大优点:开放性Android 与其它操作系统相比最大的特点在于其开放性。开放性包括两方面:其一,Android 以开源Linux 内核为基础,源代码开放、应用开发人才资源丰富其二,Android 对第三方软件开发的开放,极大的促进该系统第三方软件的开发。可移植性Android 系统具有良好的源代码可移植性和兼容性。Android 应用程序框架完全使用Java 编程语言,不仅编程简单且而可以实现跨平台运行。应用程序间平等且无界限系统的核心应用和第三方应用都是完全平等的开发人员可以把Web 上的数据与本地结合起来,应用程序也可以通过声明供其他应用程序使用。无缝结合的Google 应用Google 为Android 应用开发提供具有高效、简洁、节省资源的运行环境Dalvik虚拟机;完美免费的开放软件Google maps 也深受人们青睐,同时Google 服务还包括浏览器、邮件、语音等。2.2 Java SwingSwing采用了一种MVC的设计范式,即模型-视图-控制(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。此部分用来设计PC监控端的视频播放部分。 Swing外观感觉采用可插入的外观感觉。下图2.6为Swing组件类的层次图2.6 Swing组件类的层次Swing有俩种添加组件的方法: 第一种是用getContentPane()方法获得JFrame的内容面板,在这个内容面板上添加组件。第二种是创建一个中间容器,在这个容器中添加组件,再用setContentPane()方法把这个容器置为JFrame的内容面板。2.3 Socket网络通信Socket(套接字)是一种通信机制,可以实现单机或者在不同网络进行通信,它创建需要明确的区分C(客户端)/S(服务器端),并支持多个客户端连接到同一个服务器。有两种传输模式:(1)面向连接的传输:基于TCP协议,可靠性高,但效率低;(2)面向无连接的传输:基于UDP协议,可靠性低,但效率高;Android中,直接采用Socket通信应该是我们遇到的最低级的网络运用。尽管已经作了很大程度的抽象,但是纯粹的Socket通信,仍然给开发者留下很多细节需要处理,尤其在服务器端,开发者需要处理多线程以及数据缓冲等的设计问题。下图2.7为Socket通信流程图图2.7 Socket通信流程图第三章 Android手机无线视频监控的设计与实现3.1界面设计根据应用程序需要,应该有两部分界面设计一是PC端二是手机端,它们分别实现图像的获取和图像动画的播放。界面设计的目的要达到良好的用户体验,界面要干净而不过于简单、关注内容而非修饰、一致,吸引人,少量简介的变化、使用云端服务来加强用户体验。界面设计也是Android开发的一项重要工作,是一个应用程序是否能被大多数人接受的一个重要指标。使用户不知道内部构造也能够熟练的操作并使用这个产品。3.1.1手机端界面设计Android手机负责图像的采集、处理、传输,Android手机界面由两部分组成,一是登陆界面,包括服务端PC的IP地址输入、用户名输入、密码输入该部分,首先设置全屏:requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);然后使用一个自定义布局的AlertDialog(对话框),用getLayoutinflate.inflate方法的到我们要显示的R.layout.login的XML文件,再用builder.setView方法将取出的XML文件装载进对话框中。然后设计了登陆出错次数的限制,当一次密码或者用户名不正确的时候会提示输入不正确请重新输入,刚开始每次点击登陆后对话框就会消失,不能再次输入,查找资料知道用下面的程序就可以实现对话框不消失:tryField field = dialog.getClass().getSuperclass().getDeclaredField(“mShowing”);field.setAccessible(true);field.set(dialog,false);catch(Exception e)e.printStackTrace();当输入错误次数超过四次以后对话框才会消失用下面的程序:try Field field = dialog.getClass().getSuperclass().getDeclaredField(mShowing);field.setAccessible(true); field.set(dialog, true); catch (Exception e) e.printStackTrace();当输入用户名密码都正确的时候,点击登陆会出现是否记住密码的选项。记住密码是一个业务方法我们在工程里面新建一个包loginService,再创建一个工程 Service 在里面定义一个保存文件方法:public static boolean SaveInfoServer( Context context,String IP,String username,String password)try /getFilesDir() .帮我们找到安装目录/data/data/包名File fs1 = new File(context.getFilesDir(),info.txt);FileOutputStream fos = new FileOutputStream(fs1);/各项数据以# 分割fos.write(IP+#+username+#+password).getBytes();fos.close();return true; catch (Exception e) e.printStackTrace();return false;来保存文件到手机上,Android下每个应用程序都有自己特定的文件夹来保存自己的信息,所以我们可以运用context(上下文)的getFilesDir()来得到文件的存储文件夹然后在下次登陆的时候应用程序就会把文件读到登陆界面我们就可以直接登陆了,当然我们也可以修改保存信息这也定义了一个函数:public static Map getSaveInfoServer(Context context)File file = new File(context.getFilesDir(),info.txt);try FileInputStream fis = new FileInputStream(file);SuppressWarnings(resource)BufferedReader br = new BufferedReader(new InputStreamReader(fis);String str = br.readLine();String infos = str.split(#);Map map = new HashMap();/一一得到数据map.put(IP,infos0);map.put(username, infos1);map.put(password, infos2);return map; catch (Exception e) e.printStackTrace();return null;为了更加完善用户体验,我们又增加了一个public static boolean checkInfoServer(Context context,String ipname,String pUsername,String Password)File file = new File(context.getFilesDir(),info.txt);try FileInputStream fis = new FileInputStream(file);BufferedReader br = new BufferedReader(new InputStreamReader(fis);String str = br.readLine();String infos = str.split(#);String ip = infos0;String name = infos1;String password = infos2;br.close();if(ip.equalsIgnoreCase(ipname)&name.equalsIgnoreCase(pUsername)&password.equalsIgnoreCase(Password)return true;elsereturn false; catch (Exception e) e.printStackTrace();return false;来得到输入框的信息,然后与文件中存的数据进行比较,如何数据没有任何变化,我们在点击登陆后将不弹出是否保存用户信息的对话框此部分运用了如何操作Android手机内存的方法。要实现以上操作,必须开启Android手机内存读取权限:登陆以后就会进入另一个Activity,用一个SurficeView来得到监控的预览,和图像数据。在另一个Activity里面我们设置了一个按钮开始监控按钮,此按钮响应一个点击事件,来控制我们是否开始监控操作,通过startvideo变量来操控我们点击按钮时所响应的操作,当startvideo为FALSE的时候我们点击按钮将会执行监控操作,此时手机开始预览画面,同时把预览画面传递到PC端反正类似。当我们点击此按钮系统才会开始监控,点击开始以后按钮会自动变为结束监控,如何点击结束监控,就会停止监控,此时此按钮又会变为开始监控。下图都为虚拟机上的的画面:3.1所示为用户登录界面,图3.2所示为输入用户信息以后的提示是否记住密码的部分,图3.3所示为点击进入监控界面的界面。图3.4为开始监控画面。图3.1登录界面图3.2提示是否记住密码图3.3是否开始监控界面图3.4开始监控画面3.1.2 PC服务端界面设计播放视频界面是一个窗体,用来创建窗体的类为JFrame,它拥有标题,最大化,最小化按钮和最大化按钮。Swing 程序用JFrame 对象来实现它们的窗口。JFrame 类是AWT Frame 类的一个子类,它加入了一些Swing 的独有的特性。JFrame与 Frame 的使用差不多。唯一的区别在于,你不能将组件加入到JFrame中。但你可以将组件加入到JFrame 的content pane(内容面板) 中,或提供一个新的content pane(内容面板)。面板与顶层容器的不一样:面板不能独立存在,它必须被添加到其他容器内部(面板可以嵌套)。界面为一个Jframe窗体和一个拍照按钮可以对监控视频拍照,并存储。核心代码如下:class ImageFrame extends JFramepublic static final int DEFAULT_WIDTH = 640;public static final int DEFAULT_HEIGHT = 560; public ImagePanel panel;public JButton photograph; public ImageFrame(ServerSocket Serversocket) /* 获取屏幕尺寸 * Toolkit 定义的方法是一种“胶水”,将 java.awt 包中与平台无关的类与 java.awt.peer * 中的对应物连接起来。Toolkit 定义的一些方法能直接查询本机操作统。 */ Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenHeight = screenSize.height; int screenWidth = screenSize.width; /框架放在屏幕中间 setTitle(监控视频); setLocation(screenWidth - DEFAULT_WIDTH) / 2, (screenHeight - DEFAULT_HEIGHT) / 2); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); / 面板添加到框架 /* * 在java里面,设置布局要取得Frame的ContentPane 方法就是getContentPane();然后通过ContentPane 的方法setLayout()设置布局管理器,括号里面就是布局管理器的名称,什么都不选就写null好了 * */ this.getContentPane().setLayout(null); panel = new ImagePanel(Serversocket); panel.setSize(640,480); panel.setLocation(0, 0); add(panel);/添加panel到窗体 photograph = new JButton(拍照); photograph.setBounds(0,480,640,50); add(photograph); saveimage saveaction = new saveimage(Serversocket); photograph.addActionListener(saveaction); 界面如下图3.5所示:图3.5 PC端界面3.2视频数据采集与处理3.2.1视频数据采集过程视频数据的获得有两种方法:一种是利用Android手机自带的Camera获取没有编码的原始数据,另一种是应用MediaRecorder绑定一个LocalSocket,从而获取经过编码的视频数据。这需要在manifest文件中声明权限:第一种方法(本文采用的方法):使用Camera获取原始数据。这种方法为使用Android Camera进行预览图像,把获取的图像保存到缓存之中,等待对原始图像数据的处理。在使用Camera的时候,要用到Android手机的硬件设备Camera,它必须在manifest中声明使用权限:使用Camera的预览功能获取原始数据的具体步骤是这样的:创建一个Camera对象,为surfaceHolder添加一个回调监听器。Camera camera;surfaceHolder.addCallback(this);在回调监听器的surfaceCreate()中执行一个initCamera()方法来执行接下来的步骤:在initCamera()中执行camera.open()来打开摄像头。然后执行camera.getParameters()得到摄像头的参数(默认参数)然后通过执行setParameters(Camera.Parameters)来设定我们想要的参数,我们在这里的图像格式设定为NV21,否则在播放器回放时会出现错误;parameters.setPreviewSize(screenWidth, screenHeight); 设置预览照片的大小parameters.setPreviewFpsRange(20,30); 每秒显示2030帧parameters.setPictureFormat(ImageFormat.NV21); 设置图片格式parameters.setPictureSize(screenWidth, screenHeight); 设置照片的大小camera.setParameters(parameters); Android2.3.3 以后不需要此行代码执行camera.setPreviewDisplay(surfaceHolder) 将camera连接到一个SurfaceView,准备实时预览。执行camera.setPreviewCallback(new StreamIt(ipname);设置一个回调的类;然后StreamTt类实现camer.PreviewCallback接口事件,此接口事件定义一个onPreviewFrame(bytedata,Cameracamera)方法这个函数里的data就是实时预览帧视频数据。一旦程序调用了PreviewCallback接口,就会自动调用onPreviewFrame这个函数。调用camera.PreviewCallback的方式有三种我们使用了第一种setPreviewCallback,这个函数为为每个preview frame设置一个callback,并把每一个preview frame显示到surfaceView上,只要preview 处于激活状态,这些回调函数就会被不断重复调用。调用camera.startPreview()开始预览,这里我们调用camera.autoFocus(null)来自动对焦以达到图像清晰的目的。实现Camera.PreviewCallback接口事件的具体代码如下:class Back implements Camera.PreviewCallbackprivate String ipname; public Back(String ipname) this.ipname = ipname;Override public void onPreviewFrame(byte data, Camera camera) /预览画面的回调函数 Size size = camera.getParameters().getPreviewSize(); /得到图片的格式 try /调用pressToJpeg()将YUV格式图像数据data转为jpg格式 YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); if(image!=null) /把缓冲区的数据读入outstream里面。 可以捕获内存缓冲区的数据,转换成字节数组 ByteArrayOutputStream out = new ByteArrayOutputStream(); pressToJpeg(new Rect(0, 0, size.width, size.height), 80, out); out.flush(); /启用线程将图像数据发送出去 Thread th = new myThread(out,ipname); th.start(); catch(Exception ex) Log.e(Sys,Error:+ex.getMessage(); 第二种方法:MediaRecorder可以进行音视频采集,进行任意时常的录制直至使用者停止录制。MediaRecorder底层是运用OpenCore实现的,但实现的途径需要我们Android为其提供接口,具体过程如下:mediaRecorder = new mediaRecorder() 创建一个MediaRecorder对象;mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA)设置MediaRecorder视频源;mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)设置MediaRecorder的输出格式;mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncode.H24)设置视频流的编码格式;mediaRecorder.setVideoSize(320,160) 设置屏幕分辨率;mediaRecorder.setVideoFrameRate(20)设置每一秒的传输视频速率;mediaRecorder.setOutputFile() 绑定输出端口到localSocket;mediaRecorder.prepare() 准备开始录制;mediaRecorder.start() 开始录制;视频数据的处理:通过onPreviewFrame()的调用,我们得到的了data数据流。Data数据流格式为YcbCr_420_SP(NV21)格式。它的图片文件的格式为YUV420,这种无压缩的图片格式是非常占空间的,如(480x320分辨率就可以达到200KB每一张图的体积,10FPS的话就会有2MB每秒的传输速率,如果要使用网络发送的话网络压力会非常大的),因此就需要压缩。然后我们运用Android.graphics包下面已经存在一个YuvImage类,它可以把数据直接导入进行处理。我们可以通过camera.getParameters().getPreviewSize()得到图像的格式。这个类有一个公共方法pressToJpeg(new Rect(0,0,size.width,size.height),80,outstream)来达到我们的要求,把NV21转化为JPG图像格式。其中Tect对象包含图片的显示范围;第二个是质量因数,1100之间的数;第三个为一个ByteArrayOutputStream的对象,它可以捕获内存缓冲区的数据,转换成字节数组,读入outStream中,然后我们就可以启动线程把它发送出去了。3.2.2 YUV和RGB简介RGB与YUV都是色彩空间,都用于表示颜色,两者可以相互转化。 YUV(也称YCrCb)是被欧洲电视系统所用的一种颜色编码方法(属于PAL)。YUV主要是用于优化彩色视频信号的传输,从而使其向后兼容老式黑白电视。与RGB视频信号传输相比,它突出的优点在于只需要占用极少的带宽(而RGB要求三个独立的视频信号同时传输)。YUV中Y表示明亮度(Lumina nce或Luma),也叫灰阶值,是个基带信号。而U和V则表示的是色度(Chrominance或Chroma),作用是描述影像色彩和饱和度,用于指定像素的颜色。U和V并不是基带信号,它俩是被正交调制了的。亮度是通过RGB的输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。色度则定义颜色的两个方面即色调与饱和度,分别用Cr与C来表示。Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而C反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。经过运算,YUV三分量可以还原出R(红),G(绿),B(兰)三色。他们之间的转化公式为:第一个公式是YUV转换RGB(范围0-255)时用的,第二个公式是用在YUV(601也成YCbCr转换RGB(范围0-255)时用的。= 0.299R + 0.587G + 0.114BU = -0.147R - 0.289G + 0.436BV = 0.615R - 0.515G - 0.100BR = Y + 1.14VG = Y - 0.39U - 0.58VB = Y + 2.03UB= 1.164 * (Y - 16) + 2.018 * (U - 128)G= 1.164 * (Y - 16) - 0.38 * (U - 128) - 0.813 * (V - 128)R= 1.164 * (Y - 16) + 1.159 * (V - 128)3.2.3 Android SurfaceView技术说明Android中的SurfaceView视图类常常被用来处理与视频开发、游戏相关的内容,本文在完成了摄像头预览和接收回放视频时就会用到这个类了。一般情况下应用程序的View都是在一样的GUI(Graphical User Interface,简称GUI,还叫图形用户接口)线程之中绘制的,GUI作为Android应用的主线程,它负责处理了整个如单击按钮、文本的输入之类的用户互动,这之中包括了执行View类的Ondraw()的方法,它禁止了后台程序修改GUI之中的元素。SurfaceView类继承了View类,它们两之间的最大区别在于View是在主应用线程之中绘制的,而SurfaceView它能够使用后台线程来绘制,这避免了主线程的阻塞,而且SurfaceView还可以直接从相机或者内存等硬件设备之中获得图像数据,这对于那些需要快速更新、高消耗资源的操作,如实时摄像头预览、使用2D/3D图形开发游戏等是非常有用的。Android SurfaceView 是提供给需用直接绘制像素而不是运用窗体部件的应用而使用的,SurfaceView的使用方法和View类基本相同,它可以应用动画并将其加入到布局之中。SurfaceView中封装了一个Surface对象,这类似于View之中的Canvas,它支持所有Canvas的标准方法和OpenGL ES库。Android完全支持OpenGL ES 3D的框架,它利用OpenGL能够在Surface之上绘制2D/3D图像,由于使用了硬件加速,所以这与在2D画布上的模拟相比,它的效果得到了提升。SurfaceView的使用办法:继承SurfaceView而且实现SurfaceHolder.Callback接口。这个接口中需要重写的方法有:public void surfaceChange(SurfaceHolder holder,int format,int width,int height),在SurfaceView 的大小如果发生改变时调用。public void surfaceCreated(SurfaceHolder holder),在创建SurfaceView的时候调用,实现绘制线程。public void surfaceDestroyed(SurfaceHolder holder),销毁执行绘制线程的停止和释放。SurfaceView调用时。 SurfaceView.getHolder(),获得SurfaceHolder对象;SurfaceHolder.addCallback(callback),增加回调函数;SurfaceHolder.lockCanvas(),获得Canvas的对象同时锁定画布;Canvas绘画;SurfaceHolder.unlockCanvasAndPost(Canvas canvas),结束锁定的画布,提交改变的现实图像;3.3无线视频传输实现3.3.1无线视频传输方式的选择随着多媒体技术和计算机技术的飞速发展,与此同时伴随着通信技术的不断成熟,无线视频传输在越来越多的场合中被应用了,如交通事故、高危场地、视频会议、远程教学等等。无线图像传输实现的技术方式是多种多样,下面来介绍几种可用于无线视频传输的相关技术,并对实现方式作了简要介绍:4G无线传输 4G技术是对3G技术的进一步完善,其能够创造出大多数消费者的消费需求。它不仅在速率上远远超过3G技术,而且其在性能和回流媒体内容上也远远超过了3G技术。在实际使用过程中,其能接收高分辨率的媒体节目,也能为广播和通信基础设施创造更多的条件,加之4G技术无线连接费用较3G技术便宜且能实现不同网络漫游,能更好满足用户需求。如何能更好的对现代化4G移动通信技术更好的分析,已经成为相关部门值得关注的重点。对于4G来说,还没有精确的定义,但是可以将4G技术称为广带接入和分布网络,它具有高于2Mb/S非对称性数据传输能力,能对全速移动用户提供100Mb/s以上的影像服务,而且还能实现三维图像高质量传输。能通过广带无线固定接入、广带无线局域网、移动广带系统和互操作的广播网络,为不同固定无线平台和不同网络提供无线服务,而且也能与不同地方宽带接入互联网,提供信息以外的定时数据采集和远程控制等综合功能。就现在来看,4G技术不仅具有较高的数据传输效率、较高的智能性、较好的覆盖性,同时也能更好的实现无缝漫游、高质量的多媒体通信和不同Qos业务。而且一般普通的移动用户的手机数据传输效率最高只能达到1020Mb/s,但使用4G手机,其传输效率就能够达到100Mb/s;实际应用的过程中,可以进行智能信号处理技术,将不同信道条件下的各种复杂环境结合在一起然后对其进行正常发送和接受,从而实现其智能性;在实际应用过程之中,4G通过良好的覆盖性能更加好的提高变速率传输;而且在实际的应用过程中,也可以通过多种媒体、通信主机和网络来实现无缝的连接;在实际应用的过程中,可以通过IPv6来实现网络来实现话音和多媒体业务;在实际应用过程中,可以通过动态带宽分配,能对发射功率进行相应调节,使4G不同通信质量和通信业务更好的实现。WIFI无线传输 Wi-Fi的全名Wireless Fidelity,包括IEEE802.11a、IEE802.11b、IEE802.11g等标准。IEEE 802.11b无线网络规范是IEEE 802.11网络规范的变种,它的最高带宽为11 Mbps,基于WLAN的传输方式,在信号比较弱或者有干扰的情况下,带宽可调整到5.5Mbps、2Mbps和1Mbps,带宽的自动调整,能有效地保障了网络的稳定性与可靠性。它主要特性为:速度快,可靠性高,在开放性区域,通信距离可以到达305米,在封闭性区域,通信距离可达76米到122米,而且方便与现有的有线以太网络整合,组网的成本比较低。Wi-Fi技术主要的优势在于:一,无线电波的覆盖范围广, Wi-Fi的半径则可达300英尺左右,约合100米。二,虽然由Wi-Fi技术传输的无线通信质量不是很好,数据安全性能比蓝牙技术差一些,传输质量也有待改进,但其传输速度相对较快,可以达到11Mbps,符合个人和社会信息化的需求。三,Wi-Fi最主要的优势在于它不需要布线,可以不受布线条件的限制,因此非常适合移动办公用户的需要,家庭和小型办公网络用户对移动连接的需求是无线局域网市场增长的动力,具有广阔市场前景。它的主要缺点是:它属于在办公室和家庭中使用的短距离无线技术,所以这就大大限制了Wi-Fi在更广泛的领域中的应用,特别在远距离信息数据传输方面,及远程控制等方面的应用。GPRS无线传输 GPRS网络已经组成了覆盖全国的数据网络,它是利用“分组交换(Packet-Switched)”概念所发展的一种无线传输方式。它是一种新型的分组数据传输业务。GPRS网络属于蜂窝网络结构,大的建筑对网络无线信号的影响仅仅局限于小块区域,并且,移动运营商有专门的网络优化部,可以根据网络上的流量、通信故障等情况,及时的调整网络,用户根本不要关心网络的调整,更不需要为网络的调整付出额外的钱财。GPRS无线方式传输数据的优势:采用 GPRS 无线方式传输数据主要优势:资费便宜,计费合理。 GPRS 包月很便宜,由于 ATM 业务没有大数据量的传输,所以没有必要采用资费很高的专线( DDN 等)。而且GPRS 可以根据通信的数据量和提供的服务质量进行计费。在 GPRS 网中,用户只需与网络建立一次连接,就可以长时间的保持这种连接,而且只有在传输数据时才会占用信道并计费,如果没有数据传输时,不占用信道不计费。从而营业网点不需要频繁建立连接,当然也不必支付传输空闲时的专线费用,而客户再也不必不耐烦地等待电话拨号登陆的过程。设备投资低,传统的 DDN 等专线,需要购买 DTU 或其他专线 Modem ,拨号方式则需要购买 Modem Pool 、普通 Modem 、 ISDN Modem 等设备。而采用 GPRS 无线方式只需要购买 GPRS 无线传输终端即可,投资要小得多。新增和改变网点方便。如果采用了 GPRS 方式,用户可随意改变自己的营业网点而无须担心线路的维护或在移动时导致的通信中断。新增新的营业点时也无需进行布 线,埋线等牵涉多方的工作。线路稳定,永不掉线。 GPRS 采用的分组技术,所以能够最好地支持频繁的或少 量突发型的数据业务。网络接入速度快。 GPRS 登录网络的时间很短暂,相对拨号方式的 1 、2 分钟,它只需要 30 秒,而且一旦连接,则时刻在线,因此可以提供与现有数据网的无缝连接。网络覆盖好。现在 GSM 的网络覆盖已经非常完善,而且在大部分的 GSM 网络节点都分布了 GPRS 服务节点,保证无线接入的可行性。GPRS的最大优势在于它的数据传输速度不是WAP所能比拟的。目前的GSM移动通信网的传输速度为9.6Kbps,GPRS手机在今年年初推出时已达到56Kbps的传输速度,到现在更是达到了115Kbps(此速度是常用56Kmodem理想速率的两倍)。GPRS是以分组交换的方式进行数据传输,由于是分组交换,因此在网络资源的利用率上较电路交换有了很大的提高。主要缺点:在数据传输速度上可能相比要慢些,而传输一些小容量图片和随机的信息时足以应付的。3.3.2网络通信模块实现移动互联网为人们的生活带来了很多便利,使人们不在受时间和空间的限制,可以随时进行数据交换。网络通信应该包含三部分内容主要内容:发送方、接收方以及协议栈,发送方与接收方是参与通信的主体,协议栈则是发送方和接收方进行通信的规范,涉及到网络传输协议和流媒体传输协议的,主要包括了用户数据报协议UDP、实时传输协议RTP、实时传输控制协议RTCP、传输控制协议TCP、实时流媒体协议RTSP等等。 TCP/IP协议是最初为提供非实时的数据业务而设计产生的,IP协议仅仅是负责不同的网络地址之间传递数据,并没有具备对传输的数据进行检错纠错的能力。故在丢包率比较高、网络状况不佳的情况下用TCP协议进行实时视频数据传输的能力比较差。UDP则是无连接的不可靠协议,利用UDP来数据传输时会出现丢包与出错现象,这也正因为UDP缺少数据可靠传递机制,但它具有更快的传递速度。 实时传播软件在传输视频数据时需要保证数据的实时性与质量,由于一帧视频数据在通过网络进行传输时常常需要拆分成若干个数据包。如果属于同一帧的数据包到达时间不一样,或者在传输过程中出现非常严重的丢包现象,接收端回放的视频文件将会出现明显的失真,所以为了保证数据传输的质量和实时性,我们将采用实时传输协议。 多媒体数据的实时传输的关键是数据的实时到达和播放,实时传输协议RTP和实时传输控制协议RTCP是专门为音视频数据实时传输设计的传输协议了,RTP使用UDP协议来进行数据的传输,它不提供任何传输可靠性保证和流量拥塞控制机制。实时传输控制协议RTCP是RTP协议的重要补充,为RTP数据传输提供了传输控制。进行数据传输时我们将一帧数据被拆分成若干RTP包,同一帧的数据包具有一样的时间戳,这样就保证了在接收端,我们能正确的恢复原始数据帧,通过发送端给数据包添加一个顺序标号,在接收端,我们利用顺序标号进行数据包重排,保证了视频数据的正确回放,这使得对媒体数据的传输高效和有保障。 传输部分的实现用到了UDP Socket,Socket是建立网络连接时使用的,它分为有连接的Socket和无连接的Socket两种。有连接的Socket有重发和校验机制,数据安全性比较高。无连接的Socket通信效率高,但不保证数据传输的可靠性。Socket接口设计者最初是将该接口放在Unix操作系统里面的。如果可以了解Unix系统的输入和输出的话,对于socket就很容易理解了。网络Socket数据传输相当于一种特殊的I/O,Socket是一种文件描述符。Socket也有一个相似于打开文件的函数调用Socket(),这个函数返回一个整型的Socket描述符,然后连接建立、数据传输等等操作都是通过这个Socket实现的。常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP/IP服务应用;数据报Socket是一种无连接的Socket,对应于无连接的UDP服务。其中,Socket 是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用。客户随机申请一个Socket系统为之分配一个Socket号,服务器拥有全局公认的 Socket ,任何客户就都可以向它发出连接请求和信息请求。 Socket是什么:Network API是典型的用于基于TCP/IP网络Java程序与其他程序通讯,Network API依靠Socket进行通讯。Socket可以看成在两个程序进行通讯连接中的一个端点,Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。基于TCP/IP网络中的每一个主机均被赋予了一个唯一的IP地址基于TCP/IP网络通讯的程序都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535。 Socket 是基类,它支持TCP协议。TCP是一个可靠的流网络连接协议。Socket类提供了输入/输出的方法,使得从套接字中读出数据和往套接字中写数据都很容易。该类对于编写因特网上的通讯程序而言是必不可少的。ServerSocket是一个因特网服务程序用来监听客户请求的类。ServerSocket实际上并不执行服务;而是创建了一个Socket对象来代表客户机。通讯由创建的对象来完成Socket编程:Socket socket = new Socket (, 6000);InputStream is = socket.getInputStream ();is.close ();socket.close ();上面的代码创建了一个服务程序主机地址为,端口号为6000的Socket对象,然后从这个新创建的Socket对象中读取输入流,接着再关闭流和Socket对象。如果创建了一个Socket对象,那么它也可能通过调用Socket的 getInputStream()方法从服务程序获得输入流读传送来的信息,也可以通过调用Socket的 getOutputStream()方法获得输出流来发送消息。在读写活动完成之后,客户程序调用close()方法关闭流和流套接字, ServerSocket Server = new ServerSocket (60000);while (true) /获取客户套接子引用socket 用此获取流 Socket socket = Server.accept ();new ServerThread (socket).start ();以上代码创建了一个ServerSocket对象来监听端口6000上的连接请求,如果有连接请求, Server进入一个无限循环中,交替调用ServerSocket的 accept() 方法来等待连接请求,与此同时将会启动后台线程处理连接(accept()返回的请求)。线程由ServerThread继承的start()方法开始,并执行ServerThread的run()方法中的代码:class myThread extends Threadprivate byte byteBuffer = new byte1024;private OutputStream outsocket;private ByteArrayOutputStream myoutputstream;private String ipname;public myThread(ByteArrayOutputStream myoutputstream,String ipname)this.myoutputstream = myoutputstream;this.ipname = ipname; try myoutputstream.close(); catch (IOException e) e.printStackTrace(); public void run() try /将图像数据通过Socket发送出去 Socket tempSocket = new Socket(ipname, 6000); System.out.println(Socket= + tempSocket); outsocket = tempSocket.getOutputStream(); ByteArrayInputStream inputstream = new ByteArrayInputStream(myoutputstream.toByteArray(); int amount; /将InputStream 当中的数据取出,并写入到OutputStream 当中 while (amount = inputstream.read(byteBuffer) != -1) outsocket.write(byteBuffer, 0, amount); /*flush() 是把缓冲区的数据强行输出, 主要用在IO中,即清空缓冲区数据,一般在读写流(stream)的时候,数据是先被读到了内存中, *再把数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还有一部分有可能会留在内存这个缓冲区中。这时候如果你调用了 *close()方法关闭了读写流,那么这部分数据就会丢失,所以应该在关闭读写流之前先flush()。 */ myoutputstream.flush(); tempSocket.close(); catch (IOException e) e.printStackTrace(); 把图片数据发送出去。3.4 PC端视频播放模块设计PC端播放功能用一个Java Application实现,播放视频的界面是一个窗口,用来创建窗口的类是JFrame类,它生成一个窗口拥有标题、最大化按钮,最小化按钮和关闭按钮。用frame.setDefaultCloseOperation(JFrame.EXIT.ON.CLOSE)来设置窗口发起close时的默认操作。然后在JFrame(框架)中添加和设置JPanel(面板),支持double buffering.prame.panel.getimage()得到有Socket通信得到的图像流文件,具体代码如下:class ImagePanel extends JPanel private ServerSocket ServerSocket; private Image image; private InputStream inputStream; public ImagePanel(ServerSocket Serversocket) this.ServerSocket = Serversocket; public void getimage() throws IOException Socket socket = this.ServerSocket.accept(); System.out.println(连接成功!); System.out.println(Socket= + socket); this.inputStream = socket.getInputStream();this.image = ImageIO.read(inputStream);/读入图片流this.inputStream.close(); /*你要重写JPanel这个父类的paintComponent()方法,来实现自己的绘制方案。因为你的类是从JPanel继承而来的,相当于这个类本身就保存了JPanel的一个引用。当你重写paintComponent()方法时,为了确保在此期间,父类JPanel能把自己的paintComponent()方法运行完,就要调用super.paintComponent() 然后再运行你自己的paintComponent(); 否则就有可能出现的情况是,父类JPanel自己还没有绘制完,程序已经开始绘制子类的了。*/ public void paintComponent(Graphics g) super.paintComponent(g); if (image = null) return; g.drawImage(image, 0, 0, null); 然后通过frame.repaint()是图片文件交替显示,这样就呈现了动画效果。Repaint()讲解:repaint()产生重绘事件,在Customltem里面他又两个名字相同的方法,其中有一个有四个参数,它们用来指定重绘区的起始的X、Y坐标,高度和宽度;另外有一个没有参数,它表示重绘Customltem的整个区域。Paint()方法里面的后两个参数也是高度和宽度,但这两个方法的高度和宽度没有一点联系,paint()方法里面的W和H是Item内容区的高度和宽度,而且这有当这两个俩个值大于零时,paint()方法才会被调用。Repaint()被调用以后就会立即返回,然而paint()回调函数的工作会有别的专门处理UI的线程来完成。因此如果想要得到paint()方法完成后再返回,那么就能在repaint()之后立即调用serviceRepaint(),用它来强制队列中的重画事件快点完成。repaint()这个方法是一个有刷新页面效果的方法,如果你要页面进行重画就能调用一般都是在的图形绘制当中调用得到。那么这个方法的具体的工作原理是怎么样的呢?看结构流程图4.6你就可以大概的了解到了:图3.6结构流程图从这上面的流程图我们可以看出,在绘制动画图形时如果没有调用repaint()方法的时候直接就会是由线程调用paint()方法进行绘制,然后用repaint()方法进行刷新显示。但这样的动画会有个缺点(这样的效果绘制出来将会有闪烁)试想想做出来的动画总是一段时间就会闪烁,有人想看吗?那么应该如何去除闪烁呢?我再下面的文章中将会讲到。这里主要的是要说明repaint()这个方法,在调用了repaint()方法的时候我门就可以看出,它并不是直接去绘制动画(调用paint()),而通过调用线程然后再由线程去调用另一个update()方法,再由update()调用画笔paint()方法来进行绘制。那么为什么这里要多做这一步呢?这样会不会为我门多增加代码的书写量呢?回答当然是不会的,如果你不调用repaint()方法那么就不能实现每一次的刷新显示,就仅仅会绘制重叠的图形,而不能一张一张的绘制出来。那么其中调用的update()到底有什么样的作用呢?update():用来清除当前显示并调用paint()方法。当然这个update()方法是能够被修改的,这里就用到了双缓存方法,综上所述可以总结出repaint()的工作原理为:repaint()通过调用线程然后在由线程去调用update()方法来清除当前的显示然后再调用paint()方法进行绘制下一个需要显示的内容。这样就会起到了一种图片的交替显示从而在视角上就会形成了动画。双缓冲技术:当数据量比较大时,绘图过程将会需要几秒或者更长的时间,并且有的时候还会出现闪烁的现象,为了处理这些问题,可以采用双缓冲技术来进行绘图。双缓冲即在内存中创建一个和屏幕绘图区域一样的对象,先把图像绘制到内存中的这个对象上面,然后一次性把这个对象上的图像复制到屏幕上面,这样就能够 大大的加快绘图的速度,双缓冲技术的实现过程如下:(1)在内存中创建和画布一样的缓冲区(2)在缓冲去里面绘图(3)将缓冲区位图复制到当前的画布上面(4)释放内存的缓冲区在图像处理编码的过程中,双缓冲是一种比较基本的技术。我们知道,如果窗口在响应WM_PAINT消息的时候需要进行复杂的图像处理,那么窗口在绘制过程中由于过频繁的刷新就会引起闪烁的现象。为了解决这一个问题,一个有效的方法就是双缓冲技术。因为窗口在刷新的时候,总会有一个擦掉原来图像的过程OnEraseBkgnd,它利用了背景色的原理来填充窗口的绘图区,接着再调用一个新的绘图代码来进行重绘,这样的一写一擦就会造成图像颜色的反差。当WM_PAINT的响应过于频繁地时候,这样的反差也就会越来越明显。这样我们就会看到闪烁现象。解决的基本思路:我们很自然的会想到,避免背景色的填充会是最直接的办法。然而这样的话,窗口会变得一团乱,因为每次绘制图形的时候都没有把原来的图像擦掉,这样就造成了图像的残留,这样窗口重绘的时候,画面就会变得乱七八糟的。所以单纯的阻止背景重绘是远远不够的。我们还要进行重新绘制图形,而且要去速度要比较快,于是我们就想到了使用BitBit函数的方法。它可以支持图形块的复制,而且速度比较快。我们可以先在内存之中作图,然后用这个函数将做好的图复制到前台,同时禁止背景刷新,这样就可以阻止闪烁。3.5课题结果展示本文基本实现了设计要求,达到了视频监控的实时性,稳定性。下面是课题结果展示,图3.7为登陆画面,用户输入处于同一网段的PC的ip地址,用户名和密码。点击登陆,选择是否记住密码后,进入另一个界面,点击开始监控手机camera就开始采集视频信息,手机屏幕开始获取预览画面,如图3.8所示。当你点击停止监控,画面就会静止在刚才的画面,等待下一个指令,此时电脑就会实时的显示手机摄像头采集的画面达到监控的目的如图3.9所示。PC端点击拍照就会把此时监控画面保存于电脑内存之中,过程如图3.10与3.11所示。图3.7输入用户信息准备登陆图3.8开始监控的手机端画面图3.9开始监控PC端画面 图3.10点击拍照以后的画面图3.11保存成功的画面课题结果总体评价:本文是把图片文件一张张传到PC端去显示,所以数据流量比较大,需要的网络环境要好,不然会出现画面闪烁、一顿一顿的现象。本文每传送一帧图像就要开启一个线程去处理,这样做不是佷合理,但由于知识有限没能改进。总结与展望1.总结:本文研究了无线视频传输的相关技术,可以在无线局域网中利用手机wifi进行无线视频的传输,此系统可以被应用于视频监控、手机可视电话、网络终端视频通信的领域,它具有一定的实际意义和应用价值。本文主要进行了一下工作:对Android中视频相关的API和网络的传输协议,socket通信进行研究分析的基础上,细化了系统的各个模块,本文重点讨论了监控系统的网络框架,对系统的Android手机视频监控设备、PC端视频监控服务进行了主要功能的介绍和功能的需求分析。从Android开发平台的环境搭配入手,慢慢对Android应用程序的结构的分析,实现了系统的界面模块,然后学习Android的多媒体播放器,Camera的视频采集功能,实现了视频采集的预览。实现了视频采集功能模块、数据传输模块和PC端视频播放模块的基本功能。学会了利用无线局域网环境的视频传输系统的开发。由于我之前从没有接触过Java而Android开发用的基本语言就是Java所以在学习Android的一些基本框架的时候也在学习一些Java语言知识。由于知识的缺乏,在系统开发过程中遇到很多问题,但经过学习,都一一克服,对Android的系统框架有了更深的体会。2.展望:本文针对基于Android平台的视频监控系统进行了设计和实现,可以基本实现系统各个模块的功能。但是该系统还存在很多不足需要进一步改进,主要有以下几个部分:(1)本文只是实现了视频图像的传输,而不能传输音频,这是很大的不足,但由于时间的原因没有实现。(2)本文在无线局域网环境中实现了无线视频传输,但当通过Internet传输时,需要在一定的程度上允许丢包的发生。当网络发生故障时,应该设置播放缓冲机制。(3)功能不够完善,不支持多路同时传输,压缩技术不够完善,使得传输占用很大流量。因为所传的视频数据比较大,系统当中的Qos算法还需要改进。参考文献与资料1 靳岩,姚尚朗.Google Android开发入门与实战M.北京:人民邮电出版社,2010:P1-120.2 杨文志.Google Android程序设计指南M.北京:电子工业出版社,2009:P1-23.3 关东升,赵志荣.Android开发案例驱动教程M.北京:机械工业出版社,2012:P23-45.4 张思明.Android应用程序设计M.北京:清华大学出版社,2013:P1-57.5 Google API大全编委会.Google API大全M.北京:电子工业出版社,2009:P1-110.6 余志龙.Android SDK开发范例大全M.北京:人民邮电出版社,2009:P45-89.7 王东华.Android开发实例大全M. 北京:电子工业出版社,2012:P1-56.8 韩敬海. Android程序设计M. 北京:电子工业出版社,2012:P1-46.9 熊斌. Android多媒体开发技术实战详解M. 北京:电子工业出版社,2012:P1-78.10 GONG Lei,ZHOU Cong.Development and Research of Mobile Termination Application Based on AndroidJ. Computer &Modernization. 2008.8(1):P1-20.11 Enck,W., Ongtang,M.,McDaniel,P. Understanding Android SecurityJ. Security & Privacy, IEEE.2009,7(1):P50-57. 12 Sandeep Kumar. Location Based Services using AndroidC. Internet Multimedia Services Architecture &Applications (IMSAA), 2009 IEEE International Conference. P1-5.13 罗伟Android平台的即时通讯系统的研究与实现D硕士学位论文.湖南师范大学,2008:P2-14.14 黄舜.基于Android平台的手机软件开发.学士学位论文.浙江师范大学.2012:P8-10.15 Enck,W., Ongtang,M.,McDaniel,P. Understanding Android SecurityJ. Security & Privacy, IEEE.2009,7(1),P50-57.16 RetoMeier Professional.Android Application developmentM.USA:Weox,2010:P1-13.17 韩超.Android系统原理及开发要点详解M.北京:电子工业出版社,2010:P34-57.18 赵亮,张维.基于Android技术的界面设计与研究J.电脑知识技术,2009:P45-169.19 马越.Android的架构与应用D.北京,中国地质大学,2008:P1-5.20 姚一文.基于Android的移动学习终端平台的开发与研究D.中南大学,2008:P12-78.21 Jerome(J.F.)DiMarzio.AndroidTMA Programmer GuideM.London,2009:P1-23.22 李亮.Android系统开发问题杂谈J.程序员,2009:P1-9.23 张岩.基友Java手机平台移动多媒体系统的设计与实现.哈尔滨工业大学,2006:P2-34.24 谢涛.基于视频压缩标准H.264编码器的实现与优化.浙江大学硕士学位论文,2006:P1-10025 公磊,周聪.基于Android的移动终端应用程序开发与研究J.计算机与现代化,2008:P2-34.致 谢日光荏苒,岁月如梭,不知不觉间在长安大学的生活将要结束。在这短暂而充实的四年间,我在学习和生活中得到了很多老师和同学的帮助和教诲,值此论文完成之际,对于这些在我人生的黄金时间段给我提点和指引的人们,致以最诚挚的感谢。首先要衷心的感谢我的指导老师冯兴乐教授,他在整个设计的过程中给了我很大的支持和鼓励,而且冯兴乐老师严谨的研究态度和正直的学术作风也给我给我树立了很好的榜样,令我受益匪浅。本文正是在冯兴乐教授的悉心关注和指导下完成的。同时我也要感谢郭星学长的无私帮助,我才能顺利的完成本次毕业设计。最后我也要感谢我的父母,他们对我倾力培养、关心和帮助,让我能够在这这儿安心的学习。他们从小对我的教育也让我养成了正确的人生观和积极向上的生活态度。在我大学生活即将结束,我的研究生生涯开始之时对他们与最真挚的感谢,我也想对他们说一声:你们辛苦了,我一定不会辜负你们的期望成为一个有用的人才。本文在一些方面存在不足,希望得到老师的批评指正。附 录(1)文件存储源代码package LoginServer;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;import Android.content.Context;public class Server /* * 保存IP 用户名 密码 文件 * param context 上下文 * param IP IP地址 * param username 用户名 * param password 密码 * */public static boolean SaveInfoServer( Context context,String IP,String username,String password)try /getFilesDir() .帮我们找到安装目录/data/data/包名File fs1 = new File(context.getFilesDir(),info.txt);FileOutputStream fos = new FileOutputStream(fs1);/各项数据以# 分割fos.write(IP+#+username+#+password).getBytes();fos.close();return true; catch (Exception e) e.printStackTrace();return false;/* * 得到保存的信息 * context 上下文 */public static Map getSaveInfoServer(Context context)File file = new File(context.getFilesDir(),info.txt);try FileInputStream fis = new FileInputStream(file);SuppressWarnings(resource)BufferedReader br = new BufferedReader(new InputStreamReader(fis);String str = br.readLine();String infos = str.split(#);Map map = new HashMap();/一一得到数据map.put(IP,infos0);map.put(username, infos1);map.put(password, infos2);return map; catch (Exception e) e.printStackTrace();return null;/* * 判断输入的用户信息是否和保存的一致 * */public static boolean checkInfoServer(Context context,String ipname,String pUsername,String Password)File file = new File(context.getFilesDir(),info.txt);try FileInputStream fis = new FileInputStream(file);BufferedReader br = new BufferedReader(new InputStreamReader(fis);String str = br.readLine();String infos = str.split(#);String ip = infos0;String name = infos1;String password = infos2;br.close();if(ip.equalsIgnoreCase(ipname)&name.equalsIgnoreCase(pUsername)&password.equalsIgnoreCase(Password)return true;elsereturn false; catch (Exception e) e.printStackTrace();return false;(2)PC播放视频端源代码package ImageServer;/* version 1.2 2014-06-29* author cuijing*/import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.*;import javax.imageio.*;import javax.swing.*;import .Socket;import .ServerSocket;/*在服务器开启情况下,启动客户端,创建套接字接收图像*/public class ImageServer public static ServerSocket Serversocket = null; public static void main(String args) throws IOException /创建Serversocket Serversocket = new ServerSocket(6000); final ImageFrame frame = new ImageFrame(Serversocket); /是设置用户在此窗体上发起 close 时默认执行的操作 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); while(true) frame.panel.getimage(); /repaint()通过调用线程再由线程去调用update()方法清除当前显示并再调用paint() /方法进行绘制下一个需要显示的内容这样就起到了一种图片的交替显示从而在视角上形成了动画 frame.repaint(); /* 一个框架和一个图像面板*/SuppressWarnings(serial)class ImageFrame extends JFramepublic static final int DEFAULT_WIDTH = 640;public static final int DEFAULT_HEIGHT = 560; public ImagePanel panel;public JButton photograph; public ImageFrame(ServerSocket Serversocket) /* 获取屏幕尺寸 * Toolkit 定义的方法是一种“胶水”,将 java.awt 包中与平台无关的类与 java.awt.peer * 中的对应物连接起来。Toolkit 定义的一些方法能直接查询本机操作系统。 */ Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenHeight = screenSize.height; int screenWidth = screenSize.width; /框架放在屏幕中间 setTitle(监控视频); setLocation(screenWidth - DEFAULT_WIDTH) / 2, (screenHeight - DEFAULT_HEIGHT) / 2); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); / 面板添加到框架 /* * 在java里面,设置布局要取得Frame的ContentPane 方法就是getContentPane();然后通过ContentPane 的方法setLayout()设置布局管理器,括号里面就是布局管理器的名称,什么都不选就写null好了 * */ this.getContentPane().setLayout(null); panel = new ImagePanel(Serversocket); panel.setSize(640,480); panel.setLocation(0, 0); add(panel);/添加panel到窗体 photograph = new JButton(拍照); photograph.setBounds(0,480,640,50); add(photograph); saveimage saveaction = new saveimage(Serversocket); photograph.addActionListener(saveaction); /* 一个面板显示平铺的图像*/SuppressWarnings(serial)class ImagePanel extends JPanel private ServerSocket ServerSocket; private Image image; private InputStream inputStream; public ImagePanel(ServerSocket Serversocket) this.ServerSocket = Serversocket; public void getimage() throws IOException Socket socket = this.ServerSocket.accept(); System.out.println(连接成功!); System.out.println(Socket= + socket); this.inputStream = socket.getInputStream();this.image = ImageIO.read(inputStream);/读入图片流this.inputStream.close(); /你要重写JPanel这个父类的paintComponent()方法,来实现自己的绘制方案。因为你的类是从JPanel继承而来的, /相当于这个类本身就保存了JPanel的一个引用。当你重写paintComponent()方法时,为了确保在此期间, /父类JPanel能把自己的paintComponent()方法运行完,就要调用super.paintComponent() /然后再运行你自己的paintComponent(); / 否则就有可能出现的情况是,父类JPanel自己还没有绘制完,程序已经开始绘制子类的了。 public void paintComponent(Graphics g) super.paintComponent(g); if (image = null) return; g.drawImage(image, 0, 0, null); class saveimage implements ActionListener /RandomAccessFile是用来访问那些保存数据记录的文件的RandomAccessFile inFile = null;byte byteBuffer = new byte1024;InputStream ins;private ServerSocket ServerSocket;public saveimage(ServerSocket ServerSocket)this.ServerSocket = ServerSocket;public void actionPerformed(ActionEvent event) try Socket socket = ServerSocket.accept();ins = socket.getInputStream();/ 文件选择器以当前的目录打开 JFileChooser Jfilechooser = new JFileChooser(.); /软件包 javax 为访问命名服务提供类和接口 /Swing是JAVA基础类的一部分。Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。 Jfilechooser.showSaveDialog(new javax.swing.JFrame(); / 获取当前的选择文件引用 File savedFile = Jfilechooser.getSelectedFile(); / 已经选择了文件 if (savedFile != null) / 读取文件的数据,可以每次以快的方式读取数据 try inFile = new RandomAccessFile(savedFile, rw); catch (FileNotFoundException e) e.printStackTrace(); /写入文件数据 int amount; while (amount = ins.read(byteBuffer) != -1) inFile.write(byteBuffer, 0, amount); inFile.close(); ins.close(); socket.close(); javax.swing.JOptionPane.showMessageDialog(new javax.swing.JFrame(),/提示保存成功 已接保存成功, 提示!, javax.swing.JOptionPane.PLAIN_MESSAGE); catch (IOException e) e.printStackTrace();(3)手机采集视频端源代码package org.cuijing.CameraTest;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;import .Socket;import org.cuijing.CameraTest.R;import Android.app.Activity;import Android.content.Intent;import Android.graphics.ImageFormat;import Android.graphics.Rect;import Android.graphics.YuvImage;import Android.hardware.Camera;import Android.hardware.Camera.Parameters;import Android.hardware.Camera.Size;import Android.os.Bundle;import Android.util.Log;import Android.view.SurfaceHolder;import Android.view.SurfaceHolder.Callback;import Android.view.SurfaceView;import Android.view.View;import Android.view.View.OnClickListener;import Android.view.Window;import Android.view.WindowManager;import Android.widget.Button;public class CameraTest extends Activityprivate Button Bt_transport;/是否开始监控public boolean startSendVideo=false;SurfaceView surfaceView;SurfaceHolder surfaceHolder;int screenWidth;int screenHeight;Camera camera; / 定义系统所用的照相机boolean ispreview = false; /是否在浏览中private String ipname;SuppressWarnings(deprecation)Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); / 设置全屏 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); / 获取IP地址 Intent intent = getIntent(); /*getIntent得到一个Intent,是指上一个Activity启动的intent, *这个方法返回intent对象,然后调用intent.getExtras()得到intent所附带的额外数据 *至于说所谓的额外数据是什么数据,之后弄明白再处理。 */ Bundle data = intent.getExtras(); ipname = data.getString(ipname);screenWidth = 640;screenHeight = 480;/ 获取界面中SurfaceView组件surfaceView = (SurfaceView) findViewById(R.id.sView); /Bt_connect = (Button) findViewById(R.id.Bt_connect);Bt_transport = (Button) findViewById(R.id.Bt_transpant);/Et_look = (EditText) findViewById(R.id.Bt_connect);surfaceHolder = surfaceView.getHolder();System.out.println(startSendVideo);Bt_transport.setOnClickListener(new OnClickListener() Overridepublic void onClick(View arg0) if(startSendVideo)/停止传输视频startSendVideo=false;Bt_transport.setText(开始监控);/ 如果camera不为null ,释放摄像头camera.stopPreview();/ 开始预览else / 开始传输视频startSendVideo=true;Bt_transport.setText(停止监控);camera.startPreview();/ 开始预览);/ 为surfaceHolder添加一个回调监听器surfaceHolder.addCallback(new Callback() Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) Overridepublic void surfaceCreated(SurfaceHolder holder) initCamera(); / 打开摄像头 Overridepublic void surfaceDestroyed(SurfaceHolder holder) / 如果camera不为null ,释放摄像头if (camera != null) if (ispreview)camera.stopPreview();camera.release();camera = null; System.exit(0););/ 设置该SurfaceView自己不维护缓冲 surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); Overridepublic void onPause()super.onPause();/退出程序 try if (camera!= null) camera.setPreviewCallback(null); / !这个必须在前,不然退出出错 camera.stopPreview(); camera.release(); camera = null; catch (Exception e) e.printStackTrace(); private void initCamera() if (!ispreview) camera = Camera.open();if (camera != null & !ispreview) try/* Camera Service settings*/ Parameters parameters = camera.getParameters();parameters.setPreviewSize(screenWidth, screenHeight); / 设置预览照片的大小parameters.setPreviewFpsRange(20,30); / 每秒显示2030帧/YCbCr_420_SP的格式(NV21)parameters.setPictureFormat(ImageFormat.NV21); / 设置图片格式parameters.setPictureSize(screenWidth, screenHeight); / 设置照片的大小/camera.setParameters(parameters); / Android2.3.3以后不需要此行代码camera.setPreviewDisplay(surfaceHolder); / 设置回调的类camera.setPreviewCallback(new Back(ipname); / 开始预览camera.autoFocus(null); / 自动对焦 catch (Exception e) e.printStackTrace();ispreview = true; /实现Camera.PreviewCall
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
提示  人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:基于Android手机的无线视频监控
链接地址:https://www.renrendoc.com/p-36648757.html

官方联系方式

2:不支持迅雷下载,请使用浏览器下载   
3:不支持QQ浏览器下载,请用其他浏览器   
4:下载后的文档和图纸-无水印   
5:文档经过压缩,下载后原文更清晰   
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

网站客服QQ:2881952447     

copyright@ 2020-2025  renrendoc.com 人人文库版权所有   联系电话:400-852-1180

备案号:蜀ICP备2022000484号-2       经营许可证: 川B2-20220663       公网安备川公网安备: 51019002004831号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知人人文库网,我们立即给予删除!