当前位置:   article > 正文

基于安卓的移动视频监控系统的设计与实现

基于安卓的移动视频监控系统的设计与实现

摘 要

随着网络通信技术和视频编解码技术的不断进步,视频监控系统也不断发展。目前,第三代视频监控技术即网络视频监控技术已经占据市场主流,人们对移动视频监控系统的市场需求也在日益扩大。与此同时,安卓智能手机市场飞速发展,安卓手机更新换代速率由以前的一年一代到如今的半年一代甚至三个月一代。移动设备的性能已经完全可以满足视频监控的硬件要求,而已经广泛应用的第四代移动通信技术和无线局域网技术完全可以满足传输高清网络视频的要求。因此,开发一个基于安卓手机的移动视频监控系统完全可行。
本文研究了基于安卓系统的视频监控实现所需要的技术,包括视频编解码技术,视频传输技术,流媒体播放,安卓界面设计等相关知识。
本监控系统包括视频采集端和视频播放端。视频采集端利用安卓手机的相机作为网络摄像头,实时采集监控数据,视频采集端采用MPEG编码技术对采集的图片进行编解码,并采用HTTP技术传输视频流。安卓客户端利用了基于VLC流媒体库的播放技术,可以远程实时播放摄像头监控的视频。
经过在一加手机和华为手机上测试,本视频监控软件具有良好的表现,性能和清晰度均达到设计要求,能够很好的实现视频监控功能。

关键词:视频监控;安卓系统;MPEG;HTTP

Design and implementation of mobile video monitor system based on Android

Abstract
With the network communication technology and video codec technology continues to progress, video monitor system is also evolving. At present, the third generation of video monitor technology has occupied the mainstream market, people demand on the mobile video monitor system market is also expanding. At the same time, Android smart phone market, the rapid development of Android mobile phone replacement rate from the previous generation to today’s semi-annual generation or even three months generation. Mobile device performance has been fully meet the hardware requirements of video monitor, and the fourth generation of mobile communication technology and wireless network technology meet the requirements of high-definition video transmission. Therefore, the development of a mobile phone based on android mobile video monitor system is feasible.
This article has studied the technology needed for Android video monitor implementation, including Android interface design language, video codec technology, video transmission technology, streaming media playback and other related knowledge.
The monitoring system includes video capture and video playback. Video acquisition using Android mobile phone camera as a web camera, real-time acquisition of monitoring data, video acquisition using MPEG encoding technology to capture the image encoding and decoding, and the use of HTTP technology to transmit video streams. Video player uses a VLC streaming library based on the playback technology, you can remotely play the camera real-time video recording.
By testing on mobile phone, the video monitor software has a good performance, performance and clarity are designed to meet the requirements, it can be a very good video monitor function.

Keywords: Video Monitor; Android System; MPEG; HTTP

目 录

摘 要 I
Abstract II
绪 论 1
1.1 课题来源 1
1.2 国内外研究状况 2
1.3 项目目标 4
1.4 本章小结 4
2 开发环境和相关技术介绍 5
2.1 开发环境 5
2.2 编程语言 5
2.3 关键技术 6
2.3.1 HTTP技术 6
2.3.2 Surfaceview 6
2.3.3 Java多线程 7
2.4 本章小结 7
3 需求分析和系统设计 8
3.1 可行性研究 8
3.2 系统总体设计 8
3.3 系统界面需求和设计 10
3.4 系统功能需求和设计 13
3.5 算法选择 13
3.6 本章小结 13
4 系统实现 14
4.1 界面实现 14
4.1.1 采集端界面模块实现 14
4.1.2 安卓端界面模块实现 16
4.2 系统功能实现 18
4.2.1 采集端预览模块实现 18
4.2.2 安卓端播放模块实现 21
4.2.3 PC端实现 22
4.3 系统实现结果和分析 23
4.4 本章小结 27
5 系统测试 28
5.1 界面和功能测试 28
5.1.1 采集端主界面测试 28
5.1.2 采集端设置界面测试 28
5.1.3 安卓端界面测试 29
5.1.4 安卓端功能测试 29
5.1.5 PC端测试 30
5.2 系统性能测试 30
5.3 本章小结 32
结 论 33
参 考 文 献 34
致 谢 35

绪 论

1.1 课题来源
说起视频监控,很多人的第一印象仍然是固定的前端摄像头和笨重的后端监视器。其实不然,近些年来,随着移动通信技术的飞速发展,视频监控网络化不断加快,基于互联网传输的移动视频监控技术正逐渐兴起。只要有网络的地方,我们就可以通过移动终端,查看监控画面,观看监控视频[1]。并且人们可以根据自己的需要添加报警装置,可以在电脑终端进行报警布防设置,一旦发现异常情况,网络移动终端可接到报警提醒,而且手机,平板摄像头的可移动性大大增加了安装监控系统的便利,也提高了监控系统的灵活性。手机,平板等移动终端真正的成为了我们的安全监视中心。随着人们对移动监控需求的不断增大,移动视频监控的应用场景也越来越丰富。家居视频监控和视频直播是移动监控的典型应用。
家居视频监控的发展是随着整个视频监控市场的不断进步而发展的。在视频监控发展初期,网络技术还很不发达,用户无法远程观看监控视频,只能在本地查看监控视频,当时主要的家居应用有:监视家庭保姆的工作情况;或者用户不放心小孩,老人一个人在家里,通过视频监控,照看老人或小孩。这个阶段的视频家居应用还很少,视频监控系统也多以模拟监控系统居多。基本配置为前端模拟摄像头和后端监视器,如果有录制监控视频的需求,还需要硬盘录像机。这个阶段家居视频监控的市场需求也很小,普通人几乎很少使用。后来伴随着网络通信技术的不断进步,家居监控也有了一定的发展,很多用户通过电脑的浏览器端或软件客户端来监视家里的情况,基于网络传输的远程视频监控系统开始兴起。但是由于受到网络费用,网络带宽和观看条件等因素限制,一般家庭使用还是少数。在这个家居视频监控阶段,一路监控视频大约需要256K的带宽,而且低带宽环境下的视频编解码技术也不成熟,应用到监控系统中的效果也不理想。现阶段,家居视频监控可以通过第四代移动通信技术或者无线局域网技术来实时监控家里的状况。家居视频监控的功能比以前也有了长足的进步。从初期的简单观看监视视频,到现在的报警,对讲,甚至双向视频,家居监控系统已经进入到我们每一个人的生活中。随着智能家居行业的兴起,家居智能监控的发展也越来越重要。
视频直播是移动视频监控的另一个应用场景。视频直播是指利用互联网及流媒体技术进行直播,视频因融合了图像、文字等丰富元素,声形并茂,效果极佳,逐渐成为互联网的主流表达方式。视频直播的实现方式:当视频主播发出直播请求后,服务器根据直播信息,将直播频道的播放地址返回给观众,观众访问播放地址即可观看视频直播。直播业务一般采用组播实现,而不是单播或者广播。因为IP组播群组成员的关系是动态的,用户主机可以随时加入或者推出IP群组。同单播和广播相比较而言,组播的效率是最高的,因为任何给定的链路最多使用一次,可以节省网络资源和网络带宽,降低成本。相对于传统的媒体而言,视频直播具有得天独厚的优势。视频直播的快捷性:随着网络的不断普及,人们对移动终端如手机,平板的使用越来越多。在无线通信技术如此发达的今天,这些便携式设备完全能够满足流媒体播放的硬件要求。而很多大事件的直播都是转瞬即逝的,即使时候可能会有相关的回放和介绍,但是观看直播的体验却是失不再来的。网络直播则很好的解决了这一个问题,只要有一台可以接入互联网的移动终端设备,你就可以看到你想看到的一切。视频直播的互动性:视频直播不仅可以让用户完整的看到事情发生的过程,让观众与直播现场更近一步,观众还可以通过论坛或者弹幕等形式发表自己的看法,与其他的观众一起交流讨论。这样直观方便的交流互动是传统媒体无法做到的。视频直播的灵活性:传统的电视节目播出时受到了线性传播的限制,用户无法选择自己想观看的节目,用户没有自主选择的权利。网络视频直播则很好地解决了这个问题。在视频直播结束后,视频被保存在相关的直播平台上,观众如果错过了直播观看,依然可以在任何时间,通过网络平台对录制的视频进行点播,这样的观看更加灵活,更加贴近受众。
现如今,随着互联网,大数据,物联网等技术的发展,移动视频监控也处于爆发式增长的阶段[2]。除了传统的安防企业,互联网企业,甚至家居企业,IT通信企业都加入到其中,移动视频监控的应用空间越来越广,发展前景也越来越明朗。
1.2 国内外研究状况
通常来说:视频监控系统的发展经历了三个阶段,分别是模拟监控时代,数字监控时代和网络视频监控时代。视频监控技术经过了多年的发展,视频监控画面从最初的D1标清画面,逐渐迈向1080p全高清,甚至4K超高清。随之而来的问题是,前端采集设备像素的提高给视频编解码和后端存储设备带来了巨大的压力。因此,视频编解码技术成为了视频监控技术发展的焦点,也是当前视频监控厂商技术竞争最激烈的地方。目前国内主流厂商的使用的视频编解码普遍使用的是MPEG-4和H.264编解码技术。当然,随着H.265技术的不断成熟,凭借其更优越的性能表现,将会逐步取代MPEG-4和H.264成为主流。在世界范围内,目前的视频监控领域,基本保持着H.264/MPEG-4为主,H.265和SVAC为辅的局面[3]。下面对常用的视频编解码概念和技术进行介绍并分析其优缺点。
MPEG-4编码技术:Moving Pictures Experts Group,是一个致力于运动图像的压缩编码标准化工作的组织[4]。MPEG-4是在MPEG-1和MPEG-2基础上发展改进而来的。MPEG-4标准是基于内容和对对象的编码标准,和传统的图像编码方式不同,MPEG-4只处理帧和帧之间的差异元素,即抛弃相同图像元素,大大减少了编码后合成视频文件的体积,和传统的图像编码相比,同样的文件体积,可以还原得到更清晰的图像。换句话说,相同的原始图像,MPEG-4技术具有更高的压缩比。MPEG-4在2000年正式成为国际标准。MPEG-4仍是当前视频监控系统的主流编解码技术。
H.263编解码技术:H.263视频编码标准是专为中高运动图像压缩所设计的低码率图像压缩标准[5]。H.263技术采用运动视频编码中常用的编码技术,将编码过程分为帧内编码和帧间编码两个过程。.263技术相对于之前的编码技术具有编码技术快,码率低,适用于网络条件不是很好和需要双向编解码的场合。
H.264编解码技术:H.264技术是国际标准化组织和国际电联联合制定的视频编解码标准,它也是MPEG-4技术的第十部分。H.264技术相对于其他编解码技术最大的优势是具有极高的压缩比[6]。在同等图像质量条件下,H.264的压缩比是MPEG-4的1.5倍到2倍左右。在视频监控系统的应用中,H.264低压缩比的特点起到了极大的作用,用户在观看到到高清的视频时,节省了网络带宽和成本,节约了下载时间和存储空间。H.264编解码流程包括五个部分:帧内和帧间预测,变换和反变化,量化和反量化,环路滤波和熵编码。在H.264的发展过程中,高性能的DSP对H.264标准的应用起到了重要作用。目前市场上主流监控设备基本采用的是H.264技术标准。
H.265编解码技术:随着前端视频采集设备清晰度的不断提高,从300万到500万,鱼眼相机甚至已经达到了1200万像素值,这意味着视频监控的超高清时代已经到来。但是监控系统所生成的视频文件体积也不断变大,超高清的视频体验带来的是传输的巨大压力,因此对视频编解码技术的要求也进一步提高。举例来说,1路24帧的1080P视频,原始数据流畅传输的要求大约是1G以上,采用H.264编码技术压缩后,可以获得6M甚至4M的传输码流,如果换成前端采集设备采集2K分辨率以上的原始视频,如果仍然采用H.264压缩技术,那么所需要的码流是20M以上。因此需要一种性能更高的压缩技术来满足超高清视频压缩的需求。所以,H.265技术应运而生。H.265编码技术是国际电联在制定H.264标准之后制定的新的视频编解码标准[7]。H.265保留了H.264技术的优点,并对相关技术进行了改进。新技术着重改善了延迟,编码质量和码流和算法复杂度的问题,达到最优设置。H.264由于算法优化,可以以低于128KB/s的速率传输标清视频,相同条件下,H.265可以传送普通高清视频。如今,H.265技术已悄然兴起,各个厂家也积极的宣传推广H.265技术。预计未来的几年内,H.265技术将成为视频监控设备的主流编解码技术。
SVAC编解码技术:SVAC技术是中星微电子和公安部联合制定的一套视频编解码标准。SVAC技术是中国自主知识产权,不是国际性标准。SVAC标准目的在于加强安防视频监控系统和公安报警平台的安全应用。从编码效率上来来讲,SVAC技术优于H.264,但是不如H.265。目前国内支持支持SVAC标准的厂家不多,国内视频监控知名厂商还是多以H.264和MPEG-4为主,但也有少量设备只SVAC标准[8]。目前从市场来看,从强制试点推行开始,基本上所有的厂家的视频监控设备都要支持SVAC标准,已经有大量的前端设备开始使用SVAC标准,相信在不久的将来,具有中国自主技术的SVAC标准将在国内得到普遍支持和应用。
1.3 项目目标
本项目旨在建立一个安卓的视频监控系统。现在安卓手机市场迅速发展,安卓新机的发布频率也由以前的一年一次到现在的半年甚至两三个月一次,安卓手机更新换代速度越来越快,智能设备普及率越来越高,每个人都有一部甚至多部智能手机。在用户对手机进行更新换代的时候,难免有旧的设备闲置下来。通过安装一个安卓视频采集软件,即可将安卓手机变身为网络摄像头安置在家里或办公室进行监控,用户可以在PC端或安卓手机上实时观看监控情况。本项目打算开发一个轻量级的移动视频监控系统,本移动视频监控系统包括安卓视频采集端,电脑客户端和安卓手机客户端。电脑客户端和手机客户端可以选择观看源(可能有多个由安卓手机搭建的网络摄像头组),客户端可设置摄像头参数,同时可以对视频实现回放,暂停,截屏,等功能。
1.4 本章小结
本章介绍了本安卓视频监控系统的来源和实际应用,研究了视频监控传输过程中的关编解码技术和当前移动视频监控编码技术的发展,介绍了本项目的想要实现的目标和意义。

2 开发环境和相关技术介绍

2.1 开发环境
本移动视频监控基于安卓操作系统开发。安卓操作系统是由谷歌公司带领开发的移动操作系统。安卓系统主要安装在移动终端设备上,如智能手机和平板等设备[9]。安卓应用一般由四大组件构成。四大组件分别是:活动,服务,广播接收器和内容服务器。活动是安卓应用的主界面,是软件与用户交互的界面,也是用户体验最直观的地方,安卓是一个用户友好的操作系统。其次相对于其他移动操作系统,安卓平台有以下不可替代的优点:首先安卓有着数量丰富的控件,安卓系统为开发者提供了丰富的系统控件,利用这些控件,开发者可以开发操作简单,界面漂亮的软件,同时,借助这些控件可以满足一些设计需求,如一些布局控件。其次安卓系统是一个开源的系统,开源意味着安卓系统给开发者提供了自由开放的开发环境,就会有更多的厂家和开发者加入安卓阵营。同时也给用户带来了丰富的硬件选择[10]。最后,安卓系统具有完整的文件权限,支持扩展存储,方便进行视频录制,截屏等文件操作。
最近几年,安卓手机市场份额持续增长,根据2016年市场份额统计,安卓系统占全球智能手机86.2%的市场份额,根据预测,在2018,2019年安卓市场份额仍会增长。因此,选择安卓系统进行开发,软件的升级维护都可以得到保障,同时借助安卓系统的高占有率,也方便软件的发布推广。
本移动视频监控系统基于Android Studio开发。Android Studio是谷歌开发的安卓开发工具。相对于Eclipse,Android Studio具有启动速度快,UI更漂亮,完善的插件系统,整合了gradle构建工具和完美整合版本控制等优点。因此,本次开发使用Android Studio开发工具。
2.2 编程语言
本移动视频监控系统采用Java语言进行开发。Java语言是一种面向对象开发的程序设计语言。Java语言吸收了C++和其他语言的优点,而且Java语言有自己独特的有点。Java语言支持多线程并发设计,支持多媒体数据控制,支持网络传输。Java语言的主要特性如下:Java语言是面向对象的程序设计语言。Java语言提供了丰富的类,继承和接口的支持,Java语言支持接口之间的多继承,支持用implements完成类与接口之间的实现机制。其次,Java语言是分布式的。语言。在Java的应用编程接口中有一个网络应用编程接口,这个接口提供了网络编程接口的类库。Java语言是一种高性能的语言。与解释性的高级脚本语言相比,Java语言是高性能。Java语言还有一个最重要的有点就是Java程序的健壮性。Java语言的异常处理,强类型机制是Java语言健壮性的保证,丢弃指针是Java语言明智的选择。同时,Java语言的安全检查机制使得Java语言更具有健壮性。因此,采用Jav语言开发本移动视频监控系统。
2.3 关键技术
2.3.1 HTTP技术
HTTP (Hypertext Transfer Protocol ),中文全称是超文本传输协议,HTTP协议在osi七层模型的应用层,由于其简捷、快速的方式,适用于分布式超媒体信息系统。HTTP协议主要有以下特点:HTTP协议支持客户端/服务器模型,如浏览器中的文本和图像传输就用到了HTTP协议[11]。HTTP协议灵活,它可以传输不同类型的数据,正在传输的类型由Content-Type加以标记即可。与TCP协议不同,HTTP协议是一种无连接的协议,所谓无连接的含义是:客户端发起请求后,服务器不需要发送确认,直接发送带传输的数据即可。服务器发送完客户端请求的数据,收到客户端的应答,即可断开连接。这种传输方式减少了连接建立的时间,可以节省传输时间,提高传输效率。HTTP协议是一种无状态的协议:同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息。
2.3.2 Surfaceview
Surface是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像合成器(screen compositor)管理[12]。就像在C语言中一样,通过一个文件的句柄,就可以获得文件内容,控制文件。同理,通过Surface就可以获得图像缓冲区的内容。SurfaceView提供了一个专门用于绘制的surface,你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface在屏幕的正确绘制位置。简单来说,SurfaceView与Surface的联系就是,Surface是管理显示内容的数据(implementsParcelable),包括存储数据的交换。而SurfaceView就是把这些数据显示出来到屏幕上面。可以通过SurfaceHolder这个接口去访问Surface,而执行getHolder()方法可以得到SurfaceHolder接口。 当SurfaceView的窗口可见时,Surface就会被创建,当SurfaceView窗口隐藏时,Surface就会被销毁。当然了,你也可以通过复写surfaceCreated(SurfaceHolder) 和surfaceDestroyed(SurfaceHolder)这两个方法来验证一下Surface何时被创建与何时被销毁。所有SurfaceView 和 SurfaceHolder.Callback的方法都应该在主线程(UI线程)里面调用,应该要确保渲染进程所访问变量的同步性。你必须确保只有当Surface有效的时候,才能让渲染进程访问。简单来说,SurfaceView与Surface的联系就是,Surface是管理显示内容的数据,包括存储于数据的交换。而SurfaceView就是把这些数据显示出来到屏幕上面。SurfaceHolder是控制surface的一个抽象接口,你可以通过SurfaceHolder来控制surface的尺寸和格式,或者修改surface的像素,监视surface的变化等等,SurfaceHolder是SurfaceView的典型接口。SurfaceHolder.Callback是监听surface改变的一个接口。
2.3.3 Java多线程
线程,是程序执行的最小单元,不具有自己的内存单元,与同一进程当中的其他线程共享全部的资源,使用多线程可以合理的利用计算机的资源,提高处理效率。
Java多线程实现的方法有两种,第一实现Java.land.Runnable接口,实现它的Run()方法,并将线程的执行主体放入其中;第二,Java.lang.Thread,重写它的Run()方法,然后将线程的执行主体放入其中。这两种实现方法,继承Thread类方法实现起来比较简单,但是继承Thread类之后就不能继承其他的类了,也就不能继承别的类中我们想使用的方法了。而使用Runnable()方法就不存在这种问题,这种实现方式将线程主题和线程对象分离开来,逻辑上比较清晰,更推荐使用Runnable()方法。
2.4 本章小结
本章介绍了开发本系统所用到的开发语言,开发环境和相关技术,为接下来的开发做了准备工作 ,保证项目顺利进行。

3 需求分析和系统设计

3.1 可行性研究
在开发一个软件时,首先要考虑的就是可行性分析。可行性分析也成为可行性研究,合理的可行性分析可以明确开发的目的,减小开发的盲目性,避免浪费人力额和资源。可行性研究一般从以下三个方面着手:
(1)经济可行性
伴随着手机硬件行业的不断进步和移动通信技术的迅速发展,安卓智能手机的价格也逐渐平民化,无线局域网和移动网络的接入也很方便。在移动互联网迅速发展的时代,每个人都有一部甚至多部智能手机,而安卓移动视频监控所需的仅需要一部安卓手机,因此,开发一个基于安卓平台的移动视频监控系统在经济上是完全可行的。
(2)技术可行性
开发一个安卓的视频监控系统,需要的技术有视频编解码技术,网络传输技术,流媒体传输技术。安卓程序多用Java语言开发,本次开发所用的技术有完整的安卓的类库支持。因此,在技术上,开发是完全可行的。
(3) 操作可行性
安卓终端安装视频采集软件,可充当IP摄像头,操作简单,在安卓端或PC端观看,因此操作可行。
3.2 系统总体设计
本视频监控系统由视频采集端,服务器端和客户端组成。由安卓手机充当视频采集端,客户端包括电脑客户端和手机客户端。本视频监控系统操作容易,上手简单。
本视频监控系统结构图如图3.1所示:

在这里插入图片描述

图3.1 系统结构图

软件开发时,首先要设计好软件的各个模块,合理的模块设计才能使软件正常运行,系统正常运转。本移动视频监控系分为视频采集端,电脑客户端和手机客户端三个部分。视频采集端由预览模块,编码模块,和传输模块组成。手机客户端由界面模块和播放模块组成。电脑客户端由播放模块和设置模块组成。
(1)视频采集端模块图如图3.2所示:
在这里插入图片描述

图3.2 视频采集模块图

(2)手机客户端模块图如图3.3所示:

在这里插入图片描述

图3.3 手机客户端模块图

(3)电脑客户端模块图如图3.4所示:
在这里插入图片描述

图3.4 电脑客户端模块图

3.3 系统界面需求和设计
软件的界面是用户日常接触最多的地方,是用户与硬件互动的窗口。软件界面一方面要清晰的展示出软件的功能,另一方面也要给用户良好的视觉审美效果。科学合理的用户界面可以简化用户操作,方便用户使用[13]。判断一个软件界面是否合理,是否对用户友好,应在满足用户需求的同时优化操作逻辑,满足用户审美需求,为用户提供最大的便利。开发者在开发的时候,不仅要满足用户的功能需求,也要满足用户的审美需求,为用户提供良好的人机交互体验。用户界面设计的主要原则如下:一致性原则。用户界面设计最重要的原则就是一致性原则,用户界面设计最重要的事情就是保持界面运行的一致。对于选择列表框来说,如果要保持一致性原则就应该保持按下一个按钮与按下所有按钮的响应事件是相同的。保持用户界面的一致性可以降低用户的学习成本,有利于软件推广。
本视频监控系统的视频采集端由主界面和设置界面组成。主界面是摄像头预览界面,在主界面应当展示服务器的相关信息。在主界面可以点击设置按钮,选择摄像头,设置闪光灯,设置视频源参数等。
客户端界面可自主选择输入服务器地址,还可以选择不同的监控源,客户端界面还内置了常用的服务器地址。客户端界面还有操作提示,提示如何使用客户端。
本移动视频监控系统的软件设计本着简化操作,功能明确的设计目的,设计如下:
(1)采集端设计
采集端屏幕显示的是摄像头的预览,为了方便用户查看服务器地址,可以在预览界面显示相关使用信息。同时应当有一个设置按钮,在二级菜单中可以对相关参数进行修改。
采集端主界面设计图如图3.5所示:

在这里插入图片描述

图3.5 采集端主界面设计图

采集端设置示意图如图3.6所示:

在这里插入图片描述

图3.6 采集端设置设计图

(2)手机客户端设计
客户端界面首先应当有简单明了的使用指南。因为本移动视频监控系统可能有多个网络摄像头,因此在客户端界面应当有摄像头选择按钮。同时,在客户端也应该可以对摄像头的相关参数进行设置的按钮。
在这里插入图片描述

图3.7 手机客户端主界面设计图

(3)PC端界面设计:
在PC端应该可以对摄像头的相关参数进行设置的选项。同时为了充分利用屏幕空间,应当可以实现分屏播放功能。PC端界面如图3.8所示:

在这里插入图片描述

图3.8 PC端设计图
3.4 系统功能需求和设计
此移动视频监控系统采集端实现的功能主要有:
(1)采集端主界面可以显示服务器信息,采集端可设置调用前后摄像头,可设置调用闪光灯,可设置采集视频流的清晰度和分辨率。
(2)手机客户端可实现实时播放监控视频,并可以回放,暂停等功能。、系统采集端应当实现如下功能:首先可以进行摄像头的选择,由用户选择使用前置或后置摄像头。其次为了夜间监控需要,用户应当可以选择是否使用闪光灯。 最后还应当可以设置视频分辨率和帧数。
(3)电脑客户端可实现实时播放,暂停,回放等。电脑客户端还可以实现二分屏播放,可以切换不同的视频源,选择不同的摄像头播放不同的监控画面。
3.5 算法选择
本视频监控系统选择MPEG编码技术和HTTP传输技术。相对于其他的编解码技术,MPEG技术可以获得更清晰的图像质量,互联网通信技术飞速发展,网络完全能够满足高清传输的需求。因此选择MPEG编码技术。HTTP是无连接的传输技术,可以减少传输延迟,因此选择HTTP技术传输。
3.6 本章小结
本章首先介绍了本移动视频监控系统实现的可行性。然后描述了系统的结构和组成,系统的界面需求设计和系统的功能需求设计,最后介绍了系统实现的算法选择。

4 系统实现

4.1 界面实现
4.1.1 采集端界面模块实现
采集端界面实现效果如图4.1,图4.2所示:

在这里插入图片描述

图4.1 主界面实现图
在这里插入图片描述

图4.2 设置界面实现图

(1)安卓软件的设置界面模块大部分都是从Preference Activity类继承下来的。Preferences Activity是Android中专门用来实现程序设置界面及参数存储的一个Activity。而Shared Preferences是安卓系统提供的一个轻量级的存储类,主要用于保存一些配置信息,比如窗口状态,还有一切其它无关紧要的配置,每次都即拿即用的数据。这里我们用Preferences Activity类和preferences.xml来实现添加设置按钮功能。总体思路是使用一个On create()方法来实现窗口更新,从而显示服务器信息。
OnCreate()是一个消息响应函数,是响应WM_CREATE消息的一个函数,而WM_CREATE消息是由Create函数进行调用的。一个窗口创建之后,会向操作系统发送WM_CREATE消息,OnCreate()函数主要是用来响应此消息的。因为在MFC里面用一种消息映射的机制来响应消息,也就是可以用函数来响应相应的消息。就拿CMainFrame类来说,当窗口创建后会产生WM_CREATE消息,我们可以在OnCreate函数里实现我们要在窗口里面增加的东西,例如按扭,状态栏,工具栏等。
(2)在surfacepreview界面绘制完成后,调用addPreferencesFromResource()
方法,更新界面,界面布局的设置在preferences.XMl文件中。
Protected void onCreate (final Bundle savedInstanceState)
{
Super.OnCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
Preferences.xml中的设置如下:
显示设置界面中的摄像头
android:key=“camera”
android:title=“摄像头”/>
显示设置界面中的端口号
android:key=“port”
android:title=“端口号”
android:inputType=“number”
android:defaultValue=“8080” />
显示设置界面的视频分辨率
android:key=“size”
android:title=“视频分辨率”/>
显示设置界面的视频质量
android:key=“jpeg_quality”
android:title=“视频质量”
android:inputType=“number”
android:defaultValue=“40” />
(3)利用setOnPreferenceClickListener()方法完成监听按下设置按钮事件,当按下摄像头设置按钮式时,实现摄像头选择。
SetOnPreferenceClickListener(new OnPreferenceClickListener())
{
@Override
public boolean onPreferenceClick(Preference preference)
{
setCameraPreferences(cameraPreference);
return false;
}
}
同理,视频分辨率和闪关灯设置也是如此。
SetOnPreferenceClickListener(new OnPreferenceClickListener())
{
@Override
OnPreferenceClick(Preference preference)
{
SetSizePreferences(sizePreference, cameraPreference);
return false;
}
}
4.1.2 安卓端界面模块实现
(1)安卓布局介绍:安卓有五大布局:线性布局,相对布局,帧布局,表格布局和绝对布局。线性布局,是5种布局最常用的一种,从字面上也比较好理解,就是布局呈线性的,这种布局在显示组件的时候会默认保持组件之间的间隔以及组件之间的互相对齐。线性布局显示组件的方式有两种方式:垂直和水平,是通过orientation来设定的。线性布局的常用属性如下:android:orientation 表示布局方向,取值vertical表示垂直布局,取值horizontal表示水平布局,android:gravity 表示视图的对齐方式。内容包括:top、bottom、left、right、center_vertical、center_horizontal等。布局中的视图可以使用如下属性android:layout_gravity 表示单个视图的对齐方式,android:layout_weight 表示单个视图所在大小的比重,当layout_weight为0时,视图大小由自身确定,当layout_weight大于0时,视图在线性布局方向上根据比重拉伸。
这里我们的软件采用线性布局设置,界面实现效果如图4.3所示:

在这里插入图片描述

图4.3 手机客户端实现图

(2)首先利用activity_main_demo.xml绘制界面视图

          <Button
             android:id="@+id/button1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="设置1" />
  • 1
  • 2
  • 3
  • 4
  • 5

完成界面绘制和按钮设置。
然后利用items = new ArrayList()方法在界面上添加可点击链接。
items.add(“http://192.168.201.2:8080/–摄像头1–/”);
items.add(“http://192.168.201.3:8080/–摄像头2–/”);
items.add(“http://192.168.201.4:8080/–摄像头3–/”);
items.add(“http://192.168.201.5:8080/–摄像头4–/”);
items.add(“http://192.168.201.6:8080/–摄像头5–/”);
即可完成整个主界面绘制。
4.2 系统功能实现
4.2.1 采集端预览模块实现
(1)SurfaceView
SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。你可以通过SurfaceHolder接口访问这个Surface,用getHolder()方法可以得到这个接口。当surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。
(2)SurfaceHolder
   SurfaceHolder是surface的抽象接口,可以控制surface的大小和格式, 以及在surface上编辑像素,和监视surace的改变。这个接口通常通过SurfaceView类实现。
3. SurfaceHolder.Callback
  用户可以实现此接口接收surface变化的消息。当用在一个SurfaceView 中时, 它只在SurfaceHolder.Callback.surfaceCreated()和SurfaceHolder.Callback.surfaceDestroyed()之间有效。设置Callback的方法是SurfaceHolder.addCallback[14]。使用SurfaceView有一个原则,所有的绘图工作必须得在Surface被创建之后才能开始(Surface—表面,这个概念在图形编程中常常被提到。基本上我们可以吧它当做显存的一个映射,写入到Surface的内容可以被直接复制到显存从而显示出来,这使得显示速度回非常快),而在Surface被销毁之前必须结束。所以Callback中的surfaceCreated和surfaceDestroyed就成了绘图处理代码的边界。
(4)CameraPreview的实现方式:首先定义一个类实现Camera.PreviewCallback接口,然后在它的onPreviewFrame(byte[] data, Camera camera)方法中即可接收到每一帧的预览数据,也就是参数data。然后使用setPreviewCallback()、setOneShotPreviewCallback或setPreviewCallbackWithBuffer()注册回调接口。surface被创建后,系统会自动调用surfaceCreated()方法,当surface被销毁时,会调用surfaceDestroyed()方法。
(5)具体实现
首先当surface第一次创建时调用surfaceCreated()方法
Public void surfaceCreated(final SurfaceHolder holder)
{
mPreviewDisplayCreated = true;
tryStartCameraStreamer();
}
然后打开摄像头:
final Camera camera = Camera.open(mCameraIndex);
获取摄像头相关参数:
final Camera.Parameters params = camera.getParameters();
设置预览帧帧数:
finalCamera.SizeselectedPreviewSize = supportedPreviewSizes.get(mPreviewSizeIndex);
对闪光灯进行设置:
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
获得视频帧的输出格式:
mPreviewFormat = params.getPreviewFormat();
设置视频帧的尺寸:
mPreviewWidth = previewSize.width;
mPreviewHeight = previewSize.height;
设置视频帧的的缓冲区大小:
mPreviewBufferSize = mPreviewWidth * mPreviewHeight * bytesPerPixel * 3 / 2 + 1;
获取视频预览帧的接口:
Camera.setPreviewCallback(new Camera.PreviewCallback())
{
@Override
public void onPreviewFrame(byte[] data, Camera camera)
{
preview = true;
}
}
当Surfaceview销毁时释放摄像头
Public void surfaceDestroyed(SurfaceHolder holder)
{
if(camera != null)
{
if(preview)
{
camera.stopPreview();
preview = false;
}
camera.setPreviewCallback(null);
camera.release();
}
}
(5)然后介绍在摄像头显示界面显示ip地址
首先利用得到tryGetIpV4Address方法得到 ip地址:这里采用try和catch来处理ip地址为回环地址的情况
try {
final InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress())
{
if (InetAddressUtils.isIPv4Address(addr))
{
return addr;
}
}catch (final Exception e)
}
然后利用on create方法在preview窗口创建后更新界面,显示服务器地址信息
Protected void onCreate(final Bundle savedInstanceState)
{
mIpAddress = tryGetIpV4Address();
mIpAddressView = (TextView) findViewById(R.id.ip_address);
updatePrefCacheAndUi();
}
即可实现在摄像头预览界面显示服务器信息。
4.2.2 安卓端播放模块实现
(1)总设计实现如下所述:
第一步 :通过findViewById或者new PlayerView()得到mPlayerView对象
mPlayerView= new PlayerView(PlayerActivity.this);
mPlayerView = (PlayerView) findViewById(R.id.pv_video)
第二步:设置参数,毫秒为单位
mPlayerView.setNetWorkCache(20000);
第三步:初始化播放器
mPlayerView.initPlayer(mUrl);
第四步:设置事件监听,监听缓冲进度等
mPlayerView.setOnChangeListener(this);
第五步:开始播放
mPlayerView.start();
(2)具体实现如下:
第一步 :通过findViewById或者new PlayerView()得到mPlayerView对象
findViewById(R.id.btn_play).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
if (!TextUtils.isEmpty(url))
{
startActivity(newIntent(DemoActivity.this, PlayerActivity.class).putExtra(“url”, url));
}
}
}
第二步:设置参数,毫秒为单位
mPlayerView.setNetWorkCache(20000);
第三步:初始化播放器,利用init()方法初始化播放器
private void init()
{
try {
mLibVLC = LibVLC.getExistingInstance();
if (mLibVLC == null)
{
mLibVLC = LibVLC.getInstance();
}
} catch (LibVlcException e)
throw new RuntimeException(“PlayerView Init Failed”);
}
第四步:设置事件监听,监听缓冲进度等
mPlayerView.setOnChangeListener(this);
第五步:开始播放,mPlayerView.start();部分代码如下
public void start()
{
mLibVLC.eventVideoPlayerActivityCreated(true);
EventHandler.getInstance().addHandler(eventHandler);
mLibVLC.playIndex(0);
mSurface.setKeepScreenOn(true);
mLibVLC.setHardwareAcceleration(LibVLC.HW_ACCELERATION_DISABLED)
}
至此完成播放过程。
4.2.3 PC端实现
PC端实现图如图4.4所示:

在这里插入图片描述

图4.4 PC端实现图
界面通过html5+css实现,通过html5自带的img标签来接受视频采集端发送的视频流。理论上img标签用于展示图片,但是通过浏览器功能扩展可以和采集端建立socket连接,进而以HTTP方式发送requedst或接受response。
界面中的视频源切换按钮是利用input标签实现,(介绍下input标签,包括button,test等各种类型)用户点击type为button的视频源切换按钮,会触发点击效果,进而执行对应的javascript代码。这里的javascript代码的主要功能就是修改img标签的src即视频来源地址,一旦src被修改,img标签请求的地址也会被更新,这样就实现了切换。
4.3 系统实现结果和分析
(1)实现结果:本人在校园内采集了两组目标相同,分辨率不同的视频图像,并做了简单分析。第一组如图4.5,图4.6,图4.7,图4.8,图4.9所示:

在这里插入图片描述

图4.5 图书馆1080P

在这里插入图片描述

图4.6 图书馆720P

在这里插入图片描述

图4.7 图书馆480P

在这里插入图片描述

图4.8 图书馆320P

在这里插入图片描述

图4.9 图书馆240P

第二组如图4.10,图4.11,图4.12,图4.13,图4.14所示:

在这里插入图片描述

在这里插入图片描述

(2)结果分析
在网络环境比较好的的情况下,视频分辨率为1080P和720P皆可流畅播放,几乎没有丢帧的情况,480P以下都可以流畅播放,完全无丢帧的情况发生。在网络环境比较差的情况下,在分辨率为1080P,采集帧数为24帧的情况下,播放卡顿,丢帧严重,而720P可流畅播放,几乎没有丢帧的情况,480P以下都可以流畅播放。通过对比可以发现,在网络带宽良好的情况下,更推荐设置视频分辨率720P或1080P,获得良好的视频质量,而网络带宽比较差的时候则推荐设置分辨率为480P及480P一下来获得流畅的观看体验。
表4.1 图书馆采集结果分析表
视频分辨率 采集帧数 网络带宽 播放结果
1080P

720P

480P

320P

240P 24

24

24

24

24 4Mb 流畅,延迟稍高,无丢帧

4Mb 非常流畅,无丢帧

4Mb 非常流畅,无丢帧

4Mb 非常流畅,无丢帧

4Mb 非常流畅,无丢帧

表4.2 教学区采集结果分析表
视频分辨率 采集帧数 网络情况 播放结果
1080P

720P

480P

320P

240P 24

24

24

24

24 1Mb 卡顿,不流畅,丢帧严重

1Mb 基本无卡顿,无丢帧

1Mb 非常流畅,无丢帧

1Mb 非常流畅,无丢帧

1Mb 非常流畅,无丢帧

4.4 本章小结
本章介绍了采集端和客户端的具体实现方法,介绍了surface,surfaceview,surfaceholder等相关概念以及开发用到的技术,介绍了本系统几个模块的具体实现方法,实现这几个功能模块之后,就形成了一个功能完整的系统。

5 系统测试
软件系统常用的测试方式有两种:黑盒测试和白盒测试。黑盒测试又叫数据驱动测试或功能测试。黑盒测试主要可以发现系统是否有遗漏的功能,系统是否能正确接受的输入,输出正确的结果。白盒测试是测试人员利用程序内部的逻辑结构检测系统动作是否按规格说明书运行[15]。
在这里我们首先对系统进行功能测试,然后对系统进行性能测试。功能测试是黑盒测试的一部分,功能测试主要测试软件功能是否符合用户需求。性能测试则是软件测试的高端领域。性能测试主要测试软件的时间性能和空间性能。
5.1 界面和功能测试
5.1.1 采集端主界面测试
(1) 测试机型:一加手机
(2) 系统:Android 6.0
(3) 测试过程:启动软件,测试主界面主要看页面是否正常显示,设置按钮是否可以正常使用。详细测试过程见表5.1。
(4) 结论:主界面显示正常,可以看到摄像头预览的画面,可以正确显示服务器信息。设置按钮可以正常使用,点击设置按钮可以进入设置界面。

表5.1 主界面测试用例
信息输入 信息输出 结论
N/A 显示服务器信息和预览界面 功能正常
用户点击设置按钮 进入摄像头设置选项 功能正常

5.1.2 采集端设置界面测试
(1) 测试机型:一加手机
(2) 系统:Android 6.0
(3) 测试过程:点击设置按钮进入设置界面,看设置界面显示是否正确,并点击设置界面的按钮测试各项功能,具体测试过程见表5.2。

表5.2 设置界面测试用例
信息输入 信息输出 结论
用户点击摄像头按钮
弹出对话框选择前后摄像头 功能正常
用户点击闪光灯按钮
弹出对话框选择闪光灯开关 功能正常
玩家点击端口号按钮
默认端口号为8080,可自由设置 功能正常
玩家点击视频分辨率按钮
弹出对话框,用户可以选择不同的分辨率 功能正常
玩家点击视频帧数按钮 弹出对话框,默认帧数为24帧,用户可自由设置 功能正常

(4) 结论:设置界面显示正常,可以正常进行设置选项。用户可以通过设置选择前后摄像头,设置闪光灯,分辨率等。
5.1.3 安卓端界面测试
(1) 测试机型:一加手机
(2) 系统:Android 6.0
(3) 测试过程:启动客户端并进行相关按钮测试,具体测试过程见表5.3。

表5.3 手机客户端界面测试用例
信息输入 信息输出 结论

用户输入服务器信息,点击播放按钮

跳转到播放界面 功能正常

用户选择不同摄像头
跳转到播放界面 功能正常

用户点击设置按钮 进入到设置选项 功能正常

(4) 结论:播放器界面运行正常,点击按钮可正常跳转,播放界面可以正常显示。
5.1.4 安卓端功能测试
(1) 测试机型:一加手机
(2) 系统:Android 6.0
(3) 测试过程:通过模拟使用软件场景,测试摄像头设置是否生效,夜间是否可以打开闪光灯,视频分辨率和帧数调节是否正确。测试客户端能否正常播放,暂停,短时间回放,截屏等功能。详细测试过程如表5.4
(4) 结论:系统功能测试正常,所测试功能都正常实现。

表5.4 安卓端功能测试用例
信息输入 信息输出 结论
点击设置按钮设置分辨率和帧数
设置成功 功能正常
点击打开闪光灯 闪光灯打开
功能正常
点击摄像头播放
播放成功 功能正常
输入服务器信息播放 播放成功
功能正常
点击暂停按钮

点击回退按钮

点击截屏按钮 播放暂停

短暂回退

截屏成功,保存到本地目录 功能正常

功能正常

功能正常

5.1.5 PC端测试
(1) 测试机型:windows电脑
(2) 系统:windows 7
(3) 测试过程:通过模拟使用软件场景,测试能否正常播放,能否进行相关设置。详细测试过程如表5.5
(4) 结论:系统功能测试正常,所测试功能都正常实现。

表5.5 PC端功能测试用例
信息输入 信息输出 结论
点击设置按钮设置分辨率和帧数
设置成功 功能正常
点击打开闪光灯 闪光灯打开
功能正常
点击摄像头播放 播放成功 功能正常

5.2 系统性能测试
(1) 测试机型:一加手机
(2) 系统:Android 6.0
(3) 测试目的:通过测试不同分辨率和帧数,在满足用户需求的前提下,选择最合适的监控配置方案。
(4) 测试过程:分别测试1440p,1080p,720p,480p在不同帧数的播放流畅程度,选择最合适的监控方案。
(5) 测试结果如表5.6所示:

表5.6 性能测试用例
分辨率 帧数 播放效果
25601440p 60
卡顿严重,丢帧
2560
1440p

2560*1440p 30

24 卡顿严重,丢帧

流畅,基本无卡顿

1920*1080p

1920*1080p

1920*1080p 60

30

24 轻微卡顿

流畅,无卡顿

流畅,无卡顿

1280*720p

1280*720p

1280*720p

640*480p

640*480p

640*480p
60

30

24

60

30

24
流畅,无卡顿

流畅,无卡顿

流畅,无卡顿

流畅,无卡顿

流畅,无卡顿

流畅,无卡顿

(6)测试结果分析:视频客户端端在1080p下虽然播放流畅,但是手机发热较为严重,因此不推荐设置1080p作为默认设置,在720p下流畅播放,并且长时间监控手机发热量也很少,视频清晰度也很高,因此推荐设置720p,30帧作为默认播放设置。
5.3 本章小结
本章前面开发出来的系统在不同的机型上面进行了测试,由于经济和人力方面的限制,本应用只在3种模拟器(Nexus 5、Nexus One、QVGA mdpi)和两台台真机上进行了测试,经测试在上述机型上都可以正常运行。

结 论

本项目实现了基于安卓的移动视频监控系统,主要实现了如下功能:1:通过安卓移动视频监控软件将安卓手机变为网络摄像头,实现视频采集功能。2:用户可以通过安卓手机客户端和PC客户端端观看监控视频,并可以对摄像头进行设置。使用本系统,用户可以在监控领域如家里,办公室安置采集端,可以实现远程观看。
本项目的主要工作有:1:了解移动视频监控系统的发展和实现方案,构建自己的移动视频监控系统模型。2:设计监控系统界面并设计监控系统的功能。本项目的主要优点有:1:视频采集端采集的视频分辨率高,甚至可以采集2K视频流,可以满足用户对视频清晰度的要求。2:本移动视频监控系统是一个轻量级的视频监控系统,软件体积小,功能实现较为完整,使用简单,容易操作。本项目由于本人安卓开发经验的不足以及时间上的限制,还有很多不足之处。只是简单的实现了视频监控功能,如安卓端分屏播放,PC端动作识别捕捉等高级功能都没有实现,还有很多可以改进之处。
安卓项目开发并不是一件简单的事情,尤其是自己一个人完成开发,设计等工作。不仅要求开发这不仅需要对技术方面非常了解,还需要从用户的角度去考虑本项目的可可用性和便利性。在综合到以上各方面因素的情况下,本项目开发出了一款具有一定实用性的移动视频监控系统。

参 考 文 献

[1] 信师国, 刘庆磊, 刘全宾. 网络视频监控系统现状和发展趋势[J]. 信息技术与信息化, 2010 (1): 23-25.
[2] 赵华, 钟志宏, 兰峰, 等. 浅析智能视频监控系统[J]. 计算机光盘软件与应用, 2014, 17(19): 45-45.
[3] 胡瑞敏, 牟晓弦, 李明. 面向视频监控的视频编解码技术[J]. 电视技术, 2008, 32(5): 68-71.
[4] 关晓磊, 李志强. 基于MPEG-4编码的近距离无线视频传输系统[J]. 电子科技, 2011, 24(6):45-50.
[5] 王海. H263视频编码系统的研究与实现[D]. 西安:电子科技大学, 2003.
[6] 李海锋. 基于h264编码的android手机视频监控无线传输系统[J]. 通讯世界, 2016(10):282-283.
[7] 陈清. H. 265 标准现状和发展应用趋势[J]. 中国多媒体通信, 2008 (10): 12-15.
[8] 蔡韶华. 关于 SVAC 标准技术优势及其应用的探析[J]. 中国安防, 2012 (10): 86-88.
[9] 李培林. 安卓系统的应用及发展趋势展望[J]. 计算机光盘软件与应用, 2012 (18): 161-162.
[10] Shabtai A, Fledel Y, Kanonov U, et al. Google Android: A Comprehensive Security Assessment[J]. IEEE Security & Privacy, 2010, 8(2):35-44.
[11] 祝瑞, 车敏. 基于 HTTP 协议的服务器程序分析[J]. 现代电子技术, 2012 (4): 117-119.
[12] 田午准, 刘晓鸿. 基于移动终端的小型飞行器视频采集系统[J]. 2013.
[13] 李明辉, 魏亚云. 安卓手机移动端的界面设计美学法则探析[J]. 包装工程, 2016(10):170-173.
[14] Xiao E L, Mao H J, Jun-Ping J U, et al. Design of Intelligent Video Supervision System Based on Open Source Software MJPG_Streamer[J]. Microelectronics & Computer, 2013, 30(6):84-87.
[15] 杨卫军, 秦海权, 王鹏. Android移动应用软件检测平台[J]. 信息网络安全, 2012(8):64-66.

致 谢

这几个月的开发让我受益良多,从不了解视频监控系统到亲手编程设计出移动视频监控系统,我积累了一定的安卓开发经验,提升了自己的编程能力,体会到了编程的乐趣。这一过程虽然是漫长且辛苦的,但是也是充满魅力和收获的。
首先要感谢我的指导老师,感谢他在百忙之中抽出时间悉心指导我的项目,为我指明下一步的编程方向和项目方向。老师耐心的解答我的问题,给我的项目提出了很多宝贵的意见,让我少走了很多弯路,加快了项目的编程进度。同时感谢对我项目提出意见并参与测试的同学,正是你们的检验,才能发现项目的bug所在,让我不断改进项目缺点,完善项目。
最后,感谢大学里所有身边的老师,感谢他们平时的淳淳教导,他们不仅在学习上给了我极大的帮助,也为我们树立了为人师表的典范。感谢身边的同学,一起度过了丰富多彩的大学生活。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/230163
推荐阅读
相关标签
  

闽ICP备14008679号