摘 要:近年來(lái),多種方法被用來(lái)提高多媒體的處理能力,其中Gstreamer的方法性能最佳,然而目前擴(kuò)展多媒體框架的多媒體處理能力仍然存在很多問(wèn)題。本文我們提供了另一個(gè)基于Gstreamer的Android視頻多媒體處理框架。大量的實(shí)驗(yàn)表明,這個(gè)基于Gstreamer的框架在效率,兼容性,可行性和通用性等方面,明顯提高了多媒體的處理能力。
關(guān)鍵詞:開(kāi)源操作系統(tǒng);Android系統(tǒng);多媒體框架
中圖分類號(hào):TP368.1;TN919.8文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2018)09-0080-03
Abstract:In recent years,many methods have been used to improve the multimedia processing capability,among which the Gstreamer method has the best performance. However,there are still many problems in extending the multimedia processing capability of the multimedia framework. In this paper,we provide another Android based video multimedia processing framework based on Gstreamer. A large number of experiments show that our Gstreamer based framework significantly improves the multimedia processing capability in terms of efficiency,compatibility,feasibility and versatility.
Keywords:open source operating system;Android system;multimedia framework
0 引 言
Android是移動(dòng)設(shè)備的一種開(kāi)源操作系統(tǒng),在許多多媒體終端被廣泛應(yīng)用,例如Google TV和平板電腦終端。然而,由于原來(lái)的多媒體引擎OpenCore無(wú)法處理大量常用的視頻(音頻)格式數(shù)據(jù),近年來(lái),多種方法被提出應(yīng)用,以增強(qiáng)Android的多媒體處理能力。在不同的擴(kuò)展方法中,基于Gstreamer的方法是最有效的。但是,目前的Android多媒體處理能力框架仍然不夠好,存在很多問(wèn)題。例如,許多框架只能處理特定格式的視頻(音頻)數(shù)據(jù)。本文提出了另一種基于Gstreamer的android多媒體框架,大量的實(shí)驗(yàn)表明我們的框架大大提高了多媒體處理能力的高效率、兼容性、可行性和普遍性。
1 Android系統(tǒng)架構(gòu)
Android系統(tǒng)有五層框架,每層由一些核心組件組成。從上到下,核心組件依次是:應(yīng)用程序,應(yīng)用程序框架,Native C庫(kù),Android運(yùn)行時(shí)環(huán)境(JVM),HAL(硬件抽象層),Linux核心。
(1)應(yīng)用程序。應(yīng)用程序?qū)佑稍S多核心的、基于Java的應(yīng)用程序組成,如日歷,網(wǎng)頁(yè)瀏覽器,短信應(yīng)用程序,電子郵件等。
(2)應(yīng)用程序框架。應(yīng)用程序框架包括Java核心類和一些特殊的Android組件。它允許Android應(yīng)用程序開(kāi)發(fā)人員開(kāi)發(fā)各種Java類的應(yīng)用程序。如一些典型的組件-查看(列表,網(wǎng)格),內(nèi)容提供者,資源管理器,活動(dòng)管理器。
(3)Native C庫(kù)。Native C庫(kù)層有許多C/C++組成庫(kù)。Android的核心功能是由這些庫(kù)實(shí)現(xiàn)的。
(4)Android運(yùn)行時(shí)環(huán)境。運(yùn)行環(huán)境由Dalvik組成的Java虛擬機(jī)和Java核心庫(kù)來(lái)實(shí)現(xiàn)。
(5)HAL。該層抽象不同類型的硬件,并為Native C庫(kù)提供統(tǒng)一的程序接口。HAL可以更輕松的在不同平臺(tái)上制作Android端口。
(6)Linux內(nèi)核。Android的核心系統(tǒng)功能依賴于Linux內(nèi)核,例如安全管理,RAM管理,進(jìn)程管理,網(wǎng)絡(luò)堆棧等。
2 Android多媒體框架
2.1 總體多媒體架構(gòu)
Android系統(tǒng)由五層多媒體框架組成,OpenCore引擎和硬件抽象層用于音頻/視頻的輸入/輸出。它以為Java服務(wù)提供一致的接口為目的。
2.2 OpenCore多媒體引擎
OpenCore是Android多媒體系統(tǒng)的核心。一般來(lái)說(shuō),它具有以下特性:首先,它支持最常見(jiàn)的音頻格式和流媒體(RTSP/RTP)格式的數(shù)據(jù)。其次,能夠與第三方編解碼器一起擴(kuò)展。
依據(jù)常規(guī)體系結(jié)構(gòu),OpenCore擁有許多功能,例如媒體文件格式分析,音頻/視頻解碼等。從下到上,OpenCore包括OSCL(操作系統(tǒng)兼容層),PVMF(包視頻多媒體框架),文件格式分析節(jié)點(diǎn),解碼節(jié)點(diǎn),編碼節(jié)點(diǎn),媒體I/O節(jié)點(diǎn),播放器引擎。此外,多媒體框架的PVPlayer在OpenCore中調(diào)用Player引擎以實(shí)現(xiàn)具體功能。同時(shí)我們可以通過(guò)整合、添加新的解碼節(jié)點(diǎn)將第三方編解碼器轉(zhuǎn)換為OpenCore。
3 基于Gstreamer的多媒體框架
3.1 多媒體框架的設(shè)計(jì)
我們改變了匯編Gstreamer的一部分,以便整個(gè)多媒體框架可以運(yùn)行在具有CPU架構(gòu)的不同種類的多媒體終端(例如:X86,ARM,MIPS,SH4)。此外,我們采用預(yù)鏈接技術(shù)來(lái)加強(qiáng)執(zhí)行效率。最后,我們應(yīng)用OpenMax IL標(biāo)準(zhǔn),以支持特殊開(kāi)發(fā)中的硬件視頻加速板的處理。
3.2 多媒體框架的實(shí)施
為了達(dá)到理想的功能,我們需要進(jìn)行以下工作:
(1)需要移植Android開(kāi)源庫(kù)中的Gstreamer,例如如Glib,Liboil等。
(2)根據(jù)Gstreamer框架,編寫兩個(gè)插件。一個(gè)用于將解碼后的原始視頻數(shù)據(jù)從Gstreamer發(fā)送到Android顯示系統(tǒng)(SurfaceFlinger的);另一個(gè)用于發(fā)送解碼后的原始PCM音頻數(shù)據(jù)到Android音頻系統(tǒng)(Audioflinger)。
(3)基于Gstreamer,構(gòu)建一個(gè)媒體播放器,并提供媒體播放器服務(wù)。
(4)修改匯編代碼,以將Gstreamer應(yīng)用于多種CPU架構(gòu),并在嵌入式環(huán)境中應(yīng)用一些常用的優(yōu)化技術(shù)到Gstreamer。
由于Glib,Libiol和其他相關(guān)庫(kù)的移植工作非常簡(jiǎn)單,在這里我們介紹其余的步驟。
(1)Surfaceflinger。Surfaceflinger是Android顯示的重要組成部分。它具體的實(shí)施機(jī)制相當(dāng)復(fù)雜。此外,它還為Native C使用者和Java使用者提供編程接口。為將解碼的原始數(shù)據(jù)發(fā)送到Surfaceflinger,以在Native C使用者中顯示出來(lái),需要執(zhí)行以下操作:
首先,通過(guò)Surfaceflinger客戶端創(chuàng)建一個(gè)顯示層,并獲取控件界面,即ISurface界面。其次,在Surfaceflinger之間打開(kāi)Session和ISurface界面。再次,利用ISurface控制圖層屬性,如Alpha,Z-order,然后關(guān)閉會(huì)話。第四,清除以前的顯示緩存區(qū),然后將當(dāng)前緩存區(qū)發(fā)送到ISurface中的緩沖堆。最后,銷毀顯示緩沖區(qū),并取消注冊(cè)的ISurface界面。
(2)Audioflinger。Audioflinger是Android音頻系統(tǒng)的重要組成部分。它為Native C使用者和Java使用者提供編程接口。為將解碼后的原始數(shù)據(jù)發(fā)送到Audioflinger進(jìn)行播放,Native C使用者需要執(zhí)行以下操作:
首先,通過(guò)Audioflinger客戶端創(chuàng)建一個(gè)AudioTrack,并獲取控件界面,即ISurface界面。其次,打開(kāi)Audioflinger之間的會(huì)話和ISurface界面。第三,利用ISurface來(lái)控制屬性圖層,如FrameCount,音頻格式,然后關(guān)閉會(huì)話。第四,清除以前的音頻緩沖區(qū),然后將當(dāng)前緩沖區(qū)發(fā)送到ISurface中的緩沖堆。最后,銷毀顯示緩沖區(qū),并取消注冊(cè)的ISurface接口。
(3)媒體播放器。在構(gòu)建了所有必需的Gstreamer插件之后,我們需要借助Gstreamer來(lái)構(gòu)建從Android繼承的媒體播放器MediaPlayer的接口,以為Java框架提供媒體處理服務(wù)。在這些步驟中,我們可以使用Gstreamer中的一些低級(jí)別元素來(lái)構(gòu)建媒體播放器,但是這種方法非常復(fù)雜。例如,關(guān)于特定的視頻剪輯,我們需要分析它屬于哪個(gè)視頻容器格式。然后根據(jù)不同的格式,準(zhǔn)備不同的解復(fù)用與解碼元素,并連接傳輸管道中的所有基本元素,讓整個(gè)視頻處理步驟在其中運(yùn)行。由于不同的視頻剪輯對(duì)應(yīng)不同的處理元素,為了保證實(shí)用性和穩(wěn)定性,我們使用Gstreamer存在的高級(jí)別元素“Playbin2”來(lái)啟動(dòng)傳輸管道。然后,添加一條總線到Playbin2,讓視頻數(shù)據(jù)和視頻處理事件流入總線。最后,啟動(dòng)傳輸管道和總線。在實(shí)施過(guò)程中,我們使用gst-ffmpeg和gstopenmax插件來(lái)解碼視頻/音頻數(shù)據(jù)。運(yùn)行框架時(shí),Gstreamer將原始視頻數(shù)據(jù)(RGB 555)發(fā)送到Surfaceflinger和Audioflinger。至于媒體記錄服務(wù),媒體元信息服務(wù)和H.264編碼視頻播放服務(wù),我們?nèi)匀皇褂肙penCore,因?yàn)镺penCore可以提供全部基本功能,無(wú)需擴(kuò)展。
(4)優(yōu)化方法。由于Gstreamer主要用于Linux的PC上,為了在多樣化的嵌入式環(huán)境中使用,我們需要做一些優(yōu)化。
因?yàn)镚streamer是一個(gè)基于插件的多媒體引擎,整個(gè)系統(tǒng)需要加載許多不同功能的動(dòng)態(tài)庫(kù)來(lái)協(xié)調(diào)完成整個(gè)視頻處理步驟。大量的動(dòng)態(tài)庫(kù)地加載和卸載會(huì)消耗很多內(nèi)存,因此會(huì)嚴(yán)重減少執(zhí)行效率。為了解決這個(gè)問(wèn)題,我們使用了Prelink技術(shù)給每個(gè)動(dòng)態(tài)庫(kù)固定一個(gè)內(nèi)存加載地址,以減少執(zhí)行消費(fèi)。由于不同種類的多媒體終端設(shè)備有不同的CPU架構(gòu),我們必須做出相應(yīng)的擴(kuò)展方案,以保證在ARM,X86,MIPS和ARM等通用CPU架構(gòu)中,SH4能夠運(yùn)行良好。在這里,我們根據(jù)不同的CPU架構(gòu),修改Liboil和Gstreamer引擎中的匯編語(yǔ)言。在處理更多的視頻/音頻容器時(shí),我們添加了許多相關(guān)的Gstreamer插件,例如TS Demux插件。此外,我們?cè)谇度胧江h(huán)境運(yùn)行時(shí),修復(fù)了這些插件中的錯(cuò)誤,以獲得高度的兼容性。最后,我們Android中添加OpenMax IL標(biāo)準(zhǔn)。
4 實(shí)驗(yàn)結(jié)果和分析
4.1 實(shí)驗(yàn)設(shè)置
在我們的實(shí)驗(yàn)中,需要考慮幾種不同類型的視頻容器格式。對(duì)于每種視頻容器格式,我們都會(huì)采用不同的視頻剪輯速率,以及解碼標(biāo)準(zhǔn)和定義。雖然我們的Android操作系統(tǒng)和Gstreamer已經(jīng)被移植到X86,MIPS,ARM和SH4,在這個(gè)實(shí)驗(yàn)中部分,我們以S3C6410 ARM處理器為例。開(kāi)發(fā)板是Real6410,具體參數(shù)為:ARM11三星S2C6410 667MHz主頻,256MB移動(dòng)DDR RAM,頻率266MHz,1GB NAND閃存,Linux 2.6.28。在實(shí)驗(yàn)過(guò)程中,我們將的Gstreamer模塊添加到Android,再將修改后的Android文件系統(tǒng)安裝到開(kāi)發(fā)中,然后安裝Google發(fā)布的原始Java多媒體應(yīng)用程序(無(wú)任何擴(kuò)展名),以測(cè)試我們的工作。
4.2 實(shí)驗(yàn)結(jié)果
我們將四種常見(jiàn)視頻容器格式的運(yùn)行結(jié)果(即,AVI,RMVB,TS和FLV)與基于Gstreamer的多媒體框架的處理結(jié)果進(jìn)行比較,其詳細(xì)的性能評(píng)估見(jiàn)表1。
在表1的列中,1代表OpenCore方法的1個(gè)標(biāo)準(zhǔn),2代表參考文獻(xiàn)[1]中擴(kuò)展的OpenCore,3代表Java+FFMpeg +NDK參考文獻(xiàn)[2]和[3]中的方法,4涉及我們新的基于Gstreamer的擴(kuò)展方法。
針對(duì)MP4和3GP格式的數(shù)據(jù),OpenCore比Gstreamer處理的更高效。至于TS,MPEG等其他視頻格式,Open Core無(wú)法處理它們,Gstreamer和參考文獻(xiàn)[2]中提出的方法(Java+ NDK+FFMpeg)幾乎具有相同的效率。此外,從表1我們可以發(fā)現(xiàn),使用Gstreamer作為多媒體引擎對(duì)不同的視頻格式具有很高的兼容性。
除此之外,我們的方法更可行。例如,如果需要一個(gè)新功能,我們只需要添加一些現(xiàn)有的插件。我們不需要更改Java API,而且所有Java應(yīng)用程序都可以從我們的擴(kuò)展中受益。此外,我們的新型多媒體框架可以在不同的CPU架構(gòu)上良好地運(yùn)行,并具有適當(dāng)?shù)膱?zhí)行效率,因此我們的擴(kuò)展可以應(yīng)用于不同的多媒體終端設(shè)備。而且,借助OpenMax IL Standard,我們的方法可以支持硬件視頻的加速處理。所有的這些都表明,我們的方法可以顯著擴(kuò)展Android的多媒體處理能力,包括效率,兼容性,可行性和通用性。
5 結(jié) 論
本文針對(duì)如何提高Android的視頻(音頻)處理能力,對(duì)其核心媒體引擎OpenCore的擴(kuò)展機(jī)制進(jìn)行了討論和分析,優(yōu)化了常用的基于Gstreamer的Android多媒體框架,提出另一種具有更好工作效率,更高兼容性,可行性和通用性的Android多媒體框架。在位的研究與工作中,我們計(jì)劃考慮一些其他因素,例如使用硬件覆蓋系統(tǒng),以加速視頻顯示輸出。
參考文獻(xiàn):
[1] M Song,J Sun,X Fu,et al. Design and Implementation of Media Player Based on Android [J].International Conference on Wireless Communications,Networking and Mobile Computing,2010:1-4.
[2] M Song,J Sun,X Fu. Research on Architecture of Multimedia and Its Design Based on Android [J].International Conference on Internet Technology and Applications,2010:1-4.
[3] X Fu,X Wu,M Song,et al. Research on audio/video codec based on Android [J].International Conference on Wireless Communications,Networking and Mobile Computing,2010,54(1):1-4.
[4] Gaignard,B.GStreamer as multimedia framework in Android:a new alternative [J].CELF Embedded Linux Conference Europe(CELF ELF Europe),2010.
作者簡(jiǎn)介:涂晶晶(1983-),男,漢族,湖北人,技術(shù)總監(jiān),本科。研究方向:電子信息技術(shù)、圖像處理技術(shù)。