龔澤摯,藍(lán)曉柯,鄭雅羽
(浙江工業(yè)大學(xué) 信息工程學(xué)院,浙江 杭州310023)
近年來,隨著社會(huì)的不斷進(jìn)步和經(jīng)濟(jì)的不斷發(fā)展,信息化已經(jīng)深刻影響了人類的社會(huì)形態(tài)。在半導(dǎo)體存儲(chǔ)、通信、互聯(lián)網(wǎng)技術(shù)、計(jì)算機(jī)技術(shù)的不斷融合與發(fā)展的基礎(chǔ)上,數(shù)字多媒體技術(shù)得以飛速發(fā)展。其中,對(duì)數(shù)字視頻編碼技術(shù)的相關(guān)應(yīng)用提出了更高的要求,如視頻會(huì)議、可視會(huì)議、數(shù)字廣播電視、視頻監(jiān)控,無線網(wǎng)絡(luò)通信等[1]。
Android是Google開發(fā)的一套基于Linux的開源操作系統(tǒng),現(xiàn)已廣泛應(yīng)用于智能手機(jī)、移動(dòng)終端等設(shè)備[2]。Android系統(tǒng)底層主要使用C/C++開發(fā),應(yīng)用程序采用Java語言開發(fā)。由于Android系統(tǒng)的開源特性,其應(yīng)用軟件的可移植性強(qiáng),軟件使用度較高。
DM3730是TI最新的基于DaVinci架構(gòu)設(shè)計(jì)的數(shù)字媒體微處理器。主要由1 GHz的ARM Cortex-A8 Core[3]和800 MHz TMS320C64x+TM DSP Core兩部分組成。由于其具有雙核以及強(qiáng)大的多媒體數(shù)據(jù)處理能力,成為了當(dāng)前視頻處理器的首選。
針對(duì)基于DM3730和Android的視頻編解碼軟件開發(fā),TI專門提供了一套DVSDK方便開發(fā)者使用。TI的開源代碼只實(shí)現(xiàn)了解碼功能,編碼的實(shí)現(xiàn)還有待開發(fā)。因此,編碼功能的實(shí)現(xiàn)也成為了當(dāng)前企業(yè)、科研所和高校研究的熱點(diǎn)。
基于以上內(nèi)容,本文以DM3730為硬件平臺(tái)、Android為操作系統(tǒng),設(shè)計(jì)的視頻編碼軟件可以控制相關(guān)的編碼參數(shù),實(shí)現(xiàn)對(duì)視頻文件的簡單編碼。因此,本文對(duì)基于DM3730和Android系統(tǒng)的視頻編碼軟件開發(fā)的研究,具有很好的應(yīng)用價(jià)值,也具有很高的商業(yè)價(jià)值。
本視頻編碼軟件是基于Android操作系統(tǒng)設(shè)計(jì)而成。Android系統(tǒng)的架構(gòu)主要可以分為以下5個(gè)部分:Linux Kernel,Android Runtime,Libraries,Application Framework和Application[4]。具體如圖1所示。
圖1 Android系統(tǒng)架構(gòu)
根據(jù)Android系統(tǒng)特有的架構(gòu),本文設(shè)計(jì)的視頻編碼軟件主要需要實(shí)現(xiàn)以下3部分內(nèi)容:Android用戶操作界面、JNI層的動(dòng)態(tài)庫、底層的視頻編碼庫。視頻編碼軟件的整體架構(gòu)如圖2所示。
圖2 視頻編碼軟件架構(gòu)
圖2 中的軟件架構(gòu)表明:首先運(yùn)行界面的應(yīng)用程序,界面程序?qū)⒃O(shè)置好的編碼參數(shù)傳遞到JNI層,JNI層解析以后控制底層的編碼程序完成視頻的編碼,最后回調(diào)一定的信息到用戶界面,完成整個(gè)流程。
視頻編碼軟件的實(shí)現(xiàn)最為核心的內(nèi)容是底層編碼程序的開發(fā),需要根據(jù)TI的Codec Engine編寫程序,使得ARM和DSP完成通信,在DSP端完成視頻編碼。同時(shí)為方便用戶的操作,需要設(shè)計(jì)用戶操作界面,以便對(duì)編碼的相關(guān)參數(shù)如編碼標(biāo)準(zhǔn)、編碼碼率、編碼幀數(shù)等進(jìn)行控制,而該部分的真正實(shí)現(xiàn)需要通過設(shè)計(jì)JNI層才能控制底層的核心視頻編碼程序。
2.1.1 編解碼引擎(Codec Engine)的使用
Codec Engine就是DaVinci系統(tǒng)里用來啟動(dòng)和執(zhí)行xDAIS算法的一組API集合[5]。Codec Engine的通信框架是遠(yuǎn)程調(diào)用思想在DaVinci系統(tǒng)上的實(shí)現(xiàn)。其目的是在應(yīng)用程序端調(diào)用另一個(gè)遠(yuǎn)程應(yīng)用程序時(shí),采用與本地調(diào)用相同的調(diào)用方式。圖3所示的就是Codec Engine在ARM和DSP上的通信架構(gòu)。
圖3 Codec Engine通信架構(gòu)
Codec Engine的API包括核心引擎應(yīng)用編程接口(Engine API)和多媒體算法應(yīng)用編程接口(VISA API)。核心Engine API模塊完成打開和關(guān)閉Engine;VISA API模塊是Codec Engine中的主要操作模塊,主要完成編解碼算法實(shí)例的創(chuàng)建,算法的執(zhí)行與控制以及算法實(shí)例的清除。
2.1.2 基于DMAI的底層編碼程序的實(shí)現(xiàn)
DMAI(DaVinci Multimedia Application Interface)是DSP端給ARM端應(yīng)用程序的調(diào)用接口,是操作系統(tǒng)和Codec Engine之上的應(yīng)用接口,可以方便地應(yīng)用在Davinci平臺(tái)上。其結(jié)構(gòu)框圖如圖4所示。
圖4 DMAI框圖
本文中主要基于Codec Engine并使用DMAI的Buffer和Venc1模塊來實(shí)現(xiàn)底層的視頻編碼程序。程序的核心模塊可分為以下4個(gè)部分。
底層視頻編碼程序的流程圖如圖5所示。
圖5 編碼流程圖
2.2.1 Android系統(tǒng)JNI層的開發(fā)流程
在Android平臺(tái)上,JNI就是一座將Native世界和Java世界有效地連接在一起的橋梁,如圖6展示了Android平臺(tái)上JNI所處的位置。
圖6 Android平臺(tái)中JNI所處位置
Android系統(tǒng)的應(yīng)用程序是基于Java語言開發(fā)的,因此在Android系統(tǒng)上開發(fā)JNI程序和普通的JNI開發(fā)相類似,當(dāng)然也有其自身的特點(diǎn)。具體的開發(fā)步驟如下:
步驟1,在CCS5.1創(chuàng)建一個(gè)Android Project,在Java程序源碼中聲明Class類名,在類的實(shí)現(xiàn)中聲明以native開頭的本地函數(shù)[6]。
步驟2,使用Java編譯器自帶的Javah命令,自動(dòng)生成在JNI中開發(fā)所需的.h頭文件。
步驟3,JNI層程序的編寫,主要使用C/C++完成。添加步驟2中的生成.h頭文件到當(dāng)前JNI程序中,實(shí)現(xiàn).h中聲明的本地函數(shù),同時(shí)實(shí)現(xiàn)JNI_OnLoad()函數(shù)完成JNI層的動(dòng)態(tài)和靜態(tài)注冊。
步驟4,根據(jù)Android系統(tǒng)程序的編譯方法,只需創(chuàng)建Android.mk。使用Android系統(tǒng)自帶的編譯環(huán)境以及相應(yīng)編譯命令完成JNI層程序的編譯。
2.2.2 Android系統(tǒng)JNI層的實(shí)現(xiàn)
根據(jù)Android系統(tǒng)JNI層的開發(fā)步驟,本文中Android應(yīng)用層設(shè)計(jì)的是一個(gè)用戶操作界面,主要功能是設(shè)置相關(guān)編碼器參數(shù)來控制底層的視頻編碼程序,而控制的實(shí)現(xiàn)需要通過JNI層才可以完成。
這里以encode()函數(shù)在JNI層本地實(shí)現(xiàn)的代碼為例,解釋JNI在Android系統(tǒng)中的橋梁作用:
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;
}
最終需將底層的視頻編碼程序編譯成為一個(gè)共享庫libdm3730_encode_sharelibrary.so,并提供encode函數(shù)接口,將JNI層的程序編譯成為libdm3730_encode.so庫,該共享庫就是Android應(yīng)用程序啟動(dòng)需加載的內(nèi)容。
Android系統(tǒng)下開發(fā)用戶操作界面(GUI)使用Java語言完成,在CCS5.1下可以方便地使用圖形化編程完成對(duì)main.xml的編寫。根據(jù)本文對(duì)用戶操作界面的設(shè)計(jì)需求,完成如圖7所示的用戶界面布局圖。根據(jù)圖7設(shè)計(jì)的用戶界面,具體控件實(shí)現(xiàn)的功能如圖8所示。
從圖8中可以看出,EncodeActivity類主要完成的工作是用戶界面的創(chuàng)建。以圖8中的按鈕button1為例,它用于向JNI層發(fā)送啟動(dòng)編碼的命令,在JNI層中實(shí)現(xiàn)對(duì)底層視頻編碼程序的調(diào)用,其在用戶操作界面中的部分代碼如下所示:
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實(shí)例的實(shí)現(xiàn)過程來看,通過new Button.OnClickListener()建立button1的事件監(jiān)聽并建立鏈接,當(dāng)按鈕被按下后的事件處理是啟動(dòng)encode,實(shí)際效果是啟動(dòng)JNI層的encode函數(shù),并將編碼器參數(shù)各成員傳入底層的視頻編碼程序完成最終的視頻編碼。
將編譯通過的庫文件和應(yīng)用程序安裝到TI的AM/DM37x EVM評(píng)估板上。如圖9就是視頻編碼軟件在評(píng)估板的LCD上顯示的用戶操作界面,具有選擇編碼的文件、編碼的類型、編碼的像素、編碼的碼率、編碼的幀數(shù)以及啟動(dòng)編碼和退出編碼程序等功能。
圖9 DM3730上運(yùn)行的用戶操作界面(截圖)
啟動(dòng)應(yīng)用程序進(jìn)入視頻編碼軟件的操作界面,設(shè)置編碼參數(shù),在終端下聯(lián)機(jī)觀察評(píng)估板Android文件系統(tǒng)下編碼文件的變化,測試結(jié)果如表1所示。
表1 視頻編碼軟件系統(tǒng)測試結(jié)果
表1中的test1.yuv是以UYVY格式存儲(chǔ)的視頻數(shù)據(jù)文件,像素為176×144,test1.264是以H.264[7]為視頻編碼標(biāo)準(zhǔn)經(jīng)編碼后產(chǎn)生的文件,test1.m4v是以MPEG-4為編碼標(biāo)準(zhǔn)經(jīng)編碼后產(chǎn)生的文件。
最后,本文使用專用視頻數(shù)據(jù)分析軟件對(duì)視頻數(shù)據(jù)進(jìn)行分析,圖10所示的是原始的視頻圖像,圖11所示的是原始視頻經(jīng)編碼后再回放的圖像。
從表1的測試結(jié)果以及圖10和圖11的對(duì)比分析可以總結(jié)出以下幾點(diǎn)內(nèi)容:
1)設(shè)計(jì)的視頻編碼軟件從用戶界面的操作到對(duì)底層視頻編碼程序的調(diào)用已經(jīng)能順利的完成。
2)編碼后的視頻圖像經(jīng)過回放,和原始的視頻圖像對(duì)比,發(fā)現(xiàn)圖像質(zhì)量依舊較好,說明整個(gè)視頻編碼軟件運(yùn)行良好。
3)從上述的表格數(shù)據(jù)中,可以發(fā)現(xiàn)視頻編碼壓縮率受編碼標(biāo)準(zhǔn)的影響很大,H.264作為當(dāng)前使用最廣泛的視頻編碼標(biāo)準(zhǔn),編碼的壓縮率相對(duì)較高。
本文對(duì)基于Android和DM3730處理器的視頻編碼軟件開發(fā)的研究,分別實(shí)現(xiàn)了底層視頻編碼程序的開發(fā),Android系統(tǒng)JNI層的開發(fā)以及用戶操作界面的開發(fā),并最終完成視頻編碼軟件的系統(tǒng)測試。從測試結(jié)果看,以DM3730處理器為核心、以Android系統(tǒng)為基礎(chǔ)開發(fā)的基于Codec Engine的視頻編碼軟件,具有可操作性以及良好的視頻編碼性能?;诒疚牡难芯拷Y(jié)果,可將底層的視頻編碼程序設(shè)計(jì)成為編碼器組件加載到Android系統(tǒng)自帶的多媒體框架Stagefright中,方便開發(fā)更多與視頻編碼相關(guān)的應(yīng)用軟件。
[1]高文,趙德斌,馬思偉.數(shù)字視頻編碼技術(shù)原理[M].北京:北京科學(xué)出版社,2010.
[2]蔣耘晨.Android系統(tǒng)原理和實(shí)戰(zhàn)應(yīng)用[M].北京:北京理工大學(xué)出版社,2011.
[3]郭波,樊多,彭凱.基于DaVinc技術(shù)的嵌入式視頻監(jiān)控系統(tǒng)設(shè)計(jì)[J].測控技術(shù),2009,28(10):82-88.
[4]公磊,周聰.基于Android的移動(dòng)終端應(yīng)用程序開發(fā)與研究[J].計(jì)算機(jī)與現(xiàn)代化,2008(5):81-89.
[5]彭啟琮.達(dá)芬奇技術(shù)數(shù)——數(shù)字圖像/視頻信號(hào)處理新平臺(tái)[M].北京:電子工業(yè)出版,2008.
[6]楊豐盛.Android應(yīng)用開發(fā)揭秘[M].北京:機(jī)械工業(yè)出版社,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.