陳冬英
(福建江夏學(xué)院 電子信息科學(xué)學(xué)院 福建 福州 350108)
?
基于MooPlayer的高效穩(wěn)定的OpenMAX設(shè)計(jì)
陳冬英
(福建江夏學(xué)院 電子信息科學(xué)學(xué)院 福建 福州 350108)
強(qiáng)大的多媒體功能已經(jīng)成為衡量智能電視性能的重要標(biāo)準(zhǔn)。MooPlayer系統(tǒng)是基于Android平臺(tái)改進(jìn)設(shè)計(jì)的,重新設(shè)計(jì)OpenMAX層,將組件串接(tunning)在一起,完善數(shù)據(jù)通道,加快數(shù)據(jù)處理過程,并通過Handle消息機(jī)制,實(shí)現(xiàn)模塊間的異步控制。同時(shí),開發(fā)出能支持更多媒體格式、具有強(qiáng)解碼功能、廣泛協(xié)議支持以及高解碼效率的多媒體框架,彌補(bǔ)Android自身在多媒體框架方面的不完善,解決StageFright源碼中能夠支持的媒體格式種類有限、解碼效率低的問題。測(cè)試結(jié)果表明,該MooPlayer播放器系統(tǒng)兼容性強(qiáng),具備穩(wěn)定的播放功能,解碼效率高且能夠支持更多的媒體格式,滿足用戶需求。
Android;多媒體框架;MooPlayer播放器;OpenMAX
隨著移動(dòng)互聯(lián)網(wǎng)的飛速發(fā)展和智能化電視產(chǎn)品的普及,多媒體的應(yīng)用越來越廣泛,作為一款新興的操作系統(tǒng),Android自身的多媒體框架處于不斷完善階段[1-2],版本間分化問題十分嚴(yán)重,且利用Android平臺(tái)上已有的媒體框架開發(fā)時(shí),往往涉及版權(quán)的問題,不能夠靈活地進(jìn)行添加修改、添加新的Codec類型[3]。因此,開發(fā)擁有強(qiáng)解碼功能、高解碼效率且支持廣泛協(xié)議的多媒體框架,具有十分重要的意義[4-5]。
本文設(shè)計(jì)的MooPlayer就是基于Android平臺(tái),借助于Android平臺(tái)的優(yōu)勢(shì),開發(fā)出能適應(yīng)不同硬件平臺(tái)的媒體播放器,并在播放器框架設(shè)計(jì)中保留StageFright框架中使用到的OpenMAX IL引擎[6-7],使得MooPlayer能夠?qū)崿F(xiàn)嵌入式開發(fā),在底層通過OpenMAX IL引擎與硬件編解碼相結(jié)合,提高編碼效率,克服了軟件編碼效率不高的問題,滿足人們對(duì)高清視頻的要求,具有重要意義。
為了加快數(shù)據(jù)處理過程,本設(shè)計(jì)對(duì)MooPlayer的核心部分OMX進(jìn)行重新設(shè)計(jì),將Component進(jìn)行進(jìn)一步封裝和管理,將OMX層的7大組件(AudioDecoder、AudioRender、VideoDecoder、VideoProcessor、VideoScheduler、VideoRender、Clock)串接在一起,構(gòu)成一個(gè)Component鏈條。在上層構(gòu)建Pipeline模式,底層構(gòu)建Tunnel模式,完善數(shù)據(jù)通道,并將解復(fù)用后的音視頻流送到硬件板解碼,加快了解碼速度,使得播放器能夠支持更高的碼率。
完成媒體流信息的解析后,要解決音視頻流與底層的對(duì)接。本設(shè)計(jì)保留StageFright框架中使用到的OpenMAX IL引擎,使得MooPlyaer能夠?qū)崿F(xiàn)嵌入式開發(fā),在底層通過OpenMAX IL引擎與硬件編解碼相結(jié)合,提高了編碼效率,克服了軟件編碼效率不高的問題,滿足人們對(duì)高清視頻的要求。
OpenMAX作為一套免版稅、跨平臺(tái)的多媒體框架標(biāo)準(zhǔn),為多媒體開發(fā)者提供統(tǒng)一的API接口,加速組件的開發(fā)。OpenMAX框架包含了開發(fā)層(Development Layer,DL)、集成層(Integration Layer,IL)及應(yīng)用層(Application Layer,AL)三層[8]。
OpenMAX IL作為一個(gè)系統(tǒng)抽象層,能夠?yàn)橐粢曨l編解碼器(Codec)提供底層接口,使得應(yīng)用層及多媒體框架對(duì)組件(如sink、source)的訪問方式趨于統(tǒng)一[9-10]。Codec對(duì)用戶來說是透明的,可以是軟件或者硬件。
2.1 OMX IL Client總體設(shè)計(jì)
圖1給出OMX IL Client的總體實(shí)現(xiàn)流程。圖中,客戶端(本設(shè)計(jì)中稱為AOMXComponent)先獲取AOMXProxy實(shí)例,并在構(gòu)造函數(shù)中根據(jù)配置加載所需的plugin,本設(shè)計(jì)中加載libmtkomx_tunnel.so,即mtk提供的一個(gè)硬解碼庫(kù)。接著,AOMXProxy調(diào)用IL Core的初始化函數(shù)OMX_init,而后開始創(chuàng)建AudioDecoder、AudioRender、VideoDecoder、VideoProcessor、VideoScheduler、VideoRender及Clock 7大組件。組件創(chuàng)建時(shí)客戶端為組件設(shè)置一個(gè) notification message,用于事件回傳到MooPlayer。組件創(chuàng)建后需要對(duì)其進(jìn)行配置并建立組件間隧道,將組件的狀態(tài)切換至EXECUTING。解復(fù)用后的音視頻數(shù)據(jù)沿著建立的管道進(jìn)行解碼處理,媒體文件播放完后釋放并卸載相應(yīng)的組件,最后銷毀內(nèi)核。下面介紹主要子模塊的詳細(xì)設(shè)計(jì)。
2.2 內(nèi)部類繼承關(guān)系
圖2給出MooPlayer框架中Client端Component類的關(guān)系示意圖。其中,AOMXComponent是所有Client端Component的基類,它在MooPlayer框架中處于一個(gè)適配層的角色,通過AOMXProxy與服務(wù)端(IL Core或IL Component)進(jìn)行通信,完成大部分的工作。
AOMXComponent主要的工作包括:
(1)維護(hù)Component的狀態(tài)以及端口上下文等信息;
(2)暴露IL的接口,供MooPlayer調(diào)用;
(3)處理Component的反饋信息。
圖2 Client端Component類的關(guān)系圖
AOMXProxy是IL Client與IL Component的通信接口,它的作用是:
(1)根據(jù)配置加載不同的 IL 庫(kù)。
(2)封裝并暴露 IL Component 的接口。
(3)通過KeyedVector
(4)轉(zhuǎn)發(fā)IL Client的消息到Component,同時(shí)依賴于ComponentObserver反饋Component的事件或消息到IL Client。
AOMXVideo封裝視頻處理相關(guān)的接口(包括AOMXVideo Decoder、AOMXVideoProcessor、AOMXVideoScheduler和AOMXVideoRender)。同樣,AOMXAudio封裝音頻處理相關(guān)的接口(包括AOMX AudioDecoder、AOMXAudioRender)。同時(shí),基于高效解碼的考慮,AOMXComponent繼承自AHandle,事件處理全部采用異步進(jìn)行,并通過ComponentObserver來監(jiān)聽Component的反饋信息。
MooPlayer框架中為了加快音視頻解碼效率,丟棄了效率較低的軟解碼,設(shè)計(jì)了硬件抽象層,并動(dòng)態(tài)加載硬件解碼庫(kù)libmtkomx_tunnel.so,實(shí)現(xiàn)硬件解碼。不同的硬件可能差別較大,為了便于今后系統(tǒng)在不同的硬件板上進(jìn)行移植,MooPlayer重新設(shè)計(jì)了Hardware層,按照OMX標(biāo)準(zhǔn),封裝了所有硬件接口。如圖3所示,HardwareComponent是硬件抽象層組件的基類,包括HardwareVideo、HardwareAudio及HardwareClock。VendorPeerComponent是所有Vendor Component的基類,IL Component通過OmxHandle向IL Client暴露標(biāo)準(zhǔn)的API。IL Client獲得的handle在OMXComponent的構(gòu)造函數(shù)中創(chuàng)建,并在OmxHandle構(gòu)造函數(shù)中對(duì)暴露給IL Client的函數(shù)指針進(jìn)行賦值。當(dāng)IL Client通過handle調(diào)用IL API時(shí),最終會(huì)調(diào)用到Component的相應(yīng)函數(shù),當(dāng)AOMXProxy調(diào)用 sendCommand時(shí),最終會(huì)調(diào)用到OMXComponent的sendCommand函數(shù)。
圖3 AOMXComponent與HardwareOMX
2.3 數(shù)據(jù)通道的設(shè)計(jì)
2.3.1 數(shù)據(jù)通道的設(shè)計(jì)
OpenMAX IL 以 Component 的形式封裝了應(yīng)用程序所需的功能,每個(gè) Component 對(duì)應(yīng)一個(gè)功能模塊。
Component的結(jié)構(gòu)示意圖如圖4所示。
圖4 Component的結(jié)構(gòu)示意圖
每個(gè)Component都有唯一一個(gè)入口點(diǎn),命名為Component Handle,IL Client在與Component數(shù)據(jù)交互前,需通過IL Core得到組件的Handle。Component通過Port接口和IL Client或組件進(jìn)行通信,每個(gè)組件至少有一個(gè) Port接口,接收待處理的數(shù)據(jù)接口稱為Input Port,發(fā)送處理完的數(shù)據(jù)接口稱為Output Port 。一般Port中包含多個(gè)緩沖區(qū)(Buffer)隊(duì)列,進(jìn)入端口的數(shù)據(jù)先存放于Buffer中。為了加快數(shù)據(jù)處理,可將多組件相聯(lián)接,構(gòu)成Component 鏈條,對(duì)數(shù)據(jù)進(jìn)行流式處理。
Component有兩種工作模式,MooPlayer多媒體框架中,為加快數(shù)據(jù)通信,采用Tunnel工作模式,將視頻解碼組件(VideoDecoder)處理后的視頻流直接沿著建立的數(shù)據(jù)通道傳入視頻處理組件(VideoProcessor),VideoProcessor處理后的視頻幀再送入視頻調(diào)度組件(VideoSchduler),經(jīng)過調(diào)度處理的視頻流最后通過視頻渲染(VideoRender)組件輸出。同樣,對(duì)于音頻流,經(jīng)過音頻解碼(AudioDecoder)后的數(shù)據(jù)直接送入音頻播出組件(AudioRender)。另外,Clock組件所設(shè)定的時(shí)間時(shí)刻與音頻幀的PTS保持一致,視頻渲染組件再根據(jù)Clock來調(diào)整進(jìn)度,從而實(shí)現(xiàn)音視頻同步。MooPlayer系統(tǒng)中用到的7大組件的連接方式如圖5所示。
圖5 MooPlayer框架中Tunnel模式下的數(shù)據(jù)流通道
2.3.2 數(shù)據(jù)通道的控制
MooPlayer框架中,AOMXComponent 通過調(diào)用相應(yīng)的函數(shù)來完成Buffer在Client與OMX間的傳遞,以音頻數(shù)據(jù)為例,其數(shù)據(jù)在Client與OMX間的傳遞設(shè)計(jì)如圖6所示。
(1)MooPlayer調(diào)用onFillThisBuffer()來填充未解碼的音視頻數(shù)據(jù),調(diào)用mSource->dequeueAccessUnit()保證幀的完整性,填充完向AOMXComponent回復(fù)kwhatInputBufferFilled()。
(2)AOMXComponent使用EmptyThisBuffer把未解碼的Buffer傳遞到解碼組件(音頻流對(duì)應(yīng)AudioDecoder),解碼組件收到EmptyThisBuffer后會(huì)讀取組件接收端口中的數(shù)據(jù)進(jìn)行解碼。當(dāng)緩沖區(qū)(Buffer)中的音視頻數(shù)據(jù)被消耗完時(shí),解碼組件會(huì)向AOMXComponent反饋EmptyBufferDone。
(3)AOMXComponent收到該命令后繼續(xù)向上層要數(shù)據(jù)來填充Buffer,繼續(xù)向MooPlayer發(fā)送KwhatFillThisBuffer。
(4)由于采用Tunnel模式,不同的Component形成一條完整的數(shù)據(jù)通道,當(dāng)音頻數(shù)據(jù)在AudioDecoder解碼完成后,數(shù)據(jù)會(huì)直接從AudioDecoder的Output Port Buffer流入AudioRender的Input Port Buffer。
MooPlayer丟棄效率較低的軟解碼,因此采用的測(cè)試環(huán)境是臺(tái)灣聯(lián)發(fā)科技股份有限公司(MediaTek.Inc)旗下的MT5593硬件板,將解析后的媒體信息流送入板子進(jìn)行硬件解碼,加快了解碼速度。
3.1 功能驗(yàn)證
為保證設(shè)計(jì)方案可實(shí)現(xiàn)要求規(guī)范的模塊內(nèi)容,在評(píng)估系統(tǒng)性能前,先對(duì)播放功能的實(shí)現(xiàn)進(jìn)行驗(yàn)證。
首先,在DLNA官網(wǎng)上注冊(cè)賬號(hào)密碼,搭建MCVT(Media Compatibility Verification Tool)測(cè)試環(huán)境,利用官網(wǎng)上給的媒體文件對(duì)MooPlayer進(jìn)行自動(dòng)化測(cè)試,進(jìn)而對(duì)其基本播放功能及系統(tǒng)兼容性進(jìn)行驗(yàn)證。測(cè)試結(jié)果如圖7所示。由圖可知,MooPlayer能夠播放DLNA官網(wǎng)上指定的媒體文件,系統(tǒng)兼容性強(qiáng),支持Play、Stop、Pause、Seek、Fast Forward等基本播放功能。
圖7 MCTV Test測(cè)試結(jié)果
3.2 性能測(cè)試報(bào)告
驗(yàn)證一個(gè)設(shè)計(jì)方案是否具備可行性、穩(wěn)定性是否良好,需要分析性能參數(shù)是否能被用戶所接受,并對(duì)系統(tǒng)性能做出合理的評(píng)估。衡量播放性能指標(biāo)主要包括媒體格式支持情況和媒體播放所占用的功耗大小。
本設(shè)計(jì)對(duì)MooPlayer能支持的包裝格式及編碼標(biāo)準(zhǔn)進(jìn)行了驗(yàn)證,表1列出了測(cè)試結(jié)果,并與Android自帶的StageFrightPlayer進(jìn)行了對(duì)比。從測(cè)試結(jié)果來看,MooPlayer幾乎能支持所有常見的包裝格式及傳輸協(xié)議,比Android原生的StagefrightPlayer支持的媒體格式更全面。如:Android自帶媒體播放器不能解析MKV、F4V等視頻編碼格式,而MooPlayer能夠支持這些格式;由于OpenCore中沒有包含對(duì)應(yīng)的flac的解碼器,因此Android原生的StageFrightPlayer不能播放Flac無(wú)損音樂,而MooPlayer并沒有沿用Android原本的解包裝,而是選用FFmpegExtractor的解包裝,媒體格式識(shí)別功能更強(qiáng)大,更能滿足人們的需求。
表1 支持的媒體格式類型比較
同時(shí),本設(shè)計(jì)選取分辨率為1 920×1 080的avi音視頻文件作為分析對(duì)象,采用top命令實(shí)時(shí)檢測(cè)系統(tǒng)中各個(gè)進(jìn)程的資源占用情況。測(cè)出MooPlayer的CPU占用情況如表2所示。分析表2可知,待播狀態(tài)時(shí)功耗小,這時(shí)處在用戶選擇播放文件的界面;啟動(dòng)狀態(tài)時(shí)CPU總的占用率為42%,低于50%,易于快速響應(yīng)播放操作,可保證流暢觀影;播放狀態(tài)時(shí),只需要將音視頻解碼后進(jìn)行顯示播放,因此CPU占用率較低。經(jīng)過多個(gè)音視頻文件測(cè)試,CPU占用率的變化率均保持在1%,說明該播放器具有較高的穩(wěn)定性。
表2 播放過程的CPU占用 (%)
本文針對(duì)Android原生的StageFright多媒體框架上存在的問題,提出了基于Android系統(tǒng)的智能電視MooPlayer媒體播放器的解決方案,對(duì)OMX進(jìn)行重新設(shè)計(jì),對(duì)Component進(jìn)行進(jìn)一步封裝和管理,上層構(gòu)建Pipeline模式,底層構(gòu)建Tunnel模式,完善數(shù)據(jù)通道,并將解復(fù)用后的音視頻流送到硬件板解碼。功能測(cè)試結(jié)果表明,該MooPlayer播放器系統(tǒng)兼容性強(qiáng),且能夠支持更多的媒體格式。同時(shí)性能分析結(jié)果表明,本文所設(shè)計(jì)的播放器能夠支持的視頻碼率更高,符合實(shí)時(shí)性的要求,且播放功耗維持穩(wěn)定,可保證流暢播放,滿足用戶需求。在Android平臺(tái)上進(jìn)行媒體播放器的開發(fā)能夠滿足人們對(duì)智能電視平臺(tái)多媒體應(yīng)用的需要,具有十分重要的意義。
[1] MIP公司.將智能AndroidTM體驗(yàn)帶到所有帶HDMI接口的數(shù)字電視[J].電子技術(shù)應(yīng)用,2012,38(8):5-9.
[2] Cheng Yonghua, Kuo Wenkuang, Su S L. An Android system design and implementation for Telematics services[C]. IEEE International Conference on Intelligent Computing and Intelligent Systems(ICIS), 2010:206-210.
[3] 陳偉軍,鄭睿,虞鴻.一種基于Android智能手機(jī)的視頻上傳軟件[J] .微型機(jī)與應(yīng)用,2013,32(24):50-53.
[4] Song Maoqiang, Xiong Wenkuo, Fu Xiangling. Research on architecture of multimedia and its design based on Android[C]. International Conference on Internet Technology and Applications, 2010:1-4.
[5] 王冉.基于Android的多媒體及相關(guān)技術(shù)的研究和應(yīng)用[D].北京:北京郵電大學(xué),2014.
[6] 郭亮.OpenMAXIL的研究與應(yīng)用[D].青島:中國(guó)海洋大學(xué),2012.
[7] 百度百科.RealPlayer[EB/OL].(2014-3-19)[2017-02-15]http: //baike. Baidu. com/view/5481504. htm.
[8] BARBA J, DE L F D, RINCON F, et al.Openmax hardware native support for efficient multimedia embedded systems[J].IEEE Transactions on Consumer Electronics,2010,56(3):1722-1729.
[9] 孫俊輝.基于Android平臺(tái)的多媒體框架研究與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2012.
[10] 公磊,周聰.基于Android的移動(dòng)終端應(yīng)用程序開發(fā)與研究[J].計(jì)算機(jī)與現(xiàn)代,2008(8):85-89.
Efficient and stable OpenMAX design based on MooPlaye
Chen Dongying
(College of Electronic Information Science, Fujian Jiangxia University, Fuzhou 350108, China)
Powerful multimedia function is an important standard to measure the performance of smart TV. The design of the MooPlayer system is based on the Android platform . The OpenMAX layer is redesigned, the component is connected in series (tunning) together, the channels data is improved to accelerate the process of data processing, and through the Handle message mechanism the asynchronous inter module control is realized. Meanwhile, the multimedia framework is exploited, which can support more multimedia formats, with strong decoding functions, extensive protocol support. The system can make up for the imperfect Android native multimedia framework, which solves the problem of limited media format and low decoding efficiency in StageFright source code. The results show that the MooPlayer player system has strong compatibility, stable playback function, high decoding efficiency and can support more media formats to meet user needs.
Android; multimedia framework; MooPlayer; OpenMAX
TP949.197
A
10.19358/j.issn.1674- 7720.2017.14.012
陳冬英.基于MooPlayer的高效穩(wěn)定的OpenMAX設(shè)計(jì)[J].微型機(jī)與應(yīng)用,2017,36(14):35-38,42.
2017-02-17)
陳冬英(1989-),女,碩士研究生,助教,主要研究方向:數(shù)字電視的音視頻處理、通信系統(tǒng)的設(shè)計(jì)與研究。