在MIDP1.0(JSR 37)并沒有提供對聲音和視頻處理的支持,因此有些廠商就獨立開發(fā)了API來彌補這樣的不足。在MIDP2.0中(JSR 118)中提供了對多媒體處理的支持,但是它只是Mobile Media API(JSR 135)的一個子集。本文將主要對MMAPI做整體介紹。
首先我們關(guān)注一下MMAPI的特性。
通常在多媒體的處理過程中有兩個重要的環(huán)節(jié),一是處理數(shù)據(jù)傳輸?shù)膮f(xié)議另一個是處理媒體的數(shù)據(jù)類型。在MMAPI中提供了DataSource和Player來完成這兩步重要的內(nèi)容。DataSource對數(shù)據(jù)傳輸協(xié)議進行封裝不管它是從哪里過來的,可以是流、文件或者服務(wù)器資源等等。Player則負(fù)責(zé)解碼工作,并傳輸給外設(shè)比如顯示屏和揚聲器,MMAPI的入口點是Manager類,通過它我們可以得到Player的實例。請看下圖
通過如下方法我們可以得到一個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
當(dāng)創(chuàng)建一個Player的時候,它處于UNREALIZED的狀態(tài),當(dāng)Player已經(jīng)定位了它目標(biāo)數(shù)據(jù)后就進入了REALIZED狀態(tài),接下來Player對數(shù)據(jù)進行緩沖這樣可以確保播放的流暢,這個狀態(tài)叫做PREFETCHED。當(dāng)Player開始播放數(shù)據(jù)的時候是STARTED狀態(tài)。Player對數(shù)據(jù)流提供了基本的控制,通過如下方法可以實現(xiàn)
Player.realize()
Player.prefetch()
Player.start()
Player.setMediaTime(long time)
同時Player也允許對數(shù)據(jù)流進行詳盡的控制,并且針對不同的類型提供不同的控制,通過如下方法我們可以獲得Control
Control[] Player.getControls()
Control Player.getControl(String controlType)
MMAPI提供了一些系統(tǒng)屬性供查詢,我們可以使用方法System.getProperty(String key)得到屬性值。關(guān)于這些屬性值得說明請參考MMAPI DOC。
supports.mixing
supports.audio.capture
supports.video.capture
supports.recording
audio.encodings
video.encodings
video.snapshot.encodings
通常我們想知道我們的機器是否支持某些特定的數(shù)據(jù)類型和傳輸協(xié)議,但是由于MMAPI規(guī)范中并沒有規(guī)定這些,因此我們只能在運行時得到這些數(shù)據(jù),可以調(diào)用Manager的getSupportedContentTypes() 和getSupportedProtocols()。如果Player播放不能解釋的數(shù)據(jù)或者處理不支持的協(xié)議的時候會拋出異常。
總結(jié):MMAPI的設(shè)計相當(dāng)靈活,在使用MMAPI之前,理解他的結(jié)構(gòu)和規(guī)范是非常重要的。在后續(xù)的文章中我們將講述如何使用MMAPI并提供具體的實例。
(出處:http://www.56wlw.com)
新聞熱點
疑難解答