基于Android系统的H.264视频压缩技术实现
2011-05-08张光耀郭永清
张光耀,郭永清,陈 炀
(1.陕西南梁矿业有限公司,陕西西安 719400;2.西安科技大学通信与信息工程学院,陕西西安 710054;3.西安科技大学高新学院,陕西西安 710109)
视频服务器在目前视频领域中的应用,主要是利用网络视频服务器构建远程监控系统。基于网络视频服务器的多通道数字传播技术,具有传统的模拟视频输出系统无可比拟的诸多优势。但要使网络视频监控得到普及还有待于解决以下问题:尽快提高视频压缩的技术水平,目前先进的压缩标准H.264可以部分解决视频质量和网络带宽占用这个矛盾。
H.264/AVC标准是一种高性能的视频编解码技术,相比以前的标准,具有更高的压缩率、高质量图像、容错功能、并有很强的网络适应性。
随着Android技术的迅猛发展和日趋成熟,其开放性、便携性、良好的兼容性、无缝结合网络通信等特点将使Android操作系统在未来工业领域中有广泛的应用。
1 系统概述
基于Android平台的视频服务器监控系统由监控前端、监控终端和网络3部分组成。监控前端是一个嵌入式Android系统,通过S3C6410的USB摄像头采集视频数据,并传送给Android应用层的编解码模块,应用层通过调用JNI接口链接Android底层封装的动态库,实现基于H.264标准视频压缩,将压缩数据打包发送到IP网络上,监控终端通过网络接收数据包,最后解码进行实时播放。基于Android平台的H.264视频压缩技术的总体框架图,如图1所示。
图1 视频服务器总体框架
2 系统的硬件设计
基于Android视频服务器系统包括视频信息采集模块、视频信息编解码模块、视频数据传输和显示模块组成。视频信息采集和编码模块是整个监控系统的前端,主要由USB摄像头和Android底层的系统库实现;视频数据传输模块是整个监控系统的中继,负责监控前端和监控终端视频数据的交互工作;监控终端主要由LCD显示模块和电源模块组成,LCD显示模块实时查看视频,电源模块为系统提供运行所需的能量。
该技术设计采用Samsung公司的ARM11 S3C6410嵌入式处理器为核心,其主频为533 MHz/667 MHz,S3C6410是基于16/32-bitRISC内核的低成本、低功耗、高性能微处理器解决方案,内部集成多个功能强大的硬件加速器,结合外部极佳的接口设备,能够满足Android程序开发的需求。其外接存储设备包括256 M的DDR-SDRAM、2 MB的NOR Flash、2 GB的NAND Flash。外围接口包括串行口、JTAG调试接口和USB接口,其中USB接口连接摄像头负责视频数据的采集,LCD进行实时显示。视频采集设备硬件结构如图2所示。
图2 硬件结构
3 软件设计概述
Android的系统构架分为应用层、应用框架层、系统运行库和Linux内核层,Android应用程序的开发通过应用框架与Android底层进行交互。技术实现设计采用模块化设计方案,主要包括底层驱动移植模块、视频采集模块、视频压缩传输模块和视频显示模块。
基于Android的视频服务器系统主要包括监控前端、中间网络和监控终端。监控前端的USB摄像头采集视频数据,Android应用层调用封装的JNI库进行标准的H.264压缩,经过网络打包发送给监控终端,终端通过解码实时查看视频。其中流媒体服务器主要由3层结构组成:服务器、网络服务接口和驱动模块,如图3所示。
3.1 操作系统结构
Android作为终端操作系统,其软件层次自下而上分为:基于Linux内核的操作系统层,各种库和Android运行环境,应用程序框架和应用程序。结构图如图4所示。
图3 视频服务器的架构与实现
图4 Android系统结构图
(1)应用程序。应用程序包括Email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有应用程序均使用Java语言编写。
(2)应用程序框架。应用程序架构设计简化了组件的重用;任一个应用程序都可以发布功能块并且其它应用程序都可以使用其所发布的功能块。
(3)系统运行库。当使用Android应用框架时,Android系统会通过一些C/C++库来支持使用的各个组件,使其能更好地服务。其中包括Bionic系统C库,多媒体库,关系数据库SQLite,Web浏览器引擎Webkit等。
(4)Linux内核。Android的核心系统依赖于Linux 2.6内核,它同时也是硬件和软件之间的抽象层。此外Android对其做了部分修改,主要涉及两部分。Binder(IPC):提供有效的进程间通信,实现了自己的功能;电源管理:主要为省电,作为手持终端设备低耗电是追求目标。
3.2 底层驱动移植模块设计
Android系统本身是一个庞大的系统,移植需要考虑Android系统的硬件抽象层(HAL)和Linux中的相关设备驱动程序。移植的目的就是为了改动较小的内容,支撑较为庞大的上层系统。该系统驱动的移植主要为满足上层应用层的USB摄像头视频采集需求。
Android系统驱动移植首先要熟悉硬件抽象层的接口,其次要集成和复用已有的驱动程序,主要的工作量在硬件抽象层的实现中。移植的主要工作有两方面:Linux驱动、Android系统硬件抽象层。
USB摄像头驱动程序介于视频采集应用程序与Linux内核中USB核心的中间层。其一,USB摄像头驱动向USB核心注册本身的信息,并调用USB核心提供的API函数为上层服务;其二,应用程序通过调用USB摄像头驱动的一套接口函数进行视频采集和调整摄像头参数等操作,如图5所示。
图5 驱动结构图
3.3 视频采集模块设计
基于Android系统的H.264压缩技术的视频采集部分包括Android视频流的提取以及Android界面设计两部分。Android可以在拍照视频预览时截取视频流的数据。每获得一帧调用相应的接口函数。其中在Android的上层界面中定义了一个SurfaceView类,主要用于显示采集到的图像。Android通过USB摄像头采集格式为YUV的视频数据,通过SurfaceView类接口传输到应用层通过图像绘制进行显示。
应用程序界面设计具体步骤:打开Android项目里的reslayout目录,用xml语言来编辑设计程序界面。首先确定界面的布局,嵌套ViewGroup的Linear-Layout和RelativeLayou进行布局,调整android:layout_width、android:layout_height、android:background、android:padding等参数值,达到满意的整体布局效果。然后在ViewGroup布局中添加View控件:textview、button根据实际需要调整各控件的android:id、android:layout_height、android:layout_width等参数值,最终完成对Android应用程序UI的布局。
3.4 H.264视频压缩模块设计
H.264是由ITU-T的VCEG和ISO/IEC的MPEG联合组建的联合视频组提出的一个新数字视频编码标准。它由VCL层和NAL层组成,VCL层主要负责编解码,主要包括运动补偿、变换编码、熵编码等;NAL层主要为VCL提供与网络无关的统一接口,负责将视频数据封装打包后传递给网络。
H.264标准视频压缩算法包括5个环节:帧间帧内预测编码、正反变换编码、量化反量化编码、环路滤波和熵编码。算法流程如图6所示。
图6 H.264算法原理图
技术实现是在Android操作系统上封装编译生成Android底层Library的JNI动态链接库,进而实现H.264标准编解码。具体实现步骤:选择合适的编码器,系统采用X264的编码器。X264省去了部分复杂增益,编码速度非常快,可以对CIF格式图像实时编码。H.264压缩画面以及分辨率:支持CIF/QCIF;图像分辨率:352×288;压缩格式H.264、MPEG-4压缩格式;压缩帧率:1~25帧可调;压缩码率:64 kbit·s-1~2 Mbit·s-1;码流控制方式:变码流、动码流、混合码流。H.264的优势主要体现在下面几个方面:(1)精确匹配解码,避免错误累积;(2)更简单的规范实施;(3)强大的容错能力;(4)高效压缩,比其他视频压缩能力高50%以上;(5)时延级差,以适应更多应用环境等。
3.5 主程序流程设计
基于Android视频服务器系统终端要接受来自监控前端的视频数据,必须采用Socket网络通信技术。
在进行Socket通信前必须对Socket初始化包括:创建Socket、绑定Socket和端口号、开始监听端口等步骤。创建Socket服务线程。当监听产生后,主进程负责不断循环地监听接收到的请求并建立新的客户连接Socket,创建针对此Socket的通信进程。
图7 视频服务器流程进程
3.6 显示模块设计
Android平台的视频服务器监控系统终端显示需要对视频数据进行解码,通过LCD液晶显示屏实时观看。解码过程是编码的反变换,其中包括获取视频流,视频流信息的配置,视频流的帧解压,以及图像处理过程。该系统选择4.3寸(10.92 cm)LCD显示屏在进行显示端实时查看视频图像。
4 结束语
基于Android系统的视频客户控制界面,无需专用监控软件、使用方便、成本低。系统通过Arm11 CPU直接进行视频处理和传输,在提供高性能的同时,也允许在性能和功耗间做权衡满足某些特殊的应用需求。鉴于Android视频服务器的高性能和前沿性,基于Android平台的视频服务器可以在安全性要求高的各种场合得到应用,同时结合实际的应用再可以进行功能扩展,可应用到众多的有线或无线视频监控领域。
[1]孙弋.ARM-Linux嵌入式系统开发基础[M].西安:西安电子科技大学出版社,2008.
[2]E2Ecloud工作室.深入浅出Google Android[M].北京:人民邮电出版社,2009.
[3]宋辉,江峰.Java服务器程序设计[M].北京:清华大学出版社,1999.
[4]肖纲.Java Web服务器应用程序设计[M].北京:电子工业出版社,2001.
[5]AYERS D.Java服务器高级编程[M].北京:机械工业出版社,2001.
[6]靳岩,姚尚明.Google Android开发入门与实践[M].北京:人民邮电出版社,2009.
[7]杨文志.Google Android程序设计指南[M].北京:电子工业出版社,2009.
[8]《Google API大全》编委会.Google API大全[M].北京:电子工业出版社,2009.
[9]张岩.基于Java手机平台移动多媒体系统的设计与实现[D].哈尔滨:哈尔滨工业大学,2006.
[10]赵亮,张维.基于Android技术的界面设计与研究[J].电脑知识与技术,2009,29(5):8183-8185.
[11]陈昱,江兰帆.基于Google Android平台的移动开发研究[J].福建电脑,2008,24(11):156-157.
[12]公磊,周聪.基于Android的移动终端应用程序开发与研究[J].计算机与现代化,2008(8):86-89.
[13]李亮.Android系统开发问题杂谈[J].程序员,2009(7):116-117.
[14]马越.Android的架构与应用[D].北京:中国地质大学,2008.
[15]姚昱旻.基于Android的移动学习终端平台的开发与研究[D].长沙:中南大学,2008.