魏 濤,彭 濤,鄭建宏,楊小明
(重慶郵電大學移動通信技術重慶市重點實驗室,重慶400065)
近年來,隨著移動通信技術的不斷發展和移動終端性能的大幅提升,人們已不再滿足于單純的文本、圖像和聲音文件。多媒體信息因其直觀、信息量大而得到廣泛應用。因此,移動流媒體成為無線網絡技術和多媒體技術的新的發展方向,手機終端上的流媒體應用也日益受到人們的青睞。本文主要基于現有Android手機系統框架提出了一種流媒體播放器設計方案,包括播放器總體分層結構設計、數據處理流程、控制流程、狀態機設計和多線程模式設計。
播放器在播放本地媒體文件或者網絡媒體文件時,都有3個基本階段:獲取媒體數據、音視頻數據流的解碼和媒體數據顯示[1]。根據這3個階段,基于分層的思想,設計播放器總體結構:從下至上依次為數據獲取層、數據預處理層、音視頻解碼層和用戶界面層。分層結構設計使各模塊獨立完成任務,降低了模塊之間的耦合性,各模塊可獨立進行設計和優化,增強了整體可控性。流媒體播放器系統分層結構如圖1所示。

圖1 流媒體播放器系統結構
數據獲取層主要獲取本地媒體文件、通過網絡獲取流媒體數據和處理攝像頭控制信息。本地文件獲取通過手機本地存儲,流媒體文件則需要播放器的網絡模塊與無線通信網的交互來獲取。網絡流媒體文件獲取包括會話協商、數據接收和數據緩存等過程。媒體文件信息協商過程需要使用RTSP協議來完成,主要協商媒體流常規信息。
數據預處理層主要對本地文件和網絡媒體文件進行解封裝,使上層解碼模塊數據一致。對于本地文件,該層完成按照其媒體的格式解封裝,并將解封裝后的數據放入上層解碼緩沖區。對于網絡媒體文件,需要去除RTP包頭信息,并將媒體文件數據進行組幀,然后將數據幀傳遞到上層解碼緩沖區等待解碼。攝像頭的控制信息封裝也在該層完成。
音視頻解碼層的功能是解碼組件選擇、解碼器選擇和多路媒體流同步處理。音視頻解碼層通過本地文件或者網絡媒體文件的文件頭中所帶的格式信息,選擇對應的解碼器對媒體流進行解碼[2]。該層由FFmpeg的libavcodec 完成解碼功能[3]。
用戶界面主要用于提供用戶對播放的控制,用戶控制信息通過界面與播放器之間的交互接口下發后進行控制。本設計采用Android自帶的界面風格,主要完成功能按鈕的實現[4]。
數據流處理主要在Android系統驅動層進行,底層對數據流進行下載、memorycopy、解碼和回放處理。
如圖2所示,在流媒體播放的數據流程中:1)通過無線信道接收數據;2)將經過DSP處理后的數據送給ARM,DSP中的DSP_DMA用于高效的數據搬移;3)數據搬移操作,一般可通過memorycopy或者AXIDMA高速數據搬移來完成;4)媒體數據在ARM中的處理分為兩種,媒體數據軟解碼是媒體數據在ARM中通過軟件算法完成解碼,解碼后的數據在DDR中就能送給音視頻輸出模塊;媒體數據硬解碼是在ARM中僅對數據進行簡單處理后送到DDR的環形緩沖區,DSP音視頻解碼模塊將對該環形緩沖區中的數據進行解碼;5)將DSP解碼后的數據寫回DDR相應的緩存中,為音視頻輸出提供數據;6)音頻輸出通路,解碼生成的PCM數據被傳遞到IIS設備輸出音頻;7)將解碼完成的數據取出,傳遞到Image DMA設備進行高速數據搬移,然后傳遞到格式轉換器進行格式轉換;8)視頻輸出通路,經格式轉換的數據通過LCD設備輸出。其中1)、2)、3)中數據流是雙向的,因為除了下行的數據流外,還有一部分RTSP協議數據上傳到網絡服務器。此外,緩沖區的設計采用動態可配置大小的策略,可根據具體解碼時的數據流大小來協調整個系統的資源,既高效又避免系統資源的浪費。

圖2 流媒體播放數據處理流程
控制流程主要是調用底層DSP提供的接口函數來完成。如圖3所示,當用戶觸發一個播放流程時,播放器就開始對本地文件或者網絡獲取的數據流進行解析,將文件的類型和大小傳遞給ARM多媒體驅動層,傳遞的參數中還包括LCD顯示參數和音量信息。ARM端接收到播放事件后,調用dsp_devinit(),播放器進入idle狀態,player_create()的作用是創建一個播放器實例,player_init()將LCD參數和音量傳遞給DSP,函數player_play(PLAYER_HANDLE id,startpts,0)執行后表明DSP已進入播放階段,該函數中第2個參數指定播放的起始位置(時間),第3個參數表明從文件的開頭來解析文件。控制流程中,上層下發的暫停、恢復、快進/快退、指定點跳轉、停止播放和刪除播放實例分別調用底層的 player_pause(),player_resume(),player_scan(),player_goto(),player_stop(),player_delete()。

圖3 流媒體播放控制流程
此外,網絡媒體文件的播放在控制流程中還有不同之處。用戶執行播放命令后,ARM首先與網絡建立連接,然后向流媒體服務器請求數據。播放器通過RTP服務器將媒體數據流緩沖到DDR中,之后根據緩沖區信息直接讀取數據流。為取得良好的控制,網絡數據流下載控制需與播放器的暫停、恢復和停止等動作對應。
狀態轉移如圖4所示,當用戶通過客戶端軟件向流媒體服務器發出請求并成功建立連接后,客戶端便通過網絡向流媒體服務器獲取數據流,當數據達到一定量后,客戶端開始播放。此過程中,播放器通過維護一個工作狀態機來完成在用戶下發命令后的狀態跳轉。

圖4 流媒體播放器狀態圖
本播放器采用多線程的實現模式:開始播放時,系統同時創建并運行控制線程、視頻解碼回放線程、音頻解碼回放線程和網絡線程。控制信息和數據流在各個線程運行過程中的傳遞如圖5所示。

圖5 多線程實現模式
控制線程:控制音視頻解碼回放,主要負責接收用戶發出的命令信息,發送控制信息給回放線程、網絡線程,并響應用戶發出的控制命令。視頻解碼回放線程:一方面從數據緩沖隊列中取出視頻數據,送入解碼模塊進行解碼;另一方面在音視頻同步處理的控制下,將解碼生成的數據發送到終端的LCD。音頻解碼回放線程:在系統控制下,每播放完一段音頻數據便啟動該線程。該線程從數據緩沖隊列中獲取音頻數據,經過音頻解碼器解碼后,將PCM數據流放入特定的緩存區等待播放。網絡線程:負責與服務器建立連接、接收媒體數據流以及向服務器發送反饋信息,線程的創建和啟動包含連接過程中的監聽子線程。
流媒體播放器的性能指標主要有解碼、CPU負載和內存消耗。播放器CPU負載和內存消耗既影響整個系統資源的性能,又直接反映在用戶體驗上。本播放器的性能通過完成一幀數據所消耗的時間和CPU占用率來體現。
在嵌入式系統中,配置ARM核主頻為600 MHz以內、RAM為256 Mbyte的應用平臺,構建流媒體播放器并進行性能測試。將編譯生成的鏡像文件燒寫到開發板Flash中,啟動開發板,在PC端安裝adb驅動并使用Android自帶的adb連接到PC端。測試數據主要通過Android系統自帶的top等工具和跟蹤信息打印來獲取。
在EDGE/TD-SCDMA網絡環境下,以點播一個網絡視頻(HVGA)為例進行測試。網絡視頻總長度為90 s,根據流媒體播放過程將分成6個階段進行測試分析:1)0~20 s,系統主要進行網絡數據緩沖,點播開始4 s后播放視頻。該過程中I/O操作頻繁,消耗內存大,CPU負載較高,CPU占用率為27% ~29%;2)21~40 s,正常播放階段,播放器下載數據進行緩沖,同時進行解碼播放,I/O操作多且CPU計算量大,CPU占用率保持在30%以內,波動較小,如圖6所示;3)41~49 s,用戶下發暫停播放命令,播放器停止解碼播放進程,數據緩存繼續進行,CPU占用率在10%以內,如圖7所示;4)50~59 s,用戶下發命令恢復播放,進入正常播放階段,由于前面的數據緩沖,I/O操作相對減少,CPU占用率在27%以內;5)60~79 s,用戶快進/快退,數據緩沖量大,I/O操作相對增加,內存消耗變大,CPU占用率在25% ~29%之間;6)80~90 s,恢復正常播放,直至播放結束。網絡下載停止,內存釋放,I/O操作急劇減少,CPU占用率在3%以內。

圖6 穩定播放時系統資源消耗情況

圖7 播放暫停時系統資源消耗情況(截圖)
經多次測試表明,流媒體播放時,從打開到正常播放保持在10 s以內,網絡狀況不佳的情況下,播放緩沖延時控制在5 s以內;流媒體播放的媒體文件清晰度達到HVGA;播放過程中,CPU占用率控制在30%以內,暫停或者停止播放時,CPU占用率大幅下降。
本文對流媒體播放器的分層結構和重要處理流程進行了設計,實現了關鍵技術與核心功能模塊。重點在Android平臺上設計了播放器總體分層結構、各層模塊和數據處理流程、控制流程,對播放器的狀態機模型和線程實現模式進行了設計,主要設計了播放器的狀態轉移模型,并對運行過程中各個線程的功能和多線程的實現模型進行了描述。
本文設計的流媒體播放器已經在基于Linux 2.6.32內核的Android 4.1定制版本上實現,被應用于國家重大專項“TD-SCDMA增強型多媒體手機終端的研發和產業化”中,同時使Android手機終端具備了強大的軟件解碼和流媒體應用功能。
[1]王震,林小川,周運練,等.基于QT4&Linux多媒體播放器系統的設計與實現[J].貴州大學學報:自然科學版,2009(1):60-64.
[2] MICHAEL H,ANTHONY J,FAOUZIK,et al.H.264/AVC baseline profile decoder complexity analysis[J].IEEE Trans.Circuits and Systems for Video Technology,2003,13(7):704-716.
[3]余志龍,王世江.Google Android SDK開發范例大全[M].北京:人民郵電出版社,2009.
[4]張正政,林耀榮.基于Android系統的影音播放器開發[J].現代電子技術,2011,34(2):5-8.