Mobile Media API (MMAPI)為多媒體開發提供了一個強大,可擴充以及簡單的介面。它有一套規範的播放和錄製audio或video的介面。這篇文章是MMAPI概念的一個概觀以及其類和介面使用的一個快速教程。
Mobile Media API的體系結構
MMAPI基於四個基本概念:
1。一個player知道如何去解釋媒體資料。舉個例子,某種類型的player知道如何根據mp3媒體資料產生聲音。另外一個player知道如何播放一端QuickTime的movie。javax.microedition.media.Player介面的實現(implement)既是這裏說的player。
2。你能用一個或多個controls來調整player的行為。你可以在player從媒體轉換資料的時候從一個player實例取得並且使用controls。比如,你能用一個VolumeControl來調節一個採樣音頻的聲音大小。Controls是javax.microedition.media.Control介面的實現。詳細的Control子介面在javax.microedition.media.control包中
3。一個data source知道如何從它的原始位置讀取到媒體資料給player。媒體資料可以被保存在不同的位置,從遠端伺服器到資源檔案或者RMS資料庫。媒體資料可以從原始位置通過HTTP,像RTP一樣的流式傳輸協議,或者其他機制傳輸到player。 javax.microedition.media.protocol.DataSource是MMAPI中所有data source類的抽象父類。
4。最後,manager把每一個部件捆綁起來,並且為API提供了切入點。javax.microedition.media.Manager 類包含了得到Player或DataSource的靜態方法。
使用MMAPI
你能使用Manager做到的最簡單的事情是用下面的方法播放一段樂音(tone):
public static void playTone(int note,
int duration, int volume) throws MediaException
播放時間按毫秒定義好,音量範圍則從0(無聲)到100(最大聲)。音符用一個數位定義,像MIDI一樣,60代表中音C調,69則是一個440赫茲的A調。音符的範圍可以從0到127。playTone()方法適合播放一個單一的音調或是很短的模進音。更長的單聲道模進音,你可以用默認的樂音播放器,它可以播放一全部模進樂音。
MMAPI最迷人的的地方體現在Manager的createPlayer方法上,該方法有如下三個不同的版本:
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
得到一個Player最簡單的方法是使用第一個createPlayer方法,僅僅傳遞一個代表媒體資料的字串就可以了。
舉個例子,你可以指定一個網站上的音頻檔:
Player p = Manager.createPlayer("http://webserver/music.mp3"); 其他createPlayer方法允許你從一個DataSource或一個InputStream流創建Player。如果你考慮使用Player,這三個方法是真正的三種不同的方式取得media資料。一個InputStream是個最簡單的物件,僅僅是一個位元組流。而DataSource就更高級了點,是一個選擇協定去訪問媒體資料的物件。傳遞一個位置字串是個最好的捷徑:MMAPI會搞清楚用何種協議並為player取得媒體資料。
如何使用Player
一旦你成功建立了一個Player物件,下一步該做些什麼呢?最簡單的行動就是開始用start方法重放。然而,只是為了學到比入門更深層次的東西,這有利於幫助理解一個Player的生命週期。這個週期由四個狀態組成。
當一個Player第一次被建立,它的狀態是UNREALIZED。在為這個Player設置了媒體資料的位置以後,它的狀態是REALIZED。
如果Player正在從一個伺服器的HTTP連接下載並解釋資料的時候,比如Player在Http請求已經發送到伺服器,收到HTTP回應後,而且DataSource準備好接收audio資料的時候。下一個狀態是PREFETCHED,獲得該狀態的時機是該player已經讀到足夠的資料而開始解釋和運算了。最後,當資料在運算完畢後,Player的狀態變成了STARTED.
Player介面提供了狀態轉換的方法,在狀態迴圈中,無論前進還是後退都有描述。其原因是為了提供給應用程式一個可操作控制。控制可能會佔用一段時間。舉個例子,你可能要將Player的REALIZED狀態推到PREFETCHED狀態,為了一段聲音可以馬上播放,以回應用戶的操作。
在java Platform的MMAPI
MMAPI在在java 2 platform中適用於什麼樣的情況呢?答案是幾乎任何地方。儘管當初MMAPI的設計僅僅是基於CLDC,但它可以在 CLDC和CDC軟體上都可以運行得很好。事實上,MMAPI可以作為輕量選擇用j2se實現到java media Framework。
可以支援那些類型的Media檔?
如果你的裝置支援MMAPI的話,那麼這個裝置可以播放什麼類型的媒體資料呢?支援什麼資料傳輸協定?MMAPI並不要求任何指定的content type或協議,但你能在運行時找出程式支援什麼類型的資料,通過調用Manager類的getSupportedContentTypes()方法和getSupportedProtocols()方法。可能發生的最糟糕的事情是什麼呢?如果你通過Manager給Player一種不支援的資料類型或協定,它會拋出個exception。 你的程式應該試圖去從這樣的例外中恢復過來,可以顯示些禮貌的資訊提示給用戶。
MIDP 2.0的媒體
MIDP 2.0規範包括了一個MMAPI的子集。它向上相容所有API。MIDP 2.0子集有如下特性:
1。只支援音頻重播(錄製)。不包含video控制介面。
2。多Player不能被同步
3。DataSource類和javax.microedition.media.protocol包的其他類沒有被包括進來;應用程式不能實現他們自己的協議。
4。Manager類是被簡化的。
MIDP要求支持樂音產生和採樣,WAV音頻播放。
總結
MMAPI為從java應用在移動設備行運行使用多媒體提供了一套簡潔的,可擴充的和規範的API。
(出處:http://www.vipcn.com)