一、引言
在當前世面上存在著大量的不同媒體格式,並且還有許多新的媒體格式即將被建立。為了存儲和傳輸這些不同的媒體格式,存在著了許多不同格式的存儲設備和傳輸協議,例如大家常使用的媒體存儲設備(如CD、VCD以及DVD),有線傳輸協議(如UDP、HTTP),無線傳輸協議(如WAP)。
為了使移動裝置能夠訪問這些不同格式的媒體數據,必須為其設計一個規范化的、強大的和可擴充的應用接口。J2ME中就提供了一套為規范的播放和錄制音頻或視頻接口,即Mobile Media API (MMAPI)。
二、MMAPI體系結構
一般情況下,可以將媒體處理過程分解為兩個過程:
◆處理媒體數據的傳輸協議的過程。
◆處理媒體數據內容的過程。
1、處理媒體數據的傳輸協議的過程
處理傳輸協議的過程是指從數據源(如一個文件、一個捕獲裝置或一個流服務)上讀取媒體數據內容後,將其傳送到媒體數據內容處理的過程。
MMAPI使用Data Source來處理媒體數據的傳輸協議的過程。一個Data Source知道如何從它的原始位置讀取媒體數據並傳送給媒體數據處理(Player)。媒體數據可以被保存在不同的位置,從遠程服務器到資源文件或者RMS數據庫。媒體數據可以從原始位置通過HTTP,像RTP一樣的流式傳輸協議,或者其他機制傳輸到媒體數據處理(Player)。圖一展示了Data Source的工作過程。
圖1:Data Source工作過程Javax.microedition.media.protocol.DataSource提供了MMAPI的Data Source的支持。
2、處理媒體數據內容的過程
處理媒體數據內容的過程通常需要對媒體數據進行解釋和解碼,並且還需要認別該媒體的輸出設置的類型,如是音頻設置或者視頻設置。舉個例子,當DataSource從某媒體數據源上獲取一MP3媒體數據,並將其傳送給處理媒體數據內容過程,此過程首先對這個MP3媒體數據進行解析和解碼,同時檢測該MP3媒體為音頻數據,打開裝置的音頻設備,將解析和解碼後的媒體數據直接傳送到裝置的音頻設備緩沖中,由該音頻設備根據緩沖區中的數據內容產生音頻信號。
MMAPI使用Player來處理媒體數據內容。一個Player是Javax.microedition.media.Player接口的一個實現實例,它從Data Source中讀取媒體數據、解析和解碼數據以及識別媒體輸出設備和傳送媒體數據到輸出設備等。Player提供了一套方法去控制媒體的重放和同步。
MMAPI還提供了一個或多個Controls來調整player的行為,可以在player從媒體轉換數據的時候從一個player實例取得並且使用Controls。我們可以通過Player中提供的一些特殊的Controls訪問一些特殊的媒體類型。Controls由Javax.microedition.media.Control接口實現。
3、Manager
J2ME為了實現對DataSource和Player有效管理,使用了工廠機制,由Manager來負責創建Player和DataSource。這樣的機制在Java中到處可見,如JDBC中的DriverManager,這裡我就不對這種機制進行介紹了。Manager不僅可以從DataSource中創建Player,而且還可以從本地或InputStream中創建Player。圖二展示了MMAPI整體結構圖。
圖2:MMAPI整體結構圖三、使用MMAPI
MMAPI提供的類和接口都在Javax.microedition.media中,在程序中使用MMAPI時,首先應該引用這些包,否則程序無法編譯。
每個MMAPI程序都需要創建一個Player對象,前面我們已經介紹過,MMAPI使用Manager的CreatePlayer函數來創建Player對象,該函數有三個版本,其格式如下:
public static Player createPlayer(String locator) throws IOException, MediaException public static Player createPlayer(DataSource source) throws IOException, MediaException public static Player createPlayer(InputStream stream, String type) throws IOException, MediaException
第一個版本實現通過URL字符串指定的協議和數據位置的信息創建一個Player對象,其中locator的格式如下:
Manager將對createPlayer函數中提供的URL字符串參數進行分析,創建一個Data Source對象,由該對象完成對媒體數據的傳輸工作,並從數據中獲取該媒體的數據內容類型,Manager將根據這個媒體數據類型創建相應的Player對象,如果Manager無法確定DataSource的內容類型,它將拋出一個MediaException異常。
例:創建一個控制某網站MP3音頻的Player對象。
Player pMP3 = Manager.createPlayer( "http://www.XXX.com/111.mp3");
第二版本實現通過已知的DataSource對象創建Player對象。
第三版本實現通過InputStream流創建Player對象。