如果想要使用Java中的Swing播放音樂,視頻,包括錄音,截取錄影等等,就要用到Java的媒體架構JMF。
Java媒體架構(JMF)使你能夠編寫出功能強大的多媒體程式,卻不用關心底層複雜的實現細節。JMF API的使用相對比較簡單,但是能夠滿足幾乎所有多媒體編程的需求。在這篇文章中,我將向你介紹如何用很少的代碼就編寫出多媒體程式。
Java多媒體架構(JMF)中包含了許多用於處理多媒體的API。它是一個相當複雜的系統,完全瞭解這個系統可能需要花上幾周的時間,但是這篇文章將主要介紹JMF的幾個核心介面和類,然後通過一個簡單的例子向你展示如何利用該介面進行編程。
JMF目前的最新版本是2.1,Sun通過它向Java中引入處理多媒體的能力。下面是JMF所支援的功能的一個概述:
● 可以在Java Applet和應用程式中播放各種媒體檔案,例如AU、AVI、MIDI、MPEG、QuickTime和WAV等檔案。
● 可以播放從互連網上下載的媒體流。
● 可以利用麥克風和攝像機一類的裝置截取音頻和視頻,並儲存成多媒體檔案。
● 處理多媒體檔案,轉換檔格式。
● 向互連網上傳音頻和視頻資料流。
● 在互連網上廣播音頻和視頻資料。
JMF的結構
為 了更好地說明JMF的結構,讓我們用立體聲音響做一個簡單的比喻。當你CD機播放CD唱片的時候,CD唱片向系統提供音樂訊號。這些資料是在錄音棚中用麥 克風和其他類似的裝置記錄下來的。CD播放機將音樂訊號傳送到系統的音箱上。在這個例子中,麥克風就是一個音頻截取裝置,CD唱片是資料來源,而音箱是輸出 裝置。
JMF的結構和立體聲音響系統非常相似,在後面的文章中,你會遇到下面的這些術語:
● 資料來源(Data source)
● 截取裝置(Capture Device,包括視頻和音頻截取裝置)
● 播放器(Player)
● 處理器(Processor)
● 資料格式(Format)
● 管理器(Manager)
下面讓我們來看一看這些術語到底代表什麼意思。
1.資料來源
就 像CD中儲存了歌曲一樣,資料來源中包含了媒體資料流。在JMF中,DataSource對象就是資料來源,它可以是一個多媒體檔案,也可以是從互連網上下載 的資料流。對於DataSource對象,一旦你確定了它的位置和類型,對象中就包含了多媒體的位置資訊和能夠播放該多媒體的軟體資訊。當建立了 DataSource對象後,可以將它送入Player對象中,而Player對象不需要關心DataSource中的多媒體是如何獲得的,以及格式是什 麼。
在某些情況下,你需要將多個資料來源合并成一個資料來源。例如當你在製作一段錄影時,你需要將音頻資料來源和視頻資料來源合并在一起。JMF支援資料來源合并,在後面的例子中我們將提到這一點。
2.截取裝置
截取裝置指的是可以截取到音頻或視頻資料的硬體,如麥克風、攝像機等。截取到的資料可以被送入Player對象中進行處理。
3.播放器
在 JMF中對應播放器的介面是Player。Player對象將音頻/視頻資料流作為輸入,然後將資料流輸出到音箱或螢幕上,就像CD播放機讀取CD唱片中 的歌曲,然後將訊號送到音箱上一樣。Player對象有多種狀態,JMF中定義了JMF的六種狀態,在正常情況下Player對象需要經曆每個狀態,然後 才能播放多媒體。下面是對這些狀態的說明。
● Unrealized:在這種狀態下,Player對象已經被執行個體化,但是並不知道它需要播放的多媒體的任何資訊。
● Realizing:當調用realize()方法時,Player對象的狀態從Unrealized轉變為Realizing。在這種狀態下,Player對象正在確定它需要佔用哪些資源。
● Realized:在這種狀態下Player對象已經確定了它需要哪些資源,並且也知道需要播放的多媒體的類型。
● Prefetching:當調用prefectch()方法時,Player對象的狀態從Realized變為Prefetching。在該狀態下的 Player對象正在為播放多媒體做一些準備工作,其中包括載入多媒體資料,獲得需要獨佔的資源等。這個過程被稱為預取(Prefetch)。
● Prefetched:當Player對象完成了預取操作後就到達了該狀態。
● Started:當調用start()方法後,Player對象就進入了該狀態並播放多媒體。
4.處理器
處 理器對應的介面是Processor,它一種播放器。在JMF API中,Processor介面繼承了Player介面。 Processor對象除了支援支援Player對象支援的所有功能,還可以控制對於輸入的多媒體資料流進行何種處理以及通過資料來源向其他的Player 對象或Processor對象輸出資料。
除了在播放器中提到了六種狀態外,Processor 對象還包括兩種新的狀態,這兩種狀態是在Unrealized狀態之後,但是在Realizing狀態之前。
● Configuring:當調用configure()方法後,Processor對象進入該狀態。在該狀態下,Processor對象串連到資料來源並擷取輸入資料的格式資訊。
● Configured:當完成資料來源串連,獲得輸入資料格式的資訊後,Processor對象就處於Configured狀態。
5.資料格式
Format 對象中儲存了多媒體的格式資訊。該對象中本身沒有記錄多媒體編碼的相關資訊,但是它儲存了編碼的名稱。Format的子類包括AudioFormat和 VideoFormat類,ViedeoFomat又有六個子類:H261Format、H263Format、IndexedColorFormat、 JPEGFormat、RGBFormat和YUVFormat類。
6.管理器
JMF提供了下面四種管理器:
● Manager:Manager相當於兩個類之間的介面。例如當你需要播放一個DataSource對象,你可以通過使用Manager對象建立一個 Player對象來播放它。使用Manager對象可以建立Player、Processor、DataSource和DataSink對象。
● PackageManager:該管理器中儲存了JMF類註冊資訊。
● CaptureDeviceManager:該管理器中儲存了截取裝置的註冊資訊。
● PlugInManager:該管理器中儲存了JMF外掛程式的註冊資訊。
建立一個Player對象
在 JMF編程中,最常見的工作就是建立一個Player對象。你可以通過Manager類的createPlayer()方法建立Player對象。 Manager對象使用多媒體的URL或MediaLocator對象來建立Player對象。當你獲得了一個Player對象後,你可以通過調用 getVisualComponent()方法得到Player對象的映像組件(Visual Component,在映像組件上可以播放多媒體的映像)。然後將映像組件加入到應用程式或Applet的介面上。Player對象還包含一個控制台,
在上面可以控制媒體的播放、停止和暫停等。
Player類中的很多方法只有在Player對象處於Realized的狀態下才會被調用。 為了保證Player對象已經到達了該狀態,你需要使用Manager的createRealizePlayer()方法來獲得Player對象。但是對 於start()方法來說,你可以在Player對象到達Prefetched狀態之前調用它,它可以自動將Player的狀態轉換到Started狀 態。
截取多媒體資料
多媒體資料的截取是JMF程式中另一個非常重要的功能。你可以按照下面的步驟截取資料:
● 通過查詢CaptureDevieceManager獲得你希望使用的截取裝置。
● 獲得裝置對應的CaptureDeviceInfo對象。
● 從CaptureDeviecInfo對象中獲得MediaLocator對象,然後用它建立一個DataSource對象。
● 使用DataSource對象建立Player對象或Processor對象。
● 調用start()方法,開始截取多媒體資料。
你 可以使用CaptureDeviceManager對象獲得系統中可用的視頻和音頻截取裝置。通過調用getDeviceList()方法你可以獲得裝置 的列表。每個裝置都對應一個CaptrueDeviceInfo對象。也可以通過調用CaptureDevieceManager對象的 getDevice()方法來獲得特定的CaptureDeviceInfo對象。在使用裝置截取多媒體資料前,還需要從 CaptureDeviceInfo對象中獲得裝置對應的MediaLocator對象。然後你可以直接使用MediaLocator來構造Player
或Processor的執行個體,也可以用MediaLocator構造一個DataSource對象,然後將DataSource對象送入Player或 Processor對象中。最後調用start()方法來截取多媒體資料。
Win下安裝JMF2.1
當你使用JMF進行編程以前,你需要安裝JMF。同時在硬體 上也有一些要求。由於本文的代碼是在Windows 2000下編寫和測試,因此文章中提到的作業系統需要的軟體都是與Windows有關的。雖然Java是跨平台的,但是JMF是個例外——並不是所有的平 台上都實現了JMF。
硬體和軟體要求
硬體方面你需要與SoundBlaster相容的音效卡,晶片最好使用奔騰III以上的晶片。記憶體最好不小於64MB。同時你需要安裝下面的軟體:
● Win7,Windows NT 4.0, Windows2000或 WindowsXP。
● JDK1.1.6或以上的Windows版本。
● JMF類和動態庫
在Windows下安裝JMF2.1
當 下載了JMF2.1以後,運行jmf-2_1_1b-windows-i586.exe。該程式會將JMF2.1安裝到你指定的目錄下。當安裝成功後,你 需要確認一下安裝程式正確設定了CLASSPATH和PATH環境變數。在CLASSPATH中需要包含jmf.jar和sound.jar;在PATH 中需要包含JMF動態庫的路徑。
JMFRegistry
如 果你希望使用視頻和音頻截取的裝置,你需要確認安裝了這些裝置的驅動程式。除此之外,你還需要運行JMFRegistry應用程式。 JMFRegistry可以向JMF註冊新的資料來源、媒體處理器、外掛程式、視頻和音頻截取裝置,然後你才能夠在你的程式中使用它們。你只需要運行一次 JMFRegistry就能註冊系統中所有的視頻和音頻截取裝置。
當你運行了JMFRegistry後,會彈出圖一所示的視窗:
圖一 通過JMFRegistry註冊視頻和音頻截取裝置(未安裝視頻)
選 擇“Capture Devices”標籤,然後按下“Detect Capture Devices”按鈕,程式將自動檢測出系統中的視頻和音頻截取裝置。在左邊的類表框中會列出所有檢測到的裝置的名稱。在圖一中我們看到 JMFRegsitery發現了JavaSound audio capture、vfw:Logitech USB Video Camera:0和vfw:Microsoft WDM Image Capture (Win32):1。單擊某個裝置可以看到該裝置支援的視頻或音頻格式。如果JMFRegistry無法檢測到裝置,有可能是沒有正常安裝裝置的驅動程式。