目 录
摘 要 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消息,我们可以在