基于Android和DM3730的视频编码软件开发
2013-01-31龚泽挚蓝晓柯郑雅羽
龚泽挚,蓝晓柯,郑雅羽
(浙江工业大学 信息工程学院,浙江 杭州310023)
近年来,随着社会的不断进步和经济的不断发展,信息化已经深刻影响了人类的社会形态。在半导体存储、通信、互联网技术、计算机技术的不断融合与发展的基础上,数字多媒体技术得以飞速发展。其中,对数字视频编码技术的相关应用提出了更高的要求,如视频会议、可视会议、数字广播电视、视频监控,无线网络通信等[1]。
Android是Google开发的一套基于Linux的开源操作系统,现已广泛应用于智能手机、移动终端等设备[2]。Android系统底层主要使用C/C++开发,应用程序采用Java语言开发。由于Android系统的开源特性,其应用软件的可移植性强,软件使用度较高。
DM3730是TI最新的基于DaVinci架构设计的数字媒体微处理器。主要由1 GHz的ARM Cortex-A8 Core[3]和800 MHz TMS320C64x+TM DSP Core两部分组成。由于其具有双核以及强大的多媒体数据处理能力,成为了当前视频处理器的首选。
针对基于DM3730和Android的视频编解码软件开发,TI专门提供了一套DVSDK方便开发者使用。TI的开源代码只实现了解码功能,编码的实现还有待开发。因此,编码功能的实现也成为了当前企业、科研所和高校研究的热点。
基于以上内容,本文以DM3730为硬件平台、Android为操作系统,设计的视频编码软件可以控制相关的编码参数,实现对视频文件的简单编码。因此,本文对基于DM3730和Android系统的视频编码软件开发的研究,具有很好的应用价值,也具有很高的商业价值。
1 视频编码软件整体架构
本视频编码软件是基于Android操作系统设计而成。Android系统的架构主要可以分为以下5个部分:Linux Kernel,Android Runtime,Libraries,Application Framework和Application[4]。具体如图1所示。
图1 Android系统架构
根据Android系统特有的架构,本文设计的视频编码软件主要需要实现以下3部分内容:Android用户操作界面、JNI层的动态库、底层的视频编码库。视频编码软件的整体架构如图2所示。
图2 视频编码软件架构
图2 中的软件架构表明:首先运行界面的应用程序,界面程序将设置好的编码参数传递到JNI层,JNI层解析以后控制底层的编码程序完成视频的编码,最后回调一定的信息到用户界面,完成整个流程。
2 视频编码软件的实现
视频编码软件的实现最为核心的内容是底层编码程序的开发,需要根据TI的Codec Engine编写程序,使得ARM和DSP完成通信,在DSP端完成视频编码。同时为方便用户的操作,需要设计用户操作界面,以便对编码的相关参数如编码标准、编码码率、编码帧数等进行控制,而该部分的真正实现需要通过设计JNI层才能控制底层的核心视频编码程序。
2.1 基于Codec Engine的底层视频编码程序的实现
2.1.1 编解码引擎(Codec Engine)的使用
Codec Engine就是DaVinci系统里用来启动和执行xDAIS算法的一组API集合[5]。Codec Engine的通信框架是远程调用思想在DaVinci系统上的实现。其目的是在应用程序端调用另一个远程应用程序时,采用与本地调用相同的调用方式。图3所示的就是Codec Engine在ARM和DSP上的通信架构。
图3 Codec Engine通信架构
Codec Engine的API包括核心引擎应用编程接口(Engine API)和多媒体算法应用编程接口(VISA API)。核心Engine API模块完成打开和关闭Engine;VISA API模块是Codec Engine中的主要操作模块,主要完成编解码算法实例的创建,算法的执行与控制以及算法实例的清除。
2.1.2 基于DMAI的底层编码程序的实现
DMAI(DaVinci Multimedia Application Interface)是DSP端给ARM端应用程序的调用接口,是操作系统和Codec Engine之上的应用接口,可以方便地应用在Davinci平台上。其结构框图如图4所示。
图4 DMAI框图
本文中主要基于Codec Engine并使用DMAI的Buffer和Venc1模块来实现底层的视频编码程序。程序的核心模块可分为以下4个部分。
底层视频编码程序的流程图如图5所示。
图5 编码流程图
2.2 视频编码软件JNI层的实现
2.2.1 Android系统JNI层的开发流程
在Android平台上,JNI就是一座将Native世界和Java世界有效地连接在一起的桥梁,如图6展示了Android平台上JNI所处的位置。
图6 Android平台中JNI所处位置
Android系统的应用程序是基于Java语言开发的,因此在Android系统上开发JNI程序和普通的JNI开发相类似,当然也有其自身的特点。具体的开发步骤如下:
步骤1,在CCS5.1创建一个Android Project,在Java程序源码中声明Class类名,在类的实现中声明以native开头的本地函数[6]。
步骤2,使用Java编译器自带的Javah命令,自动生成在JNI中开发所需的.h头文件。
步骤3,JNI层程序的编写,主要使用C/C++完成。添加步骤2中的生成.h头文件到当前JNI程序中,实现.h中声明的本地函数,同时实现JNI_OnLoad()函数完成JNI层的动态和静态注册。
步骤4,根据Android系统程序的编译方法,只需创建Android.mk。使用Android系统自带的编译环境以及相应编译命令完成JNI层程序的编译。
2.2.2 Android系统JNI层的实现
根据Android系统JNI层的开发步骤,本文中Android应用层设计的是一个用户操作界面,主要功能是设置相关编码器参数来控制底层的视频编码程序,而控制的实现需要通过JNI层才可以完成。
这里以encode()函数在JNI层本地实现的代码为例,解释JNI在Android系统中的桥梁作用:
JNIEXPORT jint JNICALL
Java_com_andorid_gzz_dm3730_EncodeActivity_
encode(JNIEnv*env,jobject obj)
{
int temp;
temp=encode(args);//底层编码程序的接口
LOGI(“come back value:%d”,temp);
return 1;
}
最终需将底层的视频编码程序编译成为一个共享库libdm3730_encode_sharelibrary.so,并提供encode函数接口,将JNI层的程序编译成为libdm3730_encode.so库,该共享库就是Android应用程序启动需加载的内容。
2.3 视频编码软件用户操作界面的实现
Android系统下开发用户操作界面(GUI)使用Java语言完成,在CCS5.1下可以方便地使用图形化编程完成对main.xml的编写。根据本文对用户操作界面的设计需求,完成如图7所示的用户界面布局图。根据图7设计的用户界面,具体控件实现的功能如图8所示。
从图8中可以看出,EncodeActivity类主要完成的工作是用户界面的创建。以图8中的按钮button1为例,它用于向JNI层发送启动编码的命令,在JNI层中实现对底层视频编码程序的调用,其在用户操作界面中的部分代码如下所示:
private Button button1=null;
private native int encode();
private native void setCodecName(int codec);
button1=(Button)findViewById(R.id.button1);
listener1=new Button.OnClickListener(){
public void onClick(View v){
encode();}
button1.setOnClickListener(listener1);}
从button1实例的实现过程来看,通过new Button.OnClickListener()建立button1的事件监听并建立链接,当按钮被按下后的事件处理是启动encode,实际效果是启动JNI层的encode函数,并将编码器参数各成员传入底层的视频编码程序完成最终的视频编码。
3 视频编码软件测试与分析
将编译通过的库文件和应用程序安装到TI的AM/DM37x EVM评估板上。如图9就是视频编码软件在评估板的LCD上显示的用户操作界面,具有选择编码的文件、编码的类型、编码的像素、编码的码率、编码的帧数以及启动编码和退出编码程序等功能。
图9 DM3730上运行的用户操作界面(截图)
启动应用程序进入视频编码软件的操作界面,设置编码参数,在终端下联机观察评估板Android文件系统下编码文件的变化,测试结果如表1所示。
表1 视频编码软件系统测试结果
表1中的test1.yuv是以UYVY格式存储的视频数据文件,像素为176×144,test1.264是以H.264[7]为视频编码标准经编码后产生的文件,test1.m4v是以MPEG-4为编码标准经编码后产生的文件。
最后,本文使用专用视频数据分析软件对视频数据进行分析,图10所示的是原始的视频图像,图11所示的是原始视频经编码后再回放的图像。
从表1的测试结果以及图10和图11的对比分析可以总结出以下几点内容:
1)设计的视频编码软件从用户界面的操作到对底层视频编码程序的调用已经能顺利的完成。
2)编码后的视频图像经过回放,和原始的视频图像对比,发现图像质量依旧较好,说明整个视频编码软件运行良好。
3)从上述的表格数据中,可以发现视频编码压缩率受编码标准的影响很大,H.264作为当前使用最广泛的视频编码标准,编码的压缩率相对较高。
4 结束语
本文对基于Android和DM3730处理器的视频编码软件开发的研究,分别实现了底层视频编码程序的开发,Android系统JNI层的开发以及用户操作界面的开发,并最终完成视频编码软件的系统测试。从测试结果看,以DM3730处理器为核心、以Android系统为基础开发的基于Codec Engine的视频编码软件,具有可操作性以及良好的视频编码性能。基于本文的研究结果,可将底层的视频编码程序设计成为编码器组件加载到Android系统自带的多媒体框架Stagefright中,方便开发更多与视频编码相关的应用软件。
[1]高文,赵德斌,马思伟.数字视频编码技术原理[M].北京:北京科学出版社,2010.
[2]蒋耘晨.Android系统原理和实战应用[M].北京:北京理工大学出版社,2011.
[3]郭波,樊多,彭凯.基于DaVinc技术的嵌入式视频监控系统设计[J].测控技术,2009,28(10):82-88.
[4]公磊,周聪.基于Android的移动终端应用程序开发与研究[J].计算机与现代化,2008(5):81-89.
[5]彭启琮.达芬奇技术数——数字图像/视频信号处理新平台[M].北京:电子工业出版,2008.
[6]杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2010.
[7]THOMAS W,GARY JS,GISLE B,et al.Overview of the H.264/AVC video coding standard[J].IEEE Trans.Cricuits and System for Video Technology,2003,13(7):560-576.