陳冬英
(福建江夏學院 電子信息科學學院 福建 福州 350108)
?
基于MooPlayer的高效穩定的OpenMAX設計
陳冬英
(福建江夏學院 電子信息科學學院 福建 福州 350108)
強大的多媒體功能已經成為衡量智能電視性能的重要標準。MooPlayer系統是基于Android平臺改進設計的,重新設計OpenMAX層,將組件串接(tunning)在一起,完善數據通道,加快數據處理過程,并通過Handle消息機制,實現模塊間的異步控制。同時,開發出能支持更多媒體格式、具有強解碼功能、廣泛協議支持以及高解碼效率的多媒體框架,彌補Android自身在多媒體框架方面的不完善,解決StageFright源碼中能夠支持的媒體格式種類有限、解碼效率低的問題。測試結果表明,該MooPlayer播放器系統兼容性強,具備穩定的播放功能,解碼效率高且能夠支持更多的媒體格式,滿足用戶需求。
Android;多媒體框架;MooPlayer播放器;OpenMAX
隨著移動互聯網的飛速發展和智能化電視產品的普及,多媒體的應用越來越廣泛,作為一款新興的操作系統,Android自身的多媒體框架處于不斷完善階段[1-2],版本間分化問題十分嚴重,且利用Android平臺上已有的媒體框架開發時,往往涉及版權的問題,不能夠靈活地進行添加修改、添加新的Codec類型[3]。因此,開發擁有強解碼功能、高解碼效率且支持廣泛協議的多媒體框架,具有十分重要的意義[4-5]。
本文設計的MooPlayer就是基于Android平臺,借助于Android平臺的優勢,開發出能適應不同硬件平臺的媒體播放器,并在播放器框架設計中保留StageFright框架中使用到的OpenMAX IL引擎[6-7],使得MooPlayer能夠實現嵌入式開發,在底層通過OpenMAX IL引擎與硬件編解碼相結合,提高編碼效率,克服了軟件編碼效率不高的問題,滿足人們對高清視頻的要求,具有重要意義。
為了加快數據處理過程,本設計對MooPlayer的核心部分OMX進行重新設計,將Component進行進一步封裝和管理,將OMX層的7大組件(AudioDecoder、AudioRender、VideoDecoder、VideoProcessor、VideoScheduler、VideoRender、Clock)串接在一起,構成一個Component鏈條。在上層構建Pipeline模式,底層構建Tunnel模式,完善數據通道,并將解復用后的音視頻流送到硬件板解碼,加快了解碼速度,使得播放器能夠支持更高的碼率。
完成媒體流信息的解析后,要解決音視頻流與底層的對接。本設計保留StageFright框架中使用到的OpenMAX IL引擎,使得MooPlyaer能夠實現嵌入式開發,在底層通過OpenMAX IL引擎與硬件編解碼相結合,提高了編碼效率,克服了軟件編碼效率不高的問題,滿足人們對高清視頻的要求。
OpenMAX作為一套免版稅、跨平臺的多媒體框架標準,為多媒體開發者提供統一的API接口,加速組件的開發。OpenMAX框架包含了開發層(Development Layer,DL)、集成層(Integration Layer,IL)及應用層(Application Layer,AL)三層[8]。
OpenMAX IL作為一個系統抽象層,能夠為音視頻編解碼器(Codec)提供底層接口,使得應用層及多媒體框架對組件(如sink、source)的訪問方式趨于統一[9-10]。Codec對用戶來說是透明的,可以是軟件或者硬件。
2.1 OMX IL Client總體設計
圖1給出OMX IL Client的總體實現流程。圖中,客戶端(本設計中稱為AOMXComponent)先獲取AOMXProxy實例,并在構造函數中根據配置加載所需的plugin,本設計中加載libmtkomx_tunnel.so,即mtk提供的一個硬解碼庫。接著,AOMXProxy調用IL Core的初始化函數OMX_init,而后開始創建AudioDecoder、AudioRender、VideoDecoder、VideoProcessor、VideoScheduler、VideoRender及Clock 7大組件。組件創建時客戶端為組件設置一個 notification message,用于事件回傳到MooPlayer。組件創建后需要對其進行配置并建立組件間隧道,將組件的狀態切換至EXECUTING。解復用后的音視頻數據沿著建立的管道進行解碼處理,媒體文件播放完后釋放并卸載相應的組件,最后銷毀內核。下面介紹主要子模塊的詳細設計。
2.2 內部類繼承關系
圖2給出MooPlayer框架中Client端Component類的關系示意圖。其中,AOMXComponent是所有Client端Component的基類,它在MooPlayer框架中處于一個適配層的角色,通過AOMXProxy與服務端(IL Core或IL Component)進行通信,完成大部分的工作。
AOMXComponent主要的工作包括:
(1)維護Component的狀態以及端口上下文等信息;
(2)暴露IL的接口,供MooPlayer調用;
(3)處理Component的反饋信息。

圖2 Client端Component類的關系圖
AOMXProxy是IL Client與IL Component的通信接口,它的作用是:
(1)根據配置加載不同的 IL 庫。
(2)封裝并暴露 IL Component 的接口。
(3)通過KeyedVector
(4)轉發IL Client的消息到Component,同時依賴于ComponentObserver反饋Component的事件或消息到IL Client。
AOMXVideo封裝視頻處理相關的接口(包括AOMXVideo Decoder、AOMXVideoProcessor、AOMXVideoScheduler和AOMXVideoRender)。同樣,AOMXAudio封裝音頻處理相關的接口(包括AOMX AudioDecoder、AOMXAudioRender)。同時,基于高效解碼的考慮,AOMXComponent繼承自AHandle,事件處理全部采用異步進行,并通過ComponentObserver來監聽Component的反饋信息。
MooPlayer框架中為了加快音視頻解碼效率,丟棄了效率較低的軟解碼,設計了硬件抽象層,并動態加載硬件解碼庫libmtkomx_tunnel.so,實現硬件解碼。不同的硬件可能差別較大,為了便于今后系統在不同的硬件板上進行移植,MooPlayer重新設計了Hardware層,按照OMX標準,封裝了所有硬件接口。如圖3所示,HardwareComponent是硬件抽象層組件的基類,包括HardwareVideo、HardwareAudio及HardwareClock。VendorPeerComponent是所有Vendor Component的基類,IL Component通過OmxHandle向IL Client暴露標準的API。IL Client獲得的handle在OMXComponent的構造函數中創建,并在OmxHandle構造函數中對暴露給IL Client的函數指針進行賦值。當IL Client通過handle調用IL API時,最終會調用到Component的相應函數,當AOMXProxy調用 sendCommand時,最終會調用到OMXComponent的sendCommand函數。

圖3 AOMXComponent與HardwareOMX
2.3 數據通道的設計
2.3.1 數據通道的設計
OpenMAX IL 以 Component 的形式封裝了應用程序所需的功能,每個 Component 對應一個功能模塊。
Component的結構示意圖如圖4所示。

圖4 Component的結構示意圖
每個Component都有唯一一個入口點,命名為Component Handle,IL Client在與Component數據交互前,需通過IL Core得到組件的Handle。Component通過Port接口和IL Client或組件進行通信,每個組件至少有一個 Port接口,接收待處理的數據接口稱為Input Port,發送處理完的數據接口稱為Output Port 。一般Port中包含多個緩沖區(Buffer)隊列,進入端口的數據先存放于Buffer中。為了加快數據處理,可將多組件相聯接,構成Component 鏈條,對數據進行流式處理。
Component有兩種工作模式,MooPlayer多媒體框架中,為加快數據通信,采用Tunnel工作模式,將視頻解碼組件(VideoDecoder)處理后的視頻流直接沿著建立的數據通道傳入視頻處理組件(VideoProcessor),VideoProcessor處理后的視頻幀再送入視頻調度組件(VideoSchduler),經過調度處理的視頻流最后通過視頻渲染(VideoRender)組件輸出。同樣,對于音頻流,經過音頻解碼(AudioDecoder)后的數據直接送入音頻播出組件(AudioRender)。另外,Clock組件所設定的時間時刻與音頻幀的PTS保持一致,視頻渲染組件再根據Clock來調整進度,從而實現音視頻同步。MooPlayer系統中用到的7大組件的連接方式如圖5所示。

圖5 MooPlayer框架中Tunnel模式下的數據流通道
2.3.2 數據通道的控制
MooPlayer框架中,AOMXComponent 通過調用相應的函數來完成Buffer在Client與OMX間的傳遞,以音頻數據為例,其數據在Client與OMX間的傳遞設計如圖6所示。
(1)MooPlayer調用onFillThisBuffer()來填充未解碼的音視頻數據,調用mSource->dequeueAccessUnit()保證幀的完整性,填充完向AOMXComponent回復kwhatInputBufferFilled()。
(2)AOMXComponent使用EmptyThisBuffer把未解碼的Buffer傳遞到解碼組件(音頻流對應AudioDecoder),解碼組件收到EmptyThisBuffer后會讀取組件接收端口中的數據進行解碼。當緩沖區(Buffer)中的音視頻數據被消耗完時,解碼組件會向AOMXComponent反饋EmptyBufferDone。
(3)AOMXComponent收到該命令后繼續向上層要數據來填充Buffer,繼續向MooPlayer發送KwhatFillThisBuffer。
(4)由于采用Tunnel模式,不同的Component形成一條完整的數據通道,當音頻數據在AudioDecoder解碼完成后,數據會直接從AudioDecoder的Output Port Buffer流入AudioRender的Input Port Buffer。
MooPlayer丟棄效率較低的軟解碼,因此采用的測試環境是臺灣聯發科技股份有限公司(MediaTek.Inc)旗下的MT5593硬件板,將解析后的媒體信息流送入板子進行硬件解碼,加快了解碼速度。
3.1 功能驗證
為保證設計方案可實現要求規范的模塊內容,在評估系統性能前,先對播放功能的實現進行驗證。
首先,在DLNA官網上注冊賬號密碼,搭建MCVT(Media Compatibility Verification Tool)測試環境,利用官網上給的媒體文件對MooPlayer進行自動化測試,進而對其基本播放功能及系統兼容性進行驗證。測試結果如圖7所示。由圖可知,MooPlayer能夠播放DLNA官網上指定的媒體文件,系統兼容性強,支持Play、Stop、Pause、Seek、Fast Forward等基本播放功能。

圖7 MCTV Test測試結果
3.2 性能測試報告
驗證一個設計方案是否具備可行性、穩定性是否良好,需要分析性能參數是否能被用戶所接受,并對系統性能做出合理的評估。衡量播放性能指標主要包括媒體格式支持情況和媒體播放所占用的功耗大小。
本設計對MooPlayer能支持的包裝格式及編碼標準進行了驗證,表1列出了測試結果,并與Android自帶的StageFrightPlayer進行了對比。從測試結果來看,MooPlayer幾乎能支持所有常見的包裝格式及傳輸協議,比Android原生的StagefrightPlayer支持的媒體格式更全面。如:Android自帶媒體播放器不能解析MKV、F4V等視頻編碼格式,而MooPlayer能夠支持這些格式;由于OpenCore中沒有包含對應的flac的解碼器,因此Android原生的StageFrightPlayer不能播放Flac無損音樂,而MooPlayer并沒有沿用Android原本的解包裝,而是選用FFmpegExtractor的解包裝,媒體格式識別功能更強大,更能滿足人們的需求。

表1 支持的媒體格式類型比較
同時,本設計選取分辨率為1 920×1 080的avi音視頻文件作為分析對象,采用top命令實時檢測系統中各個進程的資源占用情況。測出MooPlayer的CPU占用情況如表2所示。分析表2可知,待播狀態時功耗小,這時處在用戶選擇播放文件的界面;啟動狀態時CPU總的占用率為42%,低于50%,易于快速響應播放操作,可保證流暢觀影;播放狀態時,只需要將音視頻解碼后進行顯示播放,因此CPU占用率較低。經過多個音視頻文件測試,CPU占用率的變化率均保持在1%,說明該播放器具有較高的穩定性。

表2 播放過程的CPU占用 (%)
本文針對Android原生的StageFright多媒體框架上存在的問題,提出了基于Android系統的智能電視MooPlayer媒體播放器的解決方案,對OMX進行重新設計,對Component進行進一步封裝和管理,上層構建Pipeline模式,底層構建Tunnel模式,完善數據通道,并將解復用后的音視頻流送到硬件板解碼。功能測試結果表明,該MooPlayer播放器系統兼容性強,且能夠支持更多的媒體格式。同時性能分析結果表明,本文所設計的播放器能夠支持的視頻碼率更高,符合實時性的要求,且播放功耗維持穩定,可保證流暢播放,滿足用戶需求。在Android平臺上進行媒體播放器的開發能夠滿足人們對智能電視平臺多媒體應用的需要,具有十分重要的意義。
[1] MIP公司.將智能AndroidTM體驗帶到所有帶HDMI接口的數字電視[J].電子技術應用,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] .微型機與應用,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的多媒體及相關技術的研究和應用[D].北京:北京郵電大學,2014.
[6] 郭亮.OpenMAXIL的研究與應用[D].青島:中國海洋大學,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平臺的多媒體框架研究與實現[D].成都:電子科技大學,2012.
[10] 公磊,周聰.基于Android的移動終端應用程序開發與研究[J].計算機與現代,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的高效穩定的OpenMAX設計[J].微型機與應用,2017,36(14):35-38,42.
2017-02-17)
陳冬英(1989-),女,碩士研究生,助教,主要研究方向:數字電視的音視頻處理、通信系統的設計與研究。