熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

使用J2ME MMAPI開發移動多媒體應用技術

2013-11-23 18:58:50  來源: Java核心技術 

  一引言

  在當前世面上存在著大量的不同媒體格式並且還有許多新的媒體格式即將被建立

  為了存儲和傳輸這些不同的媒體格式存在著了許多不同格式的存儲設備和傳輸協議例如大家常使用的媒體存儲設備(如CDVCD以及DVD)有線傳輸協議(如UDPHTTP)無線傳輸協議(如WAP)

  為了使移動裝置能夠訪問這些不同格式的媒體數據必須為其設計一個規范化的強大的和可擴充的應用接口JME中就提供了一套為規范的播放和錄制音頻或視頻接口即Mobile Media API (MMAPI)

  二MMAPI體系結構

  一般情況下可以將媒體處理過程分解為兩個過程

  ◆處理媒體數據的傳輸協議的過程

  ◆處理媒體數據內容的過程

  處理媒體數據的傳輸協議的過程

  處理傳輸協議的過程是指從數據源(如一個文件一個捕獲裝置或一個流服務)上讀取媒體數據內容後將其傳送到媒體數據內容處理的過程

  MMAPI使用Data Source來處理媒體數據的傳輸協議的過程一個Data Source知道如何從它的原始位置讀取媒體數據並傳送給媒體數據處理(Player)媒體數據可以被保存在不同的位置從遠程服務器到資源文件或者RMS數據庫媒體數據可以從原始位置通過HTTP像RTP一樣的流式傳輸協議或者其他機制傳輸到媒體數據處理(Player)圖一展示了Data Source的工作過程

  

  使用J2ME MMAPI開發移動多媒體應用技術(圖一)

  圖Data Source工作過程

  jadiaprotocolDataSource提供了MMAPI的Data Source的支持

  處理媒體數據內容的過程

  處理媒體數據內容的過程通常需要對媒體數據進行解釋和解碼並且還需要認別該媒體的輸出設置的類型如是音頻設置或者視頻設置舉個例子當DataSource從某媒體數據源上獲取一MP媒體數據並將其傳送給處理媒體數據內容過程此過程首先對這個MP媒體數據進行解析和解碼同時檢測該MP媒體為音頻數據打開裝置的音頻設備將解析和解碼後的媒體數據直接傳送到裝置的音頻設備緩沖中由該音頻設備根據緩沖區中的數據內容產生音頻信號

  MMAPI使用Player來處理媒體數據內容一個Player是jadiaPlayer接口的一個實現實例它從Data Source中讀取媒體數據解析和解碼數據以及識別媒體輸出設備和傳送媒體數據到輸出設備等Player提供了一套方法去控制媒體的重放和同步

  MMAPI還提供了一個或多個Controls來調整player的行為可以在player從媒體轉換數據的時候從一個player實例取得並且使用Controls我們可以通過Player中提供的一些特殊的Controls訪問一些特殊的媒體類型Controls由jadiaControl接口實現

  Manager

  JME為了實現對DataSource和Player有效管理使用了工廠機制由Manager來負責創建Player和DataSource這樣的機制在JAVA中到處可見如JDBC中的DriverManager這裡我就不對這種機制進行介紹了Manager不僅可以從DataSource中創建Player而且還可以從本地或InputStream中創建Player圖二展示了MMAPI整體結構圖

  

  使用J2ME MMAPI開發移動多媒體應用技術(圖二)

  圖MMAPI整體結構圖

  三使用MMAPI

  MMAPI提供的類和接口都在jadia中在程序中使用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異常

  例創建一個控制某網站MP音頻的Player對象

  Player pMP = ManagercreatePlayer(

  第二版本實現通過已知的DataSource對象創建Player對象

  第三版本實現通過InputStream流創建Player對象

  我們根據應用實際的情況選擇使用那種版本來創建Player對象有了一個Player對象以後接下來要通過這個Player對象提供的方法去控制媒體流下面我們列出常用的方法

  ◆Playerstart()重放媒體流

  ◆Playerstop()停止媒體流

  ◆PlayersetMediaTime(long now)設置媒體時間

  ◆Playerclose()關閉媒體流並釋放資源

  ◆PlayergetState()獲取Player的當前狀態

  每個Player對象中都存在著一個狀態變量用於表示該Player對象的生命周期當Player第一次被建立時處於UNREALIZED狀態當為該Player設置了媒體數據的位置後它處於REALIZED狀態(如Player正在從一個服務器的HTTP連接下載並解釋數據的時或Player在Http請求已經發送到服務器收到HTTP響應後而且DataSource准備好接收媒體數據的時)當該Player已經讀到足夠的數據而開始解釋和運算時處於PREFETCHED狀態當數據在運算完畢後該Player的狀態變成了STARTED我們在使用Player對象的方法對媒體流進行控制時應注意它們可能影響到Player狀態的改變可以使用getState函數獲取當前Player的狀態圖三展示了Player對象的狀態轉換圖

  

  使用J2ME MMAPI開發移動多媒體應用技術(圖三)

  圖狀態轉換圖

  四播放常見媒體的方法

  播放單音與序列音

  如果要播放一個單音一次可使用

  ManagerplayTone(notedurationvolume)

  如果要播放序列音則必須使用ToneControl使用一個特別的定位器來創建一個Player對象獲得ToneControl設置其命令序列然後啟動播放器

  

  

  Player p = ManagercreatePlayer(MangerTONE_DEVICE_LOCATOR);
prealize();
ToneControl tc = (ToneControl)(playergetControl(ToneControl));
tcsetSequence(new byte[] {ToneControlC
ToneControlC+});
pstart();

  播放聲訊和MIDI

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

  如要播放一段能夠通過HTTP訪問的聲音文件請使用

  Player p = ManagercreatePlayer(

  pstart()

  如要播放一段已經被置於MIDlet的JAR文件中的聲音文件需要先了解其MIME類型(如audio/xwav然後使用

  InputStream is = getClass()getResourceAsStream(/somefilewav

  Player p = ManagercreatePlayer(isaudio/xwav

  pstart()

  如要播放一段置於RMS中的聲音文件請使用

  

  

  RecordStore rs = RecordStoreopen(name); byte[] data = rsgetRecord(id); ByteArrayInputStream is = new ByteArrayInputStream(data); Player p = ManagercreatePlayer(isaudio/xwav); pstart(); 

  播放視頻

  播放視頻類似於音頻播放然而需要告訴視頻播放器在哪裡顯示視頻信號因此需要從視頻播放器處得到一個視頻控件然後在Form或Canvas中顯示視頻內容下面展示一個從Canvas中顯示視頻的例子

  

  

  InputStream is = getClass()getResourceAsStream(/somefileavi);
Player p = ManagercreatePlayer(isvideo/avi);
prealize();
VideoControl vc = (VideoControl)pgetControl(VideoControl);
if( vc != null )
{
vcinitDisplayMode(VideoControlUSE_DIRECT_VIDEOcav); //cav為Canvas對象
vcsetVisible(true);
pstart();
}


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26084.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.