基于Android视频客户端的设计

2012-06-25 03:31杨明极
电视技术 2012年3期
关键词:音视频解码远程

杨明极,毕 晶

(哈尔滨理工大学测控技术与通信工程学院,黑龙江 哈尔滨 150080)

随着21世纪的到来,全球快速的进入信息时代,移动通信系统由于综合利用了有线和无线的传输方式,解决了人们在活动中与固定终端或其他移动载体上的对象进行通信联系的要求,移动通信给社会带来了深刻的信息化变革,已成为最受青睐的通信手段。如今,以嵌入式技术为依托,以网络、通信技术为平台的网络视频监控,已经越来越成熟,应用范围越来越广阔。网络视频监控突破了地域的限制,实现了远程监控,可是,随着“Any Time,Any Where,Any Device”(任何时间、任何地点、任何设备)等概念的提出,普通的网络视频监控已经不能满足用户日益增长的多元化需求。“手机视频监控”使这个问题有了答案,这项应用将在安防行业中得到迅速推广和普及,同时,它也会逐渐走入人们的家庭生活中,比如在工作中的白领人员可以在工作中用手机实时监看家里无人照看的老人或幼儿园里孩子的情况,企业人员可以用手机随时随地监看自己的店铺、超市、公司的运营情况等。

本文主要是对基于Android平台视频客户端进行设计,最后实现其播放的核心功能以及实时监视等多项基本功能。

1 Android平台简介

2007年11月5日,Google与其他33家手机制造商(包括摩托罗拉、宏达电、三星、LG)、手机芯片供应商、软硬件供应商、电信业者所联合组成的开放手机联盟(Open Handset Alliance,OHA),发布了名为Android的开放手机软硬件平台。

Android是基于Linux内核的软件平台和操作系统。框架结构由5个部分组成,其核心为Linux内核,逐次向上是Android开发的Libraries(函数库)和Android Runtime(运行环境),以及搭配Application Framework(应用程序框架)来开发各种不同的应用程序[1]。

对于硬件开发商来说,Android是开放的平台,只要厂商有实力和能力就可以在此平台上自由添加特有的设备或功能,不受到手机操作系统的限制;对于手机开发者而言,Android是先进的平台,平台上的应用程序可兼容于各种型号的Android手机,免除为各种不同手机机型开发的困扰。Android平台支持各种先进的网络、绘图、3D处理能力,可以用来提供更好的用户体验。通过Android Market将自己的应用程序销售给世界各地用户;对于用户来说,Android是一个用于手机的操作系统。只要用户申请了Google帐户,当想换手机时,可以在不同的厂牌同样使用Android操作系统平台的手机之间选择,并且很容易将比如通讯薄等个人资料转换到新手机上。

2 远程实时视频监视整体设计

目前,远程实时视频监视技术主要趋向以下几个方向:首先,支持多样化格式。Xmms,Xmovie,QuickTime是主要针对固定的媒体格式类型或传输协议,具有一定的专用性,因此难以满足广大消费者的的需求,如今的音频、视频格式越来越多,如常见的音频WMA、MP3以及视频的RM、AVI等。如何能播放所有格式,是现今研究的方向。其次,可扩展性也是一个必要的趋势,如今的播放器功能越来越强大,如何在现有的基础上使功能更全面,也是人们接受的一个因素。这就是本设计选用开放式Android平台的一个原因,代码完全公开,为其功能扩展提供方便的条件。

2.1 远程视频监视整体设计方案

远程视频监视系统无论播放本地文件还是网络流媒体文件,都需要经历3个处理阶段,分别是获取媒体数据、对音视频媒体流解码以及将解码后的媒体数据给用户显示[2],本设计依据这3个处理阶段将远程视频实时监视在整体结构上进行分层设计。

由于本地文件和网络流媒体文件的数据获取方式是相异的,若保证上层解码的一致性,就要对本地文件和网络流媒体文件进行预处理,使它们的数据格式相同以供上层解码。因此,本设计结合以上特点以及文件的解码流程对远程视频实时监视的整体结构采用分层设计方案,每一层独立完成工作,不但能够降低系统的耦合度,而且各层的独立扩展不干扰上下层的应用。整体结构层从上到下分别设计为用户界面、音视频解码层、数据预处理层、数据提取层。整体结构如图1所示。

图1 远程实时视频监视的整体结构图

2.2 用户界面

远程视频实时监视的用户界面主要由Android的GUI系统实现,负责提供播放器和用户之间的交互接口,例如播放时的快进、后退、暂停等功能。GUI系统由Java语言框架和C语言框架组成,对于下层,GUI系统通过调用显示输入、输出设备的驱动将Android的软件系统和底层的硬件联系起来;对于上层,GUI系统提供了Java层次的绘图接口,Android的Java框架层调用这些绘图接口来构建各种UI元素。此外,Java应用程序层也可以调用这些绘图接口。

2.3 音视频解码层

音视频解码层包括解码选择组件、多样主流音视频格式的解码器以及多路媒体流之间的同步的功能。解码选择组件先从本地文件或者流媒体文件中获取媒体解码格式的相关信息,通过获取的信息来匹配出对应的解码器对媒体流解码,此部分通过解码算法的移植、修剪及优化后完成。

2.4 数据预处理层

数据预处理层对于媒体流文件来说,先要将RTP的包头信息去除,再对RTP中的音视频信息进行组帧,同时将全部的数据帧传递到上层待解码缓冲区;而对于本地文件,则需要按照相对应的媒体格式进行解封装,再将获取文件的音视频等信息按帧放入对应的上层待解码缓冲区。

2.5 数据获取层

数据获取层的功能主要是对本地或流媒体文件的获取。对本地文件信息获取需要读取本地文件即可,而对于流媒体信息文件的获取,则需要从流媒体服务器上获取数据信息,获取信息期间包括前期会话协商、数据缓冲、数据发送等部分。此外,媒体协商部分中协商媒体流的常规信息,例如音视频媒体类型、传输协议以及媒体传输端口等信息,这些都需用到RTSP协议[3]。

3 视频客户端的实现

3.1 用户界面

用户界面是基于Android的GUI系统实现的[4],由类Video Monitor来具体实现,其类图如图2所示。

图2 Video Monitor类图

登录界面效果如图3所示。

图3 登录界面效果

3.2 音视频解码

本设计的核心只需要利用解码算法对视频文件解封装以及对音视频解码,因为若将整个远程视频实时监视的系统全部移植到Android平台上,可能会造成大批量代码冗余。同时,整个项目的开发是基于Linux操作系统,忽视了手机平台能源不足、处理能力不够大等限制因素的问题,所以面对客户端手机的功能需求来说,将解码算法进行移植、修剪和优化是很重要的。

3.2.1 解码算法的移植

NDK的makefile文件是由Google发布,实质是Android.mk文件,其语法和一般的makefile文件有很多相异点。因为原有的makefile文件在跨平台编译时不能被使用,所以将解码算法里的makefile文件全部替换成NDK中的Android.mk文件是解码算法移植的必要条件。通过对解码层结构的分析可以看出,最基础模块是avutil,基于已经编译好的avutil模块之上的是avcodec模块,基于avutil和avcodec两者模块之上的是avformat模块。依据这种结构,本设计将编译移植的顺序由下到上设计为avutil,avcoedec,avformat,编译的步骤如下说明:

1)说明config.h和config.mak文件

config.h和config.mak文件非常重要,因为很多不同的文件都会用到include config.h,编译器也会依据它而优先选择对代码编译。此外,解码器自带的makefile框架通过configure命令之后将产生1个config.h文件和1个config.mak文件,2个文件加起来共有600~700个宏定义,这些宏定义主要用于描述编译后代码各部分的参数设置,包括体系架构、编译器、版本、头文件、编解码器等设置。与此同时,有关平台差异方面的定义在此部分需要重新修改,例如把体系架构改成Android平台下的ARMv5TE,只有这样编译时的指令集才不会选择X86的指令集而是ARM的指令集。

2)编译libavutil.a

首先,在libavutil里创建一个Android.mk文件,然后在libavutil里的makefile文件调用subdir.mak就实现了真正的编译,需要注意的是在Android.mk下书写make文件可以在此省略,只要直接把对应的源文件引入即可;标准的makefile是指定.o目标文件,但是在Android.mk中需要直接指定.c源文件,Android.mk文件如下所示:

其中,在编译时出现的错误大部分来自于头文件没有引入,例如不识别某些文件的size_t关键字在该文件include stdio.h后就不报错等类似问题,修改时只需要把对应的头文件引入即可。其他层也可以按照以上相同的方法书写Android.mk文件,并移植到Android平台。

3.2.2 解码算法的修剪及优化

在Linux下编译运行解码代码时,要经过三步才能将解码算法正确的编译到Linux系统中,即configure,make,make install。第一步configure过程中将生成1个configure.h和1个make文件,作用是查找此次编译了何种文件。经过操作和尝试发现可以在configure源代码中添加多种配置参数,这些参数包括基本选项参数、高级选项参数以及专门提供的优化参数,而优化参数就是用于配置编译过程中用到的编译内容。因此本设计也利用这些优化参数,择优选择出合适的方法查询出远程视频实时监视需要的文件,而解码算法的修剪即将其中不需要的文件进行删除。编译时设置的参数如下所示:

其中,参数配置在编译源文件过程中,整个项目只有一部分编译到链接库,分别是H.264、amr_nb的编码方法、3gp的文件封装格式、解封装文件的源代码以及全部的解码格式。而链接库里已被编译的源代码的集合就是本设计所需要的源代码的有效集,可以通过configure.h和make文件中的后缀名为.o文件来进行查找,编译.c代码时生成的目标文件其后缀名为.o的文件,因为任何一个被编译的.c文件都能生成.o文件,所以可以利用查找后缀名为.o文件的方法来判断配置参数下有哪些文件被编译,哪些没有被编译,最后便可以得出本设计所需要的已编译的源文件的最小集合。

开源代码目前能够跨平台编译运行,但是由于手机的CPU处理能力、能源、内存等各方面的限制资源都与PC机存在很大的不同,因此,本设计针对客户端手机的特性来对代码进行优化,具体有以下几点:

1)去除冗余代码以及调试过程中的打印语句,减少if-else的判断及不必要的代码冗余,对局部和全局变量进行调整,对程序结构进行规范,使用寄存器变量代替局部变量。

2)由于逻辑移位指令的执行时间远远小于乘除运算指令,因此乘除操作可以用逻辑移位运算来代替,特别是除法指令,被代替后能够缩短指令运行的时间。

3)在编写代码过程中,尽量避免多重循环函数的调用以及尽量降低上下次循环的相关性,这样做可大大减少没必要的计算量。

4)设置合理的缓存,设置适合解码算法移植的目标平台Android平台的缓存大小。

3.3 数据预处理层

本层针对本地文件的预处理可以依赖于解码算法解封装功能,但是对流媒体文件的预处理需要将一个或多个RTP数据包整合在一起,其中传输阶段主要任务是为解码模块提供RTP数据包[5]。

RTP实现流程如图4所示。

图4 RTP实现流程

1)函数RTP_Create(context*the_context)用于完成RTP会话的初始化和为其上下分配内存,函数先调用ITP Context_Create(the_context),然后再调用RTP_Session_Save_Cxinfo(*the_context,conx_cc),从而完成 RTP 会话初始化后上下文信息的创建和保存。

2)创建RTP结构,此部分由函数Create_Socket()完成,先调用 sockfd=socket(AF_INET,SOCK_DGRAM,0)来创建套接字,若创建成功,则可调用bind(sockfd,(struct sockaddr*)&local,sizeof(local)绑定套接字。

3)获取且保存本地IP地址,随机产生同步源标志、创建新的同步源和设置规范名。关键代码如下:

4)判断会话是否结束。若是,结束网络数据接收线程;若不是,进入步骤5)。

5)接收RTP包,该部分由函数RTP_Receive(context cid,int fd,char*payload,int*len,struct sockaddr*sin)完成。

6)更新新包号的顺序,设置序列号和信息时间标签。

7)将步骤5)中接收到的RTP数据包加入视频帧缓冲区中,为解码使用做准备。

8)回到步骤4)继续执行。

3.4 数据提取层

该层完成主要功能是与流媒体服务器端协商媒体信息细节,并根据协商结果从服务器端获取流媒体数据,将流媒体数据存入缓冲区,按照本设计缓冲方案将数据包发送给数据预处理层,其结构图如图5所示。

图5 数据获取模块结构图

该层一共启动5个线程,其中1个线程中启动TCP连接,用于RTSP会话协商并且在RTP数据传输期间,该TCP连接必须一直保留。2个线程分别为接收音频和视频RTP数据的线程,另外2个线程分别为接收以及发送音频和视频的RTCP数据包[6]。

4 视频客户端测试

首先在PC机进行模拟测试,即在Android编译环境eclipse中将程序运行,通过模拟器测试成功。然后将程序移植到具备Android操作系统的手机里,利用WiFi无线网络连接服务器并且通过了权限访问,测试结果验证了此视频客户端软件在功能上满足设计的基本需求。其效果如图6所示。

5 结论

本文实现了客户端基于Android平台的远程视频实时监视功能,能够播放本地及流媒体视频文件。远程视频实时监视系统整体采用分层的设计理念,本文分析了各层的结构特点和关键技术,并对解码层的源代码进行了修剪和优化。通过对各层的设计,还实现了访问权限的设置、播放、暂停等功能。本文移植的程序代码目前能够稳定的在手机上运行。该设计具有一定的通用性和开放性,可以被应用到其他的客户终端,对Android开发人员有一定的借鉴意义。

[1]Code Home.Android-An Open Handset Alliance Project[EB/OL].[2011-04-15].http://code.Google.com/android/what is android.Html.

[2]赵亮,张维.基于Android技术的界面设计与研究[J].电脑知识与技术,2009,29(5):8183-8185.

[3]陈瑕,陈平华,李文亮.Android内核分析[J].现代计算机,2009(11):112-115.

[4]余志龙.Google Android SDK开发范例大全[M].北京:人民邮电出版社,2009.

[5]魏聪颖.基于实时流媒体传输系统的H.264组包算法研究[J].计算机科学,2007(34):41-44.

[6]西刹子.安防天下——智能网络视频监控技术详解与实践[M].北京:清华大学出版社,2010:3-10.

猜你喜欢
音视频解码远程
让人胆寒的“远程杀手”:弹道导弹
《解码万吨站》
远程工作狂综合征
Microchip推出首款车载以太网音视频桥接(AVB)全集成解决方案
解码eUCP2.0
3KB深圳市一禾音视频科技有限公司
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机
远程诈骗
WIFI音视频信号传输的关键问题探究