JMF

Java術語,意為Java媒體框架(JMF)。該核心框架支持不同媒體(如:音頻輸出和視頻輸出)間的時鐘同步。它是一個標準的擴展框架,允許用戶製作純音頻流視頻流

JMF實際上是Java的一個類包。JMF 2.1.1技術提供了先進的媒體處理能力,從而擴展了Java平台的功能。這些功能包括:媒體捕獲、壓縮、流轉、回放,以及對各種主要媒體形式和編碼的支持,如M-JPEG、H.263、MP3、RTP/RTSP (實時傳送協定和實時流轉協定)、Macromedias Flash、IBM的HotMedia和Beatniks的Rich Media Format (RMF)等。JMF 2.1.1還支持廣受歡迎的媒體類型,如Quicktime、Microsofts AVI和MPEG-1等。此外,JMF 2.1.1軟體中包括了一個開放的媒體架構,可使開發人員靈活採用各種媒體回放、捕獲組件,或採用他們自己的定製的內插組件。
Sun以四種不同的專用版本提供JMF 2.1.1技術,滿足專業開發人員的各類需求,第一個是一個輕便型版本,它完全採用Java語言編寫,適用於任何Java兼容系統。此外,開發人員還可選 擇分別適用於Solaris、Windows或Linux等作業系統的性能最最佳化軟體包,以提高性能和能力。
JMF 2.1.1軟體也是Java Media系列軟體的一部分。Java Media系列軟體包括Java 3D、Java 2D、Java Sound和Java Advanced Imaging等API。採用各種Java Media API,軟體開發商人員就能容易、快速地為他們已有的各種應用程式和客戶端Java小程式增添豐富的媒體功能,如流式視頻、3D圖像和影像處理等。就是 說,各種Java Media API發揮了Java平台的固有優勢,將"編寫一次,到處運行"的能力擴展到了圖像、影像和數字媒體等各種套用領域,從而大大縮減了開發時間和降低了開發 成本。
JMF系統介紹
[ Adigan 發表於 2005-10-2 17:25:15 ]
一.簡介
1.1JMF 體系結構簡介
在開發JMF 應用程式之前要完全理解JMF 的體系架構、接口和類。就拿我們的家用攝像機系統作個例子。首先用攝像機拍攝內容,拍攝下來的內容錄製在DV帶中。DV帶可以放在放像機里播放、放像機提供視頻信號給電視機,提供音頻信號給音箱,這樣我們就可以在電視機上看到畫面,從音箱裡聽到聲音。JMF API 提供的也是同樣的模型。
JMF 提供的模型可大致分為七類
* 數據源(Data source)
* 截取設備(Capture Device,包括視頻和音頻截取設備)
* 播放器(Player)
* 處理器(Processor)
* 數據池(DataSink)
* 數據格式(Format)
* 管理器(Manager)
1.2 如何套用JMF捕獲媒體數據
可以套用JMF從攝像頭和麥克風中採集數據,採集後的數據可以被處理、保存、渲染為以後套用。
捕獲媒體數據需要做以下工作。1.定位所需要用的捕獲設備,可以通過查詢CaptureDeviceManager來定位。2.獲取這個捕獲設備的信息CaptureDeviceInfo對象。3.從CaptureDeviceInfo對象中獲取捕獲設備的位置Medialocator。4.利用MediaLocator創建DataSource。5.使用DataSource創建Player或是Processor。6.然後啟動Player就開始了媒體的捕獲。
如果只是想觀看捕獲的內容,只需要使用捕獲數據源創建播放器Player即可。如果想把捕獲的數據傳送到網路或者保存起來,就需要創建處理器Processor。
可以從CaptureDeviceManager中獲取捕獲設備的信息。CaptureDeviceManager是可在JMF中使用的全部捕獲設備的註冊中心。可以通過調用CaptureDeviceManager的getDeviceList方法獲取可用的捕獲設備列表。
每個捕獲設備都由CaptureDeviceInfo對象代表,要獲取一個特定的設備只需要調用CaptureDeviceManager的getDevice方法。
從特定的設備捕獲媒體數據,需要從它的CaptureDeviceInfo對象中獲取這個設備的位置信息MediaLocator。可以用MediaLocator直接構建一個Player或者Processor。還可以用MediaLocator構建一個DataSource作為Player的輸入。當Play開始的播放的時候,就開始捕獲過程。
一個捕獲設備通常有一系列屬性可以進行配置。通常控制分為2種,一種是連線埠控制PortControl,另一種是監視MonitorControl。可以通過調用捕獲DataSource的getControl方法,來獲取這兩種控制對象。
和其他的控制對象一樣,對於PortControl或者MonitorControl都可以通過調用getControlCompent方法來得到它們的可視化組件。這些組件可以添加到Applet中或者應用程式中,這樣用戶可以和這些控制對象互動。
處理顯示控制組件,還可以顯示標準的Player控制組件。
1.3如何使用RTP接收和傳送流媒體數據
JMF Player 和 Processor 可以提供顯示、獲取、轉換RTP 數據流的機制。
可以按照標準的方式通過Manager為RTP數據流創建Player。使用包含RTP Session的MediaLocator作為參數,調用Manager的createPlayer(MediaLocator)來創建Player。也可以用某個接收數據流的DataSource作為參數來創建Player。
如果用MediaLocator作為參數來創建Player, Player 只會顯示Session中檢測到的第一個RTP 數據流。如果想播放Session中的所有視頻流,則需要調用SessionManager為每個接收數據流創建一個Player。
當使用MediaLocator為RTP Session 創建Player,Manager為Session中的第一個數據流創建Player。當檢測到數據時,Player發出RealizeCompleteEvent。
通過監聽RealizeCompleteEvent,可以確定數據是否到了以及Player是否可以播放任何數據。一旦Player發出這個事件,就可以獲取Player的可視組件和控制組件。
要注意的是,如果在沒有檢測到Session中數據時,Player 是不會結束Realizing狀態的。對於Rtp 媒體流Player 不能試圖調用Manager的CreateRealizedPlayer。如果調用,會引起死鎖。
1.4如何在網路傳送流媒體數據
在傳送RTP數據流之前,需要套用Processor產生RTP編碼的數據源。通過構建一個SessionManager或者是DataSink來控制傳輸過程。
Processor處理器的輸入可以是現有的媒體檔案,也可以是實時捕獲的數據。對於現有的媒體數據,可以使用MediaLocaotr來代表媒體檔案。並根據MediaLocator來創建Processor。對於捕獲的媒體數據,一個捕獲數據源Capture DataSource 會用作Processor的輸入。
有兩種方式來傳送RTP數據流,一種是用MediaLocator作為RTP session的參數,調用Manager的createDataSink方法來創建一個RTP DataSink。另一種方式是利用session manager 來創建傳送數據流,並控制傳輸過程。
當利用MediaLocator來構建RTP DataSink的時候,你只能傳送DataSource中的第一個數據流。如果需要在一個進程中傳送多個RTP數據流或者需要監控進程的統計狀態,就需要直接使用SessionManager。
無論採用哪種方式傳輸RTP數據流,都需要做如下工作:
1、使用DataSource創建Processor,這個DataSource代表你要傳輸的數據
2、設定Processor的輸出為RTP 編碼的數據
3、取得Processor的輸出作為DataSource
二.具體的試驗-套用JMF開發視頻套用
2.1配置開發環境
需要J2SDK,JRE1.42, JMF Windows Performance Pack,JMF 的 下載地址:http://java.sun.com/products/java-media/jmf/2.1.1/setup.html 針對WINDOWS 用戶,可下載Windows Performance Pack。只有安裝Windows Performance Pack才支持視頻、音頻捕獲。下載後會自動安裝,自動配置路徑。安裝後需去測試一下是否安裝成功。測試地址:http://java.sun.com/products/java-media/jmf/2.1.1/jmfdiagnostics.html
2.2用APPLET在瀏覽器中播放視頻短片
在瀏覽器中實現APPLET 視頻播放中用到了兩個基本概念 manager ,和player。JMF APPLET 是播放視頻檔案的過程是這樣的。首先,提供媒體檔案的位置作為創建PLAYER的參數。Player創建後會根據媒體檔案的格式尋找解碼器,並且進行初始化。然後為PLAYER 添加一個ControllerListener,用來監聽PLAYER的狀態。通過監聽player 的狀態採取不同的措施。在Player 發出RealizeCompleteEvent的時候,可以獲取player 的VisualComponent 寬度,高度,VisualControllpane的寬度,高度。最後一步調用player的start方法,就可以顯示媒體檔案的內容了。如果不使用PLUGIN,JMF 只支持標準的AVI,MOV,WAV 檔案。對於流行的MPEG4視頻檔案,MP3並不支持。通過安裝解碼器,可以播放這些檔案。
2.3採集攝像頭數據
採集攝像頭數據,需要兩步工作。連線視頻設備,然後獲取視頻設備的數據。視頻,音頻設備在Jmf Performance Pack 安裝時會在JMF Registry中註冊自己的設備名。需要連線攝像頭時,可以通過查找攝像頭的設備名來連線攝像頭。具體的實現步驟,首先要得到Device的名字,有兩種方法可以辦到,
方法一
通過選單,把系統支持的Device都列出來,根據客戶的選擇來確定。
方法二
用程式來判斷。在第二種方法中,通過傳遞一個Format 對象到CaptureDeviceManager的getDeviceList 方法中,獲得Device的名字。得到Device 的名字以後,可以獲得CaptureDeviceInfo,從而得到MediaLocator。第一部分連線攝像頭的工作就完成了。下一步工作是捕獲攝像頭視頻,並顯示出來。有視頻設備構成的數據源可分為2種,例如照相機這種設備,屬於Pull DataSource,用的時候才使用。類似於攝像頭這種設備構成的數據源屬於Push Datasource,源源不斷的傳送視頻數據。以獲取的MediaLocator 作為參數構建Player,就可以播放攝像頭內容了。
2.4獲取攝像頭視頻數據和麥克風音頻數據
基本步驟是首先獲取視頻、音頻捕獲設備的信息,然後再根據取得的設備信息確定設備的位置。找到設備的位置以後,調用Manager的CreatePlayer方法創建Player,當Player開始播放的時候,就開始了捕獲的過程。
有多種方法獲得捕獲設備信息,可以通過查詢指定的格式,也可以查詢特定的設備名字。具體步驟如下:
1. 先把所有的捕獲設備調出來
2. 所有的視頻捕獲設備的名字都是以vfw開頭的,所以取得捕獲設備列表中以vfw 開頭的設備名字就是視頻捕獲設備
3. 獲取設備的medialocator地址
4. 創建Player,當Play開始的時候,就開始了視頻捕獲的過程
2.5保存攝像頭數據為視頻檔案
首先是找到捕獲設備,然後取的捕獲設備的位置信息。如果要保存所採集的數據,就要創建一個處理器。然後將處理器的輸出作為數據池的輸入。當啟動數據池的時候,就可以把捕獲的數據保存成檔案了。具體步驟如下:
1. 獲取視頻捕獲設備的medialocator地址
2. 以獲取的medialocator為參數,創建Processor
3. 設定Processor,輸出類型為AVI格式
4. 以Processor的輸出為參數,創建數據源
5. 建立一個保存檔案位置的MediaLocator
6. 以輸入數據源和輸出數據源為參數,建立一個DATASINK
7. 調用Processor的StreamWriterControl,設定Processor控制生成檔案的大小
8. 設定完畢,可以啟動Processor和DataSink來保存捕獲數據了
2.6 捕獲音頻、視頻數據為QuickTime格式的檔案
使用處理器模型來捕獲實時的視頻、音頻數據並且將數據軌道進行編碼、混合,最後保存為QuickTime 格式的檔案。
首先構建一個處理器模型,設定好特定的數據軌道和輸出內容格式。然後使用這個處理器模型來創建一個處理器。處理器會自動連線到符合檔案格式要求的捕獲設備。具體步驟如下:
1. 設定要輸出的音頻格式和視頻格式
2. 設定要輸出的檔案類型為QuickTime格式
3. 以數據軌道輸出格式和檔案輸出類型為參數,創建ProcessorModel
4. 由ProcessorModel對象創建Processor對象
5. 以Processor的輸出為參數創建數據源
6. 建立一個記錄保存檔案的MediaLocator
7. 創建DataSink
8. 開始保存數據檔案,啟動處理器
9. 當結束捕獲視頻時,停止處理器,並關掉它
10. 當數據池接到EndOfStream事件時,停止保存檔案。
2.7 傳送實時媒體數據
如果需要將媒體數據傳送到網路,首先需要用Processor生成RTP編碼的數據源,然後創建SessionManager或者DataSink來控制傳輸過程。具體步驟如下:
1. 獲取視頻採集設備
2. 創建Processor,連線到視頻採集設備
3. 等待,直到processor的狀態變成configured,設定輸出格式為RAW_RTP
4. 列出所有的和數據軌道相關的控制器
5. 遍歷這些控制器,找到可以控制輸出格式的控制器
6. 找到了數據軌道的格式控制器之後,設定輸出格式,輸出格式輸出為VideoFormat.JPEG_RTP
7. 準備工作已經做好,可以調用Processor的realize方法
8. 當Processor進出realized狀態以後,可以取得Processor的輸出作為數據源
9. 可以把這個數據源作為參數傳遞給manager,通過manager創建一個RTP的數據池。
10. 先設定一個傳送數據流的多播目的網址
11. 確定了數據源和傳送地址,可以建立數據池DataSink了,建立成功後調用open()和start()方法,就可以在網上以多播方式傳送捕獲的內容了
2.8 接收實時視頻數據
接收網上傳輸的數據流時,首先要構建一個MediaLocator來描述RTP 進程,Manager為進程中的第一個數據流創建播放器,當從進程中檢測到數據時,Player會發出RealizeComplete事件。
通過監聽RealizeComplete事件,你可以確定是否有數據到了,還可以確定Player是否準備好播放數據了。當Player發出這個事件時,就可以獲取播放器的可視面板和控制臺了。具體實現步驟如下:
1. 確定RTP 數據源的地址,例如:String url= "rtp://224.144.251.104:49150/audio/1"
2. 以RTP數據源地址為參數,創建MediaLocator
3. 以MediaLocator為參數,創建Player
4. 為PLAYER添加監聽器,以便監聽RealizeComplete事件
三. 實驗效果總結
JMF2.0 支持媒體捕獲,並且考慮到了程式開發者需求。允許程式開發者在媒體處理、媒體控制上添加自己的控制器。JMF 提供的外掛程式的架構使得直接訪問媒體數據成為可能。這樣JMF可以更方便的被擴展。JMF的設計目的是使開發簡便、支持媒體捕獲、支持使用JAVA技術開發媒體傳輸以及視頻會議等套用、支持高級開發者開發外掛程式擴展JMF套用,新的特性還可以和原有的系統很好的融合。允許開發者開發定製的,可下載的編碼器、處理器、分離器和組合器。
JMF的類庫還可以提供對RTP(實時傳輸協定)的支持。RTP支持在網上實時的傳送、接收媒體流。RTP可以用在開發視頻點播、音頻點播或者網上的互動內容服務等套用。
四. 進一步的研究工作
本文研究了JAVA視頻套用基本內容,為進一步擴展JMF的套用開發打下了基礎。在這一段的研究中積累的很多經驗。由於時間的關係,只是初步了解了如何通過外掛程式技術擴展JMF的套用能力。今後需要做的主要研究工作和研究方向主要有
1、編寫解碼器外掛程式,擴展JMF的套用能力。使得JMF可以支持更多的媒體類型;
2、編寫處理器外掛程式,增強JMF的視頻處理能力,使得JMF的視頻編輯能力更強。

相關詞條

熱門詞條

聯絡我們