智能手机视频监控系统的设计与实现
扫描二维码
随时随地手机看文章
引 言
随着互联网技术的迅速发展,传统的监控系统已无法满足人们对准确性、适用性和方便性的要求。同时,智能手机更新换代,处理能力日益变强,成为了人们日常生活中不可或缺的一部分。为满足人们对监控区域进行随时随地实时监控的需要,本文研究设计了一种智能手机视频监控系统,将手机端作为视频监控客户端,结合混合编码技术,实现了对监控区域的实时监控与监控视频的存储。
1 移动视频监控系统的设计
本文设计的视频监控系统、移动视频客户端均基于Android 系统,有效结合了混合编码技术与云存储技术[1],可在客户端随时随地观看锁定的摄像视频,若视频图像发生异常,能在第一时间报告给锁定的主人,主人可通过App 远程控制摄像头。
2 移动视频系统的关键技术
2.1 混合编码技术
为了使高质量通信成为可能,并尽可能减少数据损失,故使用主流的视频编解码标准H.264。视频编码的目的在于减少表示数据的比特。由于视频图像数据的相关性强,在帧内以及帧间具有大量空域和时域冗余信息,因此可以通过去除这些冗余信息来实现对视频数据的压缩[2]。其中,在数据压缩方面最受欢迎的是基于统计特性的运动补偿+ 变换编码的混合编码框架。国内外通用的视频压缩标准均基于此框架,如广泛使用的MPEG 系列及H.26X 系列标准。
MPEG-4 不仅针对在一定比特率下的视频编码,更注重多媒体系统的交互性和灵活性。主要应用于视频电话、视像电子邮件等,其传输速度要求较低,为 4 800 ~6 400 bit/s,分辨率为176 144。利用较窄的宽带,通过帧重建技术压缩和传输数据,力求以最少的数据获得最佳的图像质量[3]。
H.264 技术具有比 MPEG-4 更为高效的编码效率,比后者节约 50% 的码率。可提供连续且流畅的高质量图像,并且在较低码率的情况下依旧能提供较高质量的视频图像[4]。
就单张图像来说,MPEG-4 对视频数据的处理更优秀; 而就整体视频传输来说,H.264 更胜一筹。
预测编码:建立一个模型,通过数据的相关性,利用之前的样本对下一个新样本值进行预测,并将预测值和实际值的残差值编码传输到接收端,同时在接收端建立一个相同的模型,按此模型进行解码操作。
运动估计:从当前帧中提取视频序列的运动趋势和走向过程。
一个完整的编码过程基本可以概括为视频源通过滤波器得到波形图,量化得到初始的完整码流,通过帧间、帧内编码和熵编码技术得到最终压缩后的码流。
视频编解码部分采用JM 编解码器。在实验中,视频源将收集到的视频数据改变格式后输入到JM 编码器的工作目录中,在 Visual Studio 2013 平台上运行。通过编码器采样获取预测数据,并与实际值相减得到残差,使用帧内、帧间技术对残差进行量化操作 / 变换,对编码语法元素进行熵编码,然后在编码器的工作目录下得到压缩后的码流。
当码流传输到接收端后,同样会被输入到解码器的工作目录中,通过一系列相反的操作后得到压缩前的视频数据。
2.2 客户端实现
2.2.1 平台选择和开发语言
服务器端采用Windows 操作系统与Java 语言;客户端包括Android 操作系统,Java 语言,Android 编程。
Java 是一门面向对象编程的语言,较好地实现了面向对象编程理论,同时也是一种不受限于特定平台的语言,具有可移植性[5]。此外,Java 还具有稳健、安全、高性能等特征, 是一种功能丰富的开发语言。
2.2.2 客户端 UI设计
用户界面(UI)是系统和用户之间进行交互与信息交换的重要媒介,使得用户能够方便、有效地操作硬件以达成双向交互,完成工作。
本文 采用 Android Studio 进行 Android 编 程。Android Studio 具有非常丰富的可视化编程功能,可以在编程的同时看 到其被应用在不同尺寸屏幕中的情况。Android 操作系统的用 户界面都以 View 与 ViewGroup 为基础。View 是用户界面的 基本组成单元,ViewGroup 是其子类,ViewGroup 的子类称为 “Layout(布局)”。View 与 ViewGroup 在布局中的层次结构如 图 1 所示。
Android 编程中有多种 布局方 式, 分别为线 性布局(LinerLayout), 相 对 布 局(RelativeLayout), 帧 布 局(FrameLayout), 绝对布局(AbsoluteLayout) 等。本文编程主要用到线性布局(LinearLayout), 该布局有 horizontal 和 vertical 两个方向。Android Studio 在创建布局方式上分为两种: 其一,在XML 配置文件中声明布局方式;其二,在应用程序中直接通过代码实例化布局及其组件。
2.3 视频的播放显示
对于获取的视频文件首先要经过解码, 之后再通过Android客户端播放。Android操作系统提供的VideoView和MediaPlayer可播放视频[6]。
MediaPlayer 在播放视频时需要自己准备显示视频的组件、播放时的控制按钮等。首先创建一个 MediaPlayer 对象,再通过setDataSource()设置数据源,可以是文件、文件 路 径 或 URL。 调 用 MediaPlayer.setDisplay(holder) 设置 SurfaceHolder,surfaceHolder 可 以 通 过 surfaceview 的getHolder()获得,调用 MediaPlayer.prepare()准备、调用MediaPlayer.start()播放视频。
VideoView是Android提供的较为好用的播放视频组件, 不仅内建了显示视频的功能,还可以直接加入 MediaController 对象作为播放控制接口。VideoView提供的 setVideoURI() 可以设置视频的 URI,start() 可以开始播放视频,pause()可以暂停播放视频,stopPlayback()可以停止播放视频。
VideoView 视频播放框架如图 2 所示。
从图 2 可以看出,VideoView 组件进行视频播放的过程可以分为三步:
(1) JavaFramework层。应用程序进入VideoView, 再经过Surface;
(2) NativeFramework层。先到SurfaceFlinger,然后借助PVPlayer到OverlayHal;
(3) Driver层。利用Mainframebuffer和VideoPlane进行播放。
2.3 视频数据的存储
在视频监控系统中,对已经采集的视频数据进行妥善存储,便于之后回调查看。目前可行的存储方式有SD 卡存储与云存储。云存储是一个以数据和管理为核心的云计算系统 [2]。相对于传统的SD 卡存储,云存储的优势较为明显,随着系统数据量的增加,没有性能上的瓶颈。使用ownCloud 可以在私有服务器上搭建私有云存储服务器节点,由中心管理服务器信息管理模块统一管理[7],以优化整个服务器系统的运作。
使用ownCloud 时,需在云存储服务器节点上创建并配置Apache 环境、PHP 环境、MySQL 环境等。由于 ownCloud 通过抽象层访问数据库,因此支持 Oracle、MySQL、SQLite 等数据库。服务子节点环境搭建完成后,可以选择连接到本地存储作为存储服务器提供点,在修改了ownCloud 的存储路径配置后,ownCloud 的存储文件动作就会立刻发生在该存储器上。使用ownCloud 建立私有服务器可以更好地保证数据的安全性。
2.4 软硬件连接
客户端分为安卓端和iOS 端,根据对场景的认知,对安卓 App 客户端进行了深层次的研究。安卓系统采用软件栈形式管理系统的功能层次结构,主要分为 5 层,由高到低分别是应用程序层、应用程序架构层、C++/C 本地库、Android 运行时库、Linux 内核驱动层。
安卓客户端开发四大组件的运用贯穿整个应用软件的开发过程,其以组件的形式封装各抽象功能模块,使得应用与系统中其余软件的书库交互变得更为敏捷。
基于海思 Hi3518E 能够实现多种码流和多选分辨率及JPEG 图片抓拍,支持图像 3D 去噪、图像增强、边缘增强等预处理功能,利于监控系统的运行。
本文针对Windows 系统进行开发,依赖于其两大功能: 一是完成与硬件的交互;二是为在微处理器上运行的应用程序提供可执行的环境。着重进行设备驱动程序的封装对摄像头端硬件资源的访问。针对客户端软件进行的需求分析,大致有以下三个步骤:
(1) 网络摄像头要有一个设备的入网操作,并且该操作简单易行,稳定可靠。
(2) 连接设备后,需要获取音频、视频数据。此步骤是对图像、网络传输、显示等技术提出的一项挑战。
(3) 将移动智能手机作为移动客户端软件的载体。
使用由含有多帧环形缓存结构、DMA 控制器、异步FIFO 及从控制接口的软硬件接口来连接软件App 和硬件摄像头,实现了从原始同步视频信号输入缓存到内存中再由VGA 接口显示的预览链路,完成了视频压缩链路,实现了从原始同步视频转换成YUV 三通道分量[2]。
3 结 语
本系统使用摄像头作为移动视频采集端,采用混合编码技术,并以智能手机作为移动视频客户端进行远程视频实时监控。在 4G/5G 时代以及智能手机不断更新换代的情况下, 本监控系统将会拥有广阔的应用前景[8]。