首頁(yè)>>>技術(shù)>>>視像通信  視像通信產(chǎn)品

使用J2ME MMAPI開(kāi)發(fā)移動(dòng)多媒體應(yīng)用技術(shù)

2007/09/14

一、 引言

  在當(dāng)前世面上存在著大量的不同媒體格式,并且還有許多新的媒體格式即將被建立。為了存儲(chǔ)和傳輸這些不同的媒體格式,存在著了許多不同格式的存儲(chǔ)設(shè)備和傳輸協(xié)議,例如大家常使用的媒體存儲(chǔ)設(shè)備(如CD、VCD以及DVD),有線傳輸協(xié)議(如UDP、HTTP),無(wú)線傳輸協(xié)議(如WAP)。

  為了使移動(dòng)裝置能夠訪問(wèn)這些不同格式的媒體數(shù)據(jù),必需為其設(shè)計(jì)一個(gè)規(guī)范化的、強(qiáng)大的和可擴(kuò)充的應(yīng)用接口。J2ME中就提供了一套為規(guī)范的播放和錄制音頻或視頻接口,即Mobile Media API (MMAPI)。

二、MMAPI體系結(jié)構(gòu)

  一般情況下,可以將媒體處理過(guò)程分解為兩個(gè)過(guò)程:      1、 處理媒體數(shù)據(jù)的傳輸協(xié)議的過(guò)程

  處理傳輸協(xié)議的過(guò)程是指從數(shù)據(jù)源(如一個(gè)文件、一個(gè)捕獲裝置或一個(gè)流服務(wù))上讀取媒體數(shù)據(jù)內(nèi)容后,將其傳送到媒體數(shù)據(jù)內(nèi)容處理的過(guò)程。

  MMAPI使用Data Source來(lái)處理媒體數(shù)據(jù)的傳輸協(xié)議的過(guò)程。一個(gè)Data Source知道如何從它的原始位置讀取媒體數(shù)據(jù)并傳送給媒體數(shù)據(jù)處理(Player)。媒體數(shù)據(jù)可以被保存在不同的位置,從遠(yuǎn)程服務(wù)器到資源文件或者RMS數(shù)據(jù)庫(kù)。媒體數(shù)據(jù)可以從原始位置通過(guò)HTTP,像RTP一樣的流式傳輸協(xié)議,或者其他機(jī)制傳輸?shù)矫襟w數(shù)據(jù)處理(Player)。圖一展示了Data Source的工作過(guò)程。

  圖一:Data Source工作過(guò)程

  javax.microedition.media.protocol.DataSource提供了MMAPI的Data Source的支持。

  2、 處理媒體數(shù)據(jù)內(nèi)容的過(guò)程

  處理媒體數(shù)據(jù)內(nèi)容的過(guò)程通常需要對(duì)媒體數(shù)據(jù)進(jìn)行解釋和解碼,并且還需要認(rèn)別該媒體的輸出設(shè)置的類型,如是音頻設(shè)置或者視頻設(shè)置。舉個(gè)例子,當(dāng)DataSource從某媒體數(shù)據(jù)源上獲取一MP3媒體數(shù)據(jù),并將其傳送給處理媒體數(shù)據(jù)內(nèi)容過(guò)程,此過(guò)程首先對(duì)這個(gè)MP3媒體數(shù)據(jù)進(jìn)行解析和解碼,同時(shí)檢測(cè)該MP3媒體為音頻數(shù)據(jù),打開(kāi)裝置的音頻設(shè)備,將解析和解碼后的媒體數(shù)據(jù)直接傳送到裝置的音頻設(shè)備緩沖中,由該音頻設(shè)備根據(jù)緩沖區(qū)中的數(shù)據(jù)內(nèi)容產(chǎn)生音頻信號(hào)。

  MMAPI使用Player來(lái)處理媒體數(shù)據(jù)內(nèi)容。一個(gè)Player是javax.microedition.media.Player接口的一個(gè)實(shí)現(xiàn)實(shí)例,它從Data Source中讀取媒體數(shù)據(jù)、解析和解碼數(shù)據(jù)以及識(shí)別媒體輸出設(shè)備和傳送媒體數(shù)據(jù)到輸出設(shè)備等。Player提供了一套方法去控制媒體的重放和同步。

  MMAPI還提供了一個(gè)或多個(gè)Controls來(lái)調(diào)整player的行為,可以在player從媒體轉(zhuǎn)換數(shù)據(jù)的時(shí)候從一個(gè)player實(shí)例取得并且使用Controls。我們可以通過(guò)Player中提供的一些特殊的Controls訪問(wèn)一些特殊的媒體類型。Controls由javax.microedition.media.Control接口實(shí)現(xiàn)。

  3、 Manager

  J2ME為了實(shí)現(xiàn)對(duì)DataSource和Player有效管理,使用了工廠機(jī)制,由Manager來(lái)負(fù)責(zé)創(chuàng)建Player和DataSource。這樣的機(jī)制在JAVA中到處可見(jiàn),如JDBC中的DriverManager,這里我就不對(duì)這種機(jī)制進(jìn)行介紹了。Manager不僅可以從DataSource中創(chuàng)建Player,而且還可以從本地或InputStream中創(chuàng)建Player。圖二展示了MMAPI整體結(jié)構(gòu)圖。

  圖二:MMAPI整體結(jié)構(gòu)圖

三、 使用MMAPI

  MMAPI提供的類和接口都在javax.microedition.media中,在程序中使用MMAPI時(shí),首先應(yīng)該引用這些包,否則程序無(wú)法編譯。

  每個(gè)MMAPI程序都需要?jiǎng)?chuàng)建一個(gè)Player對(duì)象,前面我們已經(jīng)介紹過(guò),MMAPI使用Manager的CreatePlayer函數(shù)來(lái)創(chuàng)建Player對(duì)象,該函數(shù)有三個(gè)版本,其格式如下:   


  第一個(gè)版本實(shí)現(xiàn)通過(guò)URL字符串指定的協(xié)議和數(shù)據(jù)位置的信息創(chuàng)建一個(gè)Player對(duì)象,其中l(wèi)ocator的格式如下:

  Manager將對(duì)createPlayer函數(shù)中提供的URL字符串參數(shù)進(jìn)行分析,創(chuàng)建一個(gè)Data Source對(duì)象,由該對(duì)象完成對(duì)媒體數(shù)據(jù)的傳輸工作,并從數(shù)據(jù)中獲取該媒體的數(shù)據(jù)內(nèi)容類型,Manager將根據(jù)這個(gè)媒體數(shù)據(jù)類型創(chuàng)建相應(yīng)的Player對(duì)象,如果Manager無(wú)法確定DataSource的內(nèi)容類型,它將拋出一個(gè)MediaException異常。

  例:創(chuàng)建一個(gè)控制某網(wǎng)站MP3音頻的Player對(duì)象。

  Player pMP3 = Manager.createPlayer( "http://www.XXX.com/111.mp3");

  第二版本實(shí)現(xiàn)通過(guò)已知的DataSource對(duì)象創(chuàng)建Player對(duì)象。

  第三版本實(shí)現(xiàn)通過(guò)InputStream流創(chuàng)建Player對(duì)象。

  我們根據(jù)應(yīng)用實(shí)際的情況選擇使用那種版本來(lái)創(chuàng)建Player對(duì)象。有了一個(gè)Player對(duì)象以后,接下來(lái)要通過(guò)這個(gè)Player對(duì)象提供的方法去控制媒體流。下面我們列出常用的方法:      每個(gè)Player對(duì)象中都存在著一個(gè)狀態(tài)變量,用于表示該P(yáng)layer對(duì)象的生命周期。當(dāng)Player第一次被建立時(shí)處于UNREALIZED狀態(tài);當(dāng)為該P(yáng)layer設(shè)置了媒體數(shù)據(jù)的位置后,它處于REALIZED狀態(tài)(如Player正在從一個(gè)服務(wù)器的HTTP連接下載并解釋數(shù)據(jù)的時(shí)或Player在Http請(qǐng)求已經(jīng)發(fā)送到服務(wù)器,收到HTTP響應(yīng)后,而且DataSource準(zhǔn)備好接收媒體數(shù)據(jù)的時(shí));當(dāng)該P(yáng)layer已經(jīng)讀到足夠的數(shù)據(jù)而開(kāi)始解釋和運(yùn)算時(shí),處于PREFETCHED狀態(tài);當(dāng)數(shù)據(jù)在運(yùn)算完畢后,該P(yáng)layer的狀態(tài)變成了STARTED。我們?cè)谑褂肞layer對(duì)象的方法對(duì)媒體流進(jìn)行控制時(shí),應(yīng)注意它們可能影響到Player狀態(tài)的改變,可以使用getState函數(shù)獲取當(dāng)前Player的狀態(tài)。圖三展示了Player對(duì)象的狀態(tài)轉(zhuǎn)換圖。
  

  圖三:狀態(tài)轉(zhuǎn)換圖

四、 播放常見(jiàn)媒體的方法

  1.播放單音與序列音

  如果要播放一個(gè)單音一次,可使用:

  Manager.playTone(note,duration,volume);

  如果要播放序列音,則必須使用ToneControl。使用一個(gè)特別的定位器來(lái)創(chuàng)建一個(gè) Player對(duì)象,獲得ToneControl,設(shè)置其命令序列,然后啟動(dòng)播放器,如:


  2.播放聲訊和MIDI

  聲訊是指如WAV這樣的聲音格式,在這種格式中,數(shù)據(jù)是各種聲訊樣本的一個(gè)流,它代表著該聲訊每一秒鐘的片斷。MIDI則是一系列的命令,用作多樂(lè)器的某種"虛擬合成器"。

  如要播放一段能夠通過(guò)HTTP訪問(wèn)的聲音文件,請(qǐng)使用:

  Player p = Manager.createPlayer("http://something.com/somefile.wav");

  p.start();

  如要播放一段已經(jīng)被置于MIDlet的JAR文件中的聲音文件,需要先了解其MIME類型(如,"audio/x-wav"),然后,使用:


  3.播放視頻

  播放視頻類似于音頻播放。然而,需要告訴視頻播放器在哪里顯示視頻信號(hào),因此,需要從視頻播放器處得到一個(gè)"視頻控件",然后在Form或Canvas中顯示視頻內(nèi)容。下面展示一個(gè)從Canvas中顯示視頻的例子:
 

賽迪網(wǎng) 中國(guó)信息化(industry.ccidnet.com)



相關(guān)鏈接:
移動(dòng)應(yīng)用領(lǐng)域等待挖掘的金礦 2007-09-13
電信增值產(chǎn)業(yè)升級(jí)在即 2007-09-12
手機(jī)廣告:即將被開(kāi)掘的金礦 2007-09-11
Tom退市是否會(huì)引起SP退市連鎖反應(yīng) 2007-09-11
飛信“飛”往何處? 2007-09-10

分類信息:  移動(dòng)增值_與_移動(dòng)     熱點(diǎn)專題_移動(dòng)增值_文摘   行業(yè)_移動(dòng)_文摘