基于A(yíng)ndroid 2.3的多媒體播放器軟件解決方案
0 引言
Android本義為“機器人”,是目前最流行的移動(dòng)終端開(kāi)發(fā)平臺,依靠Google的強大開(kāi)發(fā)和媒體資源,Android成為眾多移動(dòng)終端廠(chǎng)商競相追逐的對象。當今全球信息時(shí)代,移動(dòng)終端不再局限于通信業(yè)務(wù),多媒體業(yè)務(wù)的應用才是終端廠(chǎng)商的發(fā)展方向。音視頻播放作為一項不可或缺的多媒體業(yè)務(wù),對于具有豐富的可編程擴展性的Android操作系統,可以開(kāi)發(fā)出個(gè)性化的音視頻播放應用軟件。
1 Android平臺
1.1 Android系統架構
Android是Google于2007年11月5日宣布的基于Linux平臺開(kāi)源手機操作系統名稱(chēng),該平臺由操作系統、中間件、用戶(hù)界面和應用軟件組成。從軟件分層的角度來(lái)看,Android平臺自上而下由應用程序、應用程序框架、Android運行時(shí)、庫及Linux內核共5部分構成。
1.2 Android應用程序組件
Android系統的基本組件包括Activity(活動(dòng))、Service(服務(wù))、BroadcastReceiver(廣播接收者)和ContentProvider(內容提供者)等,此外還包括專(zhuān)門(mén)負責在基本組件之間傳遞消息的Intent(意向)組件。
2 軟件解決方案
2.1 概述
基于Android平臺的多媒體播放器軟件主要由3個(gè)模塊組成:?jiǎn)?dòng)畫(huà)面模塊、音頻播放模塊、視頻播放模塊。該播放器具有播放列表預覽、前進(jìn)、后退、暫停、繼續、進(jìn)度拖曳和停止等功能。
2.2 用戶(hù)界面設計
在A(yíng)ndroid應用中,UI(用戶(hù)界面)是人與手機之間傳遞、交換信息的媒介和對話(huà)接口,是Android系統的重要組成部分。本文設計的多媒體播放器界面主要由主界面、音/視頻資源列表界面、音/視頻播放列表界面、音/視頻播放界面等組成。本文重點(diǎn)介紹前2種界面設計。
2.2.1 主界面設計
主界面采用標簽布局,使用TabHost(標簽頁(yè)視圖)并定義2個(gè)標簽,分別是音頻播放列表標簽頁(yè)和視頻播放列表標簽頁(yè)。
TabHost(標簽頁(yè)視圖)必須配合TabActivity(標簽Activity組件)使用。該播放器主界面的MainActivity繼承自TabActivity,初始化2個(gè)標簽頁(yè),并為每個(gè)標簽分配不同的用戶(hù)Activity(活動(dòng)),MusicActivitv(音頻播放)和VedioActivity(視頻播放),通過(guò)調用指定的Intent來(lái)打開(kāi)合適的Activity(活動(dòng))。
2.2.2 資源列表界面設計
資源列表界面采用ListView(列表視圖)作為核心視圖。以視頻資源列表為例,SD卡中的視頻資源列表如圖1所示。
該列表的Activity組件(VideoLibrary)繼承自L(fǎng)istActivity。通過(guò)Android平臺為基礎數據類(lèi)型(視頻信息)裝載ContentProvider(內容提供器),來(lái)獲取位于SD卡設備目錄/data/data/com.a(chǎn)ndroid.providers.media/databases里的視頻數據庫信息,并使用Simple Curosr Adapter適配器作為列表適配器將視頻資源信息填充到列表視圖中。
2.3 數據存儲
Android平臺主要提供了4種數據存儲機制:Preferences(參數選項),Databases(數據庫),Files(文件)和Network(網(wǎng)絡(luò ))。
Preferences(參數選項)是一種輕量級的、用于存儲或獲取數據類(lèi)型的“鍵-值”項的機制。它通常用來(lái)存放應用程序的配置信息。本文設計的多媒體播放器采用Preferen ces機制來(lái)存儲或獲取音/視頻歷史播放信息等配置信息。
2.3.1 獲取數據
若要獲取Preferences文件的數據,例如繼續播放動(dòng)作需要讀取播放歷史信息。首先通過(guò)調用Context.getSharedPreferences(String name,int mode)方法傳入Preferences文件名和打開(kāi)模式來(lái)獲得一個(gè)Shared Preferences對象sp,若該Preferences文件不存在,在提交數據后會(huì )創(chuàng )建該Preferences文件。利用該sp對象調用getter方法,傳入相應的鍵來(lái)讀取數據。
在A(yíng)ndroid平臺中,所有音/視頻文件的相關(guān)信息都是以Content的形式提供給開(kāi)發(fā)者的,所以歷史播放信息是content://樣式的URI,也就是前面提到的nowPlaying。
2.3.2 存儲數據
若要修改Preferences文件的數據,例如暫停當前播放,或停止播放并退出該播放器軟件會(huì )引起播放歷史信息的變更。而產(chǎn)生該動(dòng)作的原理是,每當播放新的音/視頻文件首先將其URI賦值到全局變量nowPlaying,然后在退出該播放軟件時(shí)處理變更工作:利用Shared Prefer ences對象sp調用edit()方法獲得一個(gè)內部類(lèi)Editor對象editor,利用該editor對象對Preferences文件進(jìn)行編輯,即讀取nowPlaying的數據,隨后必須調用commit()方法才可以完成修改該Preferences文件里鍵為URI_KEY的對應數值。
2.4 多媒體應用
2.4.1 多媒體宏觀(guān)結構
Android的多媒體部分框架涉及應用程序、Java框架層、C語(yǔ)言框架、硬件抽象層等環(huán)節。其中Android Java框架層提供標準多媒體API供上層相關(guān)應用程序調用。而媒體的播放過(guò)程實(shí)際上是由下層的OpenCore和Stagefright等實(shí)現的。Android多媒體宏觀(guān)結構如圖2所示。
2.4.2 多媒體處理過(guò)程
典型數據流在多媒體播放器中的運行過(guò)程主要經(jīng)過(guò)以下環(huán)節:最上層的Java應用程序將媒體URI(媒體文件或者流媒體)作為輸入設置到媒體播放器中(主要是通過(guò)Android平臺提供的標準接口A(yíng)PI,如MediaPlayer(媒體播放器接口)等),經(jīng)過(guò)Java框架層,JNI和本地框架層,一直設置到PVPlayer(OpenCore)。該過(guò)程中只是傳遞媒體URI路徑,并無(wú)數據流傳遞。由PVPlayer進(jìn)行解析后,將媒體分成音頻流(MP3,AMR,AAC等)和視頻流(H263,H264,MPEG4等),經(jīng)過(guò)編解碼器的處理和同步(AVSync)處理后轉換成原始數據(音頻通常是PCM,視頻通常是YUV或RGB格式)。隨后音視頻原始數據將被送入音頻和視頻的輸出環(huán)節(揚聲器或者顯示屏等硬件)。
2.4.3 多媒體播放接口
Android平臺提供android.media包來(lái)管理各種音頻和視頻的媒體接口,該包中的MediaPlayer(媒體播放器接口)用于控制音頻或視頻文件和流的回放。另外在android.widget包中還提供Video View(視頻視圖)組件用于播放視頻文件,以簡(jiǎn)化相對于使用Media Player播放視頻的繁瑣控制過(guò)程。
(1)MediaPlayer
對播放音頻而言,通過(guò)MediaPlayer.crea te(Context context,Uri uri)方法來(lái)獲取播放器實(shí)例,無(wú)需播放準備,直接通過(guò)MediaPlay er.start()方法來(lái)啟動(dòng)播放動(dòng)作。其中nowPlaying就是用戶(hù)當前選中的待播放文件。
//開(kāi)始播放
MediaPlayer mPlayer=MediaPlayer.create(context,nowPlaying);
mPlayer.start();
通過(guò)播放器實(shí)例mp調用MediaPlayer.pause()方法可以暫停當前播放行為,可以使用start()方法恢復播放。
首先調用MediaPlayer.stop()停止當前播放行為,再調用釋放與播放器相關(guān)資源的方法MediaPlayer.release()來(lái)完成停止播放動(dòng)作。
對于播放視頻來(lái)說(shuō),通過(guò)MediaPlayer(媒體播放器接口)的“setDataSource”方法可以指定視頻文件路徑。與播放音頻數據不同的是,視頻播放還要設置顯示視頻內容的承載體,使用MediaPlayer的“setDisplay”方法為當前播放器實(shí)例設置一個(gè)用于顯示視頻內容、代表屏幕描繪的控制器。這樣用于播放視頻的播放承載體必須實(shí)現Surface Holder(表面視圖處理接口)的視圖組件。
(2)Video View
首先視頻播放布局資源中必須定義2個(gè)組件:“VideoView>”標記定義視頻視圖組件,“MediaController>”標記定義視頻播放控制器組件。在A(yíng)citity組件對布局資源填充完成后,獲取布局資源中定義的視頻視圖和播放控制器組件實(shí)例(mVideo和mController),視頻視圖實(shí)例mVideo指定要播放的視頻文件路徑或URI,用于承載待顯示視頻內容,并為mVideo設置播放控制器用于控制該視頻文件的播放行為(如暫停、前進(jìn)、后退和進(jìn)度拖曳等),再調用VideoView.start()方法啟動(dòng)播放行為。停止播放行為可以調用VideoView.stopPlayback()來(lái)停止回放行為。
3 測試
本文設計的多媒體播放器是在A(yíng)ndroid SDK 2.3平臺下開(kāi)發(fā)完成的。該播放器以應用程序apk的形式分別集成到在A(yíng)ndroid 2.3模擬器和HTC A3380手機上,通過(guò)測試能夠實(shí)現音/視頻文件的本地播放功能,例如暫停、繼續、停止、進(jìn)度拖曳等。以音頻播放為例,測試效果如圖3所示。
4 結語(yǔ)
本文重點(diǎn)介紹基于A(yíng)ndroid平臺的多媒體播放器解決方案。側重分析UI(用戶(hù)界面)設計、音/視頻數據信息讀寫(xiě),及音/視頻播放等過(guò)程;并在A(yíng)ndroid SDK2.3平臺上進(jìn)行功能性測試,測試結果滿(mǎn)足預期,能夠正常播放本地多媒體文件。隨著(zhù)用戶(hù)對移動(dòng)終端的媒體播放功能的需求日益增加,提供支持更高分辨率的視頻播放,以及和網(wǎng)絡(luò )結合的流媒體方面的功能將是下一步的研究重點(diǎn)。
評論