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