图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子线程处理流程。