摘要:为了实现移动视频监控,提出了一种基于智能手机的远程视频监控系统。介绍了监控系统的体系结构和硬件平台,阐述了嵌入式操作系统Android 应用程序的开发方法,并结合实际的应用系统,重点论述了Android 平台上视频监控客户端的设计思路。移植了音视频解码库FFmpeg 进行H. 264 视频解码,并采用OpenGL ES 实现实时视频显示。在无线局域网络的环境下对视频监控终端进行测试,达到了利用手机进行移动视频监控的目的。

  随着多媒体技术、视频压缩技术以及网络传输技术的发展,视频监控正朝着数字化、网络化、智能化方向持续发展,并越来越广泛地渗透到政府、教育、娱乐、医疗等领域。目前大部分的网络视频监控系统是基于WEB 服务器的, 监控终端为PC机,用户使用浏览器获取监控服务。由于互联网接入地点的限制,普通的网络视频监控无法满足用户在任何时间、任何地点获取监控信息的需求。

  本文介绍了一种以Android 智能手机为终端的视频监控系统,该系统将传统的视频监控与移动多媒体技术相结合,真正实现了移动视频监控。

  1系统的结构

  本文中的视频监控系统采用C/ S 体系结构。

  如图1 所示,该系统由视频采集端( 摄像头),视频服务器以及监控客户端等构成。

  

  图1视频监控系统总体结构

  视频服务器是整个系统的核心部分,它将摄像头采集到的原始模拟信号转换为数字信号,并对视频数据进行编码压缩,最后通过Internet 将压缩后的数据传送至客户端。客户端通过TCP/ IP 协议访问服务器,通过对视频数据的接收、解码以及显示,实现实时预览功能。客户端也可以根据用户需求发送控制命令,实现对前端设备的控制操作,如云台控制等。

  服务器部分采用Hi3515 处理器芯片为硬件平台,并移植了嵌入式操作系统Linux 作为整个系统运行的软件环境。Hi3515 是一款基于ARM9 处理器内核以及视频硬件加速引擎的高性能通信媒体处理器,具有H. 264 和MJPEG 多协议编解码能力。

  本文以基于Hi3515 的远程视频监控系统为例,重点介绍了Android 平台上监控客户端的设计过程。

  2Android 开发介绍

  Android 是基于Linux 开放性内核的操作系统,是Google 公司在2007 年11 月5 日公布的手机操作系统。Android 采用软件堆层的架构,主要分为三部分:底层以Linux 核心为基础,提供基本功能;中间层包括函数库和虚拟机;最上层是各种应用软件。

  Android 平台显着的开放性使其拥有众多的开发者,应用日益丰富,不仅应用于智能手机,也向平板电脑、智能MP4 方面急速扩张。

  Android 应用程序用Java 语言编写,每个应用程序都拥有一个独立的Dalvik 虚拟机实例,这个实例驻留在一个由Linux 内核管理的进程中。Dalvik支持Java Native Interface(JNI)编程方式,Android 应用程序可以通过JNI 调用C/ C++开发的共享库,实现“Java+C冶的编程方式。开发Android 应用程序最简捷的方式是安装Android SDK 和Eclipse IDE.

  Eclipse 提供了一个丰富的Java 环境,Java 代码通过编译后,Android Developer Tools 会将它打包,用于安装。 3 监控客户端的设计与实现

  基于Android 平台的监控客户端的总体框架如图2 所示,分别由网络通讯模块、视频解码模块以及视频显示模块等构成。其中网络通讯模块接收来自服务器的所有数据,对数据进行解析,并将视频数据存入到视频缓冲区。视频解码模块负责从视频缓冲区中读取数据并送入H. 264 解码器进行解码。最后,采用OpenGL 图形库将解码后图像绘制到屏幕上实现视频播放。

  

  图2客户端总体框架。

  3. 1 H. 264 视频解码器的实现

  在网络视频监控系统中,视频的编码压缩是非常必要和关键的工作,没有经过压缩的海量数据对网络传输系统来说是无法承受的[7] .H.264 是目前最先进的视频压缩算法,它由视频编码层VCL 和网络提取层NAL 两部分组成。其中,VCL 进行视频编解码,包括运动补偿预测、变换编码和熵编码等;NAL 采用适当的格式对VCL 视频数据进行封装打包。H.264 标准对编码效率和图像质量进行了诸多改进,且抗丢包性能和抗误码性能好,适应各种网络环境,非常适合于对压缩率要求高,网络环境复杂的移动视频监控。

  客户端接收的数据是经过H.264 编码压缩后的数据,需要经过H.264 解码还原视频图像后才能够显示,因此,H.264 解码器是客户端的关键部分。这里移植了开源的音视频解码库FFmpeg 进行H.264 解码。在Android 应用程序中使用FFmpeg 的步骤如下:

  (1)在Linux 环境下安装Android 原生开发工具包NDK.

  (2) 创建jni 文件夹,将FFmpeg 工程复制到文件夹下。创建H264Decoder. c 源文件,提供Android程序使用的接口函数,文件需要包括JNI 的操作头文件《jni. h 》, 且函数名有固定的形式, 如com_ipcamera_PreView_H264Decoder 表示com_ipcamera包下面PreView 类中H264Decoder 函数。

  (3)创建Android. mk 文件,该文件包含正确构建和命名库的MakeFile 说明。分别在LOCAL_SRC_FILES 和LOCAL_C_INCLUDES 项中添加编译模块所需源文件和头文件目录。

  (4)执行NDK 开发包中的ndk鄄build 脚本,生成对应的。 so 共享库,并复制到Android 工程下的libs/armeabi 目录下。

  (5) 在Android 程序中通过System. loadLibrary(”库名称冶)加载所需要的库,加载成功后,应用程序就可以使用H264Decoder 函数进行H.264 的解码。3. 2 OpenGL ES 绘图

  为了提高绘图的效率,客户端使用OpenGL ES实现视频图像的显示。OpenGL ES 是一个2D/3D轻量图形库,是跨平台图形库OpenGL 的简化版。

  OpenGL ES 专门针对手机、PDA 和游戏主机等嵌入式设备而设计,目的是为了充分利用硬件加速,适合复杂的、图形密集的程序。

  Android 中使用GLSurfaceView 来显示OpenGL视图,该类继承至SurfaceView 并包含了一个专门用于渲染3D 的接口Renderer,主要通过实现ON鄄DrawFrame、onSurfaceChanged 以及onSurfaceCreated等方法构建所需的Renderer.解码器解码一帧图像后,调用GLSurfaceView 的requeSTRender 方法通知OpenGL ES 完成视频图像的显示。使用OpenGL 绘图的核心代码如下:

  

  3. 3多线程设计

  视频数据的接收和解码都是复杂、持续的过程,如果其中一个过程出现阻塞会影响整个程序的运行,因此,客户端使用多线程实现数据接收和视频解码的并行处理。在整个程序运行过程中,主线程响应用户操作,负责屏幕刷新工作,并创建两个子线程:数据接收和视频解码子线程,处理过程如图3 所示。

  

  图3子线程处理流程。

  在Java 中, 多线程的实现有两种方式: 扩展java. lang. Thread 类或实现java. lang. Runnable 接口。这里通过继承Thread 类并覆写run()方法实现两个子线程。在多线程的应用中关键是处理好线程之间的同步问题,以解决对共享存储区的访问冲突,避免引起线程甚至整个系统的死锁。Java 多线程主要利用synchronized 关键字和wait( )、notify( ) 等方法实现线程间的同步。

  4 结束语

  目前,该系统已经在实验室进行测试,服务器输出15fps CIF 格式的H. 264 视频数据,客户端安装在Android 手机上,通过WIFI 接入无线局域网中与服务器建立连接,用户界面如图4 所示,可实现远程视频预览、云台控制等操作。

  

  图4 监控客户端

  随着3G 时代的到来,数据传输速度有了大幅提升,为移动实时视频业务的实现创造更好的条件。

  手机用户可以直接接入3G 网络访问视频监控服务器,实现移动在线的实时视频监控。由此可见,手机视频监控市场潜力巨大,具有很好的发展前景。

更多相关文章

  1. Android(安卓)studio 下的aidl编程实现Android的夸进程间通信
  2. Android(安卓)使用Theme实现动态切换主题详细教程
  3. Android(安卓)轻松实现语音识别
  4. Android(安卓)GLES多线程处理
  5. Android实现图表绘制和展示
  6. FusionCharts报表在Android上的实现
  7. Android(安卓)Power Management 实现
  8. Android中的Apk的加固(加壳)原理解析和实现
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Translation001——android
  2. Android MVC模式你真的明白了吗??
  3. Android(安卓)2016新技术
  4. android 控件抖动
  5. Android GreenDAO ORM的使用(一) 生成DAO
  6. Android:Material Design - Style - Colo
  7. Android(安卓)的RIL驱动模块
  8. android 显示gif图片
  9. 局域网场景下Android客户端实现同数据库
  10. Learning about Android Graphics Subsys