本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
摘 要: 提出了一种基于Android平台的视频监控系统方法。阐述了系统的结构框架,介绍了Android操作系统及其应用层的开发,重点描述了PDA端视频处理的实现。系统采用Blackfin533芯片实现对视频的H.264编码,并应用快速模式选择算法优化编码过程,可使通信模块和数据处理模块通过Android平台代码完成。在3G无线网络环境下,实现了后台对远端的实时视频监控。测试表明,延迟可控制在5 s以内。
关键词: Android; H.264编码; 快速模式选择算法
目前视频监控系统正朝着数字化、网络化、功能综合化的方向不断发展。传统的视频监控系统大多通过线缆或光纤将视频信号传输到监控中心,但由于网线的限制,不利于监控系统的迅速搭建。随着无线网络特别是3G网络的普及,视频监控系统面临着更加广阔和自由的空间[1]。
3G网络在移动环境下支持的带宽有限,而视频监控系统的实时性要求尽可能清晰流畅地传输视频信号,因此需要在保证视频信号不失真的情况下,进行最大可能的压缩。H.264标准采用了高精度、多模式预测技术提高压缩比以降低码流[2],可广泛应用于远程监控、电视会议以及可视电话等领域。
本文介绍了一种基于Android系统的视频监控系统,利用PDA结合H.264编码技术和3G无线网络通信技术实现了对远程视频的实时监控。
1 系统概述
如图1所示,系统采用C/S架构,硬件部分包括带摄像头的PDA、H.264编码器和后台监控计算机。系统的关键技术是编码器的设计,将拍摄到的模拟信号转换成数字信号,通过H.264编码器进行编码压缩,最后利用3G无线网络将压缩后的数据传送到后台监控计算机完成实时显示。后台计算机还可以通过3G网络向PDA发送控制命令,实现云台控制等相关操作。本文主要介绍PDA端的设计与实现。
2 Android操作系统
Android是一种以Linux为基础的开放源码操作系统,主要用于便携设备。Android拥有一个提供Java编程语言功能的核心库。每个Java编写的应用程序都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个可以同时高效运行多个虚拟系统的设备,这样的特点使得Android系统能够很好地适应手机特殊的运行环境。通过在Eclipse上安装Android SDK插件,可以轻松搭建Android开发平台,在该平台编译的代码可自动生成APK文件,直接进行安装使用[3]。
3 PDA端视频处理的实现
基于Android的视频监控系统最重要的部分就是PDA以及外设的设计和视频的处理。PDA有限的内存要求这部分的实现尽量做到低功耗、高性能,达到算法和软件的最优化。
由于DSP芯片具有极强的可编程性,方便后期进行编码的比较和优化。因此编码器采用ADI公司推出的DSP芯片Blackfin533。该芯片集成了大量的外设和存储器接口,在结构上对C/C++进行了优化,能够达到很高的代码密度,可以满足H.264编码的实时要求。
3.1 H.264算法的优化选择
与以往的视频编码标准(如H.263和Mpeg系列)只采用一种或两种宏块编码模式不同,H.264采用从16×16到4×4的七种宏块编码模式,使得H.264相比H.263节省了大约50%的码率。但同时面临着可观的运算量消耗[4]。为了达到实时编码,如何实现快速的模式选择算法成为解决问题的关键[5-6]。H.264/AVC的宏块编码模式大量应用了遍历,使得运算量过大,适当地减少遍历的模式或者提前终止遍历就可以提高编码的速度[7]。而减少无效遍历的关键在于限制遍历的范围和制定可靠的终止准则。
Curr为当前待编码的宏块,A、B、C、D分别为四个方向的相邻宏块,A_cost、B_cost、C_cost和D_cost分别为A、B、C、D的编码代价,门限T利用式(1)计算得出:
T=(5×A_cost+5×B_cost+4×C_cost+2×A_cost)>>4 (1)
Curr分别按照4个相邻宏块和自身宏块的模式编码,比较其代价值得到最优编码。图2所示为对宏块A和B的优化编码流程图(对宏块C和D的编码类似)。通过测试比较及优化算法的处理,视频在保真的情况下,有效地降低了压缩比,提高了算法的运算速度。
3.2 软件的设计
Android平台实现主要包括通信模块和数据处理模块。
通信模块采用了Socket网络通信技术进行UDB通信。通信之前的准备工作是完成Socket的创建,同时绑定Socket和端口号,设置开始监听端口。监听开始后,主程序循环监听、接收请求信号,同时创建新的客户连接Socket以及相应的通信进程。
数据处理模块主要是对视频流数据的提取和传导。开启摄像头后,在视频预览时截取视频流每一帧的数据。把截取到的数据传输到应用层进行图像绘制,通过外设传输到DSP芯片进行视频编码,编码后将数据通过网络传送到后台监控室。Android应用层[8]的核心代码如下:
p0=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// 创建socket
bind(p0,(struct sockaddr *)&(addr_org),sizeof(struct sock-
addr_in)); // 绑定IP和端口
sendto(p0, SendDataBuff, ulLen, 0, (struct sockaddr *)&
(addr_dst), sizeof(sockaddr_in));
// 向指定IP发送SendDataBuff中的视频数据
public ImageSurfaceView(Context context, AttributeSet attrs)
{paint = new Paint(); paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
…… setFocusable(true);} //初始化SurfaceView类
public void surfaceCreated(SurfaceHolder holder) {……
screenH = this.getHeight();screenW = this.getWidth
();handler.post(imageRunnable);}
//创建SurfaceView用于显示捕捉的图像
Camera openCamera() {} //打开摄像头
android.hardware.camera.PreviewCallback
//用来调用每帧图像数据data的接口
DSP芯片中软件设计的主要目的是提高运算速度和效率。宏块编码采用不同位置独立编码,编程时尽可能地将判断转移到循环外,杜绝了大量帧内和帧间宏块的重复判断。利用快速的模式选择算法对宏块进行编码,进一步提高了编码效率。使用Blackfin533芯片专用的视频指令SAA求取绝对差值求和函数SAD(),在很大程度上提高了运算速度。具体SAA的使用代码如下:
for(i=0;i<16*16;i++)
sad+=abs( *pSrc++ - *pRef++);
LSETUP(sad_START,sad_END) LC0=P1;
sad_START:
r3 = [i1++];
SAA(r1:0,r3:2) || r1= [i0++] || r2= [i1++];
SAA(r1:0,r3:2)(R) || r0= [i0++] || r3= [i1++];
SAA(r1:0,r3:2) || r1= [i0++] || r2= [i1++];
sad_END:SAA(r1:0,r3:2)(R) || r0=[i0++] || r2=
[i1++]
4 实现结果
图3为系统在HTC G14手机和后台计算机中利用联通3G网络实验的结果。手机拍摄预览的视频显示在计算机上;后台可选择监视某一台手机的视野,还可以通过发送命令放大或缩小视野的范围,整个过程不受距离限制。经过多次测试,PDA端与后台在同一帧的显示仅存在3 s~5 s的延迟。
|