JMF(Java Media Framework)是Sun 公司提出的Java 媒體架構。它是對應Java 2平台標准版(J2SE)的一種可選用的應用編程接口(API)。JMF的源代碼通過SCSL(Sun 社團源代碼許可模式)發布這一強大的媒體工具包,可以在任何版本(1.1.x 及以上版本)的Java平台上的運行。
JMF2.1.1技術提供了先進的媒體處理能力,從而擴展了Java 平台的功能。JMF所提供的多媒體功能如下:
l可以在Java Applet 和應用程序中播放各種媒體文件。它提供了對各種主要媒體形式和編碼的支持,如JPEG、H.263、MP3、Macromedias Flash。JMF 2.1.1 還支持多種媒體類型如Quicktime、MOV、Microsoft AVI和MPEG-1。
l在互聯網上傳輸音頻和視頻數據流。
l可以利用攝像機一類的設備截取音頻和視頻並保存為多媒體文件。
l處理多媒體文件轉換文件格式。
l在互聯網上廣播音頻和視頻數據。
1.JMF基本構架
JMF的兩層架構:
(1) 相對上層的負責多媒體文件的控制,使用和處理,並支持網絡資源和識別采集設備等額外控制功能;
(2) 相對下層不僅提供編解碼器,渲染器,還提供plug-in架構來直接存取多媒體文件使JMF能更輕易的被延伸和定制;
JMF的架構圖:
圖1 JMF架構圖
2.JMF的運作模式
圖2根據VCR的運作模式來對比JMF運作過程,我們可以發現JMF與真實世界中的VCR運作模式相似。整個過程如同是VCR提供了一個熟悉的構造模型來錄影(音)、處理、以及呈現基於時間的媒體(time-based media)。當你使用VCR播放一個電影時,你是以錄影帶的方式提供VCR一個媒體流(media stream)。VCR將之讀入並分析、解譯錄影帶上的資料,並把適當的訊號送到用戶的電視和音響。JMF也是使用這個同樣的模型架構。一個數據源(data source)會將媒體流(media stream)封裝起來,就有如錄影帶一般。而一個播放器(player)會提供處理以及控制,類似VCR所提供的控制機制。使用JMF播放、和捕捉影音則需要適當的輸入輸出裝置如麥克風、照相機、音響、以及屏幕等等。
圖2 VCR運作模式
3.JMF上層結構
3.1時間模型(time model)
JMF 對媒體時間信息的獲取如下
lTimeBase Time:系統當前時鐘。
lMediaTime:一個媒體流的整個播放時間。
lMediaStartTime:媒體開始播放的時間。
lTimeBaseStartTime:當開始播放的時候TimeBase的時間。
lRate:時鐘和TimeBase的關系,可以是1倍2倍或負值(重放playback的時候)。
這樣我們得到的播放位置的公式為:
MediaTime = MediaStartTime + Rate (TimeBaseTime - TimeBaseStartTime)
3.2管理器(managers)
JMF API主要由一些接口組成,這些接口定義了用於捕獲(capture)、處理(process)和播放(present)基於時間的媒體的對象的行為和相互作用的過程。為了能和已經存在的類實現無縫連接,JMF引入了一些中介對象—管理器(Manager)。JMF中使用了四種Manager:
lManager:管理器(Manager)負責處理播放器(Player)、處理器(Processor)、數據源(DataSource)、數據池(DataSink)的創建。
lPackageManager:保存用戶創建的播放器(Player),處理器(Processor),數據源(DataSource),數據池(DataSink)類的注冊信息。
lCaptureDeviceManager:對可用的媒體捕獲設備進行注冊。
lPlugInManager:保持底層的JMF插件(如復用器(Multiplexers),分離器(DemultiPlexers),編解碼器(Codecs), 渲染器(Effects)和顯示器(Render)的注冊信息。
3.3事件模型(event model)
JMF是利用一個結構化的事件報告機制來使基於JMF的程序獲知媒體系統當前的狀態,並使它能對媒體驅動的錯誤狀態,比如未知源錯誤狀態(Resource Unavailable)進行響應。在任何時候,當一個JMF 對象需要報告當前的狀態, 它將發出一個MediaEvent事件。
對於任何一個能發送MediaEvent的JMF對象而言,JMF都定義了一個相應的偵聽接口(listener interface)。為了能在某一MediaEvent事件發生時得到相應的通知,必須實現適當的偵聽接口以及在對應的類體中注冊該接口中處理MediaEvent事件的方法體,並通過調用addListener方法來接收此MediaEvent事件。
JMF中的Controller objects,例如播放器(Player)和處理器(Processor),以及Control objects 例如GainControl 都可以發出MediaEvent 事件。
JMF的事件模型如圖3 所示:
圖3 JMF 架構的事件模型
3.4數據模型(data model)
JMF的媒體播放器利用數據源(DataSources)對象來進行媒體內容的傳輸。數據源(DataSource)對象封裝了該媒體的位置信息和能夠播放該媒體的軟件和相關協議信息。一旦封裝後,該數據源就不能用於傳遞其它媒體數據。
DataSource通常用兩種方式來定義,媒體定位器(MediaLocator) 或URL(Universal Resource Locator)。媒體定位器(MediaLocator)類似於URL而且可以創建自一個URL,即使在沒有安裝相應的協議處理機制的情況下,也能構造MediaLocator。(在Java中, 構建一個URL必須在系統中有相應的協議處理機制。)
數據源(DataSource)可以管理一組源數據流(SourceStream)對象。標准的數據源(DataSource)是以一定數量字節作為一個傳輸單位的。而緩沖數據源(Buffer Data Source)用一個緩沖(Buffer)對象作為傳輸單位。JMF 定義了幾種數據源(DataSource)對象如圖4 所示:
圖4 JMF 架構的數據模型
3.4.1Push and Pull數據源
媒體數據可以從不同的數據源得到的。比如本地的或網絡上的文件或實時的廣播。JMF根據數據傳輸的發起點的不同,對這些數據源進行了分類:
(1) Pull Data-Source:客戶端發起數據傳輸並進行控制。適用於這種數據傳輸方式的協議有HTTP和FILE。JMF定義了兩類Pull Data-Source,PullDataSource和PullBufferDataSource。後者是用一個緩沖(Buffer)對象進行數據傳輸的。
(2) Push Data-Source:服務器端發起數據傳輸並進行控制。此種數據源包括媒體廣播,組播和VOD。相應的協議有RTP協議和SGI公司為其VOD系統開發的MediaBase協議。JMF 定義了兩類Push Data-Source,PushDataSource和PushBufferDataSource。
3.4.2特殊的數據源
JMF定義了兩類特殊的數據源,克隆數據源(cloneable data sources)和合並數據源(merging data sources)。
一個克隆數據源可以克隆一個pull或push數據源。你可以調用管理器(manager)的createCloneableDataSource方法並傳遞相應的數據源對象來克隆一個數據源。一旦一個數據源被傳遞到createCloneableDataSource方法,你就只能對這個克隆數據源以及它的克隆體進行處理,原始數據源對象不能被直接使用。
克隆數據源(cloneable data sources)實現SourceCloneable接口,其中定義了一個方法叫createClone。通過調用該方法,你可以為你的原始數據源復制出任意數量的克隆體,並由創建它們的克隆數據源(cloneable data sources)對其進行管理。
一個合並數據源(merging data sources)可以將來自於多個數據源的源數據流合並為一個數據源。這樣可以對一系列得數據源進行統一管理。
你可以調用管理器(manager)的createMergingDataSource方法並傳遞相應的數據源來創建一個合並數據源。需要注意的是,待合並的數據源必須是同一種類型的。例如你不能將一個PullDataSource和一個PushDataSource合並。該合並源的持續時間為其中最長的數據源的持續時間。它的內容類型(ContentType)為application/mixed-media。
3.4.3數據格式(data formats)
在JMF架構中,Format對象中保存了媒體的格式(format)信息。它並不包括編碼參數和全局時間信息。只是描述了該格式的編碼名稱和數據類別。圖5 表示JMF對音頻格式和視頻格式的定義:
圖5 JMF 架構的數據格式
在AudioFormat中,描述了音頻格式的屬性,如采樣頻率、每次采樣的數據位數和信道數等等。在VideoFormat中則描述了視頻數據的類型如H.263 等。
3.6控制器(controls)
JMF架構中,控制器(Control)提供了對對象的屬性進行設置和查詢的機制。控制器(Control)為相應的用戶提供了對對象進行操縱的接口。這些對象包括Controller(播放器player或處理器processor)對象,DataSource對象,DataSink 對象和其他JMF 插件。
3.6.1標准控制器(standard controls)
JMF 提供的標准控制器如圖6所示:
圖6 JMF 架構的標准控制
(1)CachingControl:監視和顯示下載進度。
(2)GainControl:對媒體播放屬性(如音量)進行控制,它還提供了對媒體播放屬性變化的監控。圖7所示:
圖7 GainControl 模型
(3)Multiplexer和DataSink:對數據流進行讀寫。
(4)FramePositionControl和FrameGrabbingControl:為處理器和播放器提供了基於幀的處理能力。例如在播放時能提供基於幀的定位、對視頻流進行靜態幀的讀寫等。
(5)TrackControl:是FormatControl中的一種。提供了對媒體數據中單獨信道的處理功能。
(6)PortControl和MonitorControl:提供了對媒體捕獲設備的控制功能。
(7)BufferControl:提供了對用戶端Buffer的控制功能。
3.6.2編解碼控制器(codec controls)
JMF 同樣提供了幾種對硬件和軟件編解碼器進行控制的編解碼器:
(1)BitRateControl:控制編碼率和輸出媒體的編碼率。
(2)FrameRateControl:提供幀率的修改。
(3)H261Control:提供了對H.261 協議的視頻編碼中的靜態圖像傳輸模式的控制。
(4)H263Control:提供了對H.263 協議中編碼參數如非限制矢量算術編碼等的控制。
(5)KeyFrameControl:提供了關鍵幀之間間隔的規范。
(6)MpegAudioControl:提供了基於MPEG 的音頻的編碼能力信息和規范。
(7)QualityControl:提供了在編解碼過程中播放質量與CPU占用率的最佳的平衡規范。
(8)SilenceSuppressionControl:提供了基於音頻編解碼的靜音壓縮規范。
3.7用戶接口組件(user interface components)
控制器(control)可以提供接入到用戶控制組件,以使得用戶可以得到對媒體的控制。你可以調用getControlCompont方法來得到默認的用戶控制組件。該方法返回一個AWT組件,你可以將該組件加到你的小應用程序或應用程序的顯示容器組件中。
Controller(播放器player或處理器processor)同樣可以提供接入到用戶控制組件。例如,一個播放器(player)可以同時提供一個可視組件和一個控制面板組件。你可以通過調用播放器的getVisualComponent和getControlPanelComponent方法來得到這些組件。
4.播放(presentation)
在JMF中,播放過程由Controller接口完成。Controller接口定義了基本的狀態和控制機制,使得實現它的對象可以對基於時間的媒體(time-based media)進行控制,播放或捕獲。Controller接口定義了一個媒體controller經歷的不同狀態,並提供了一種機制控制這些狀態的轉換。
Controller注冊了許多特定的MediaEvents,來獲知它的狀態的變化。你必須實現ControllerListener接口,來獲得來自於Controller(如播放器Player)的MediaEvents。
JMF API定義了兩種Controllers:播放器(Players)和控制器(Processors)。播放器和管理器是用來處理一個特定的數據源,通常建立後不再處理其它媒體數據。
圖8為JMF Controllers