版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Java架構(gòu)基礎(chǔ)內(nèi)容表格1.2.3.4.5.6.關(guān)于此指南一個簡單的音頻 JMF 用戶接口組件 JMF 概念和接收 總結(jié)以及資源器第一節(jié). 關(guān)于此指南此指南包含的內(nèi)容?Java架構(gòu)(JMF)是一個令人激動的通用的 API,它允許 Java 開發(fā)者用許多不同的方法處理。本指南主要通過使用工作的例子提供一個 JMF 的一些主要的特征的概述。閱讀完本指南后,你將會明白 JMF 體系結(jié)構(gòu)中的主要功能。你同樣能正確的使用 JMF,使用現(xiàn)存的例子和可為特殊功能擴(kuò)展的源代 碼。本指南包含著以下:和安裝 JMF主要的 JMF 類以及它們在 JMF 體系結(jié)構(gòu)中的應(yīng)用本地的文件為的存取和操作制作以和圖形用戶界面(
2、GUI)通過網(wǎng)絡(luò)通過網(wǎng)絡(luò)接收幾乎所有的類型的操作和處理都可以通過 JMF 來實現(xiàn)。全面的JMF 所提應(yīng)用程序來供的所有特征已經(jīng)超過了本指南的范圍使用三個簡單的學(xué)習(xí)此框架的構(gòu)建模塊。通過這個方法,本指南將為你未來學(xué)習(xí)和實施的應(yīng)用提供準(zhǔn)備。我應(yīng)該使用此指南嗎?特殊本指南會帶你學(xué)習(xí)使用 JMF 工作的基礎(chǔ)。為完成這些,會創(chuàng)建三個的獨(dú)立工作的例程序。每個例子都會建立前一個例子的基礎(chǔ)上,顯示 JMF 功能性的不同方面。在 本指南中的例子假定你曾經(jīng)使用過并且已經(jīng)熟悉了 Java 程序語言。除了 Java和 JMF 的類之外,會使用一些 Java AWT 和 Swing 類(用于創(chuàng)建 GUI),也會有一些
3、Java 網(wǎng)絡(luò)類(用于在網(wǎng)絡(luò)中傳輸)。對 GUI 和網(wǎng)絡(luò)類一些熟悉有助于你更快的明白觀點(diǎn)和這里的 例子,但并非是閱讀本指南必須的。學(xué)習(xí)的例程序如下 一個簡單的音頻器(JMF 的oWorld 應(yīng)用):這個字符界面的器通頻過在命令行中簡單的輸入文件的名字就可以大多數(shù)的音頻類型器的演示大體上顯示了 JMF 的特有的類。 一個圖形界面的器:使用 JMF 內(nèi)置的接口組件來建立圖形界面,所以在此練習(xí)中必須有一些圖形界面的編程經(jīng)驗。這個了一些 Java AWT 和 Swing 類來為用戶顯示圖形組件。閱覽器演示使用 一個廣播應(yīng)用:此應(yīng)用程序允許一個本地文件通過網(wǎng)絡(luò)。此程序能靈活的使只傳輸?shù)街付ǖ木W(wǎng)絡(luò)節(jié)點(diǎn),或
4、者傳輸?shù)揭粋€子網(wǎng)絡(luò)中的所有節(jié)點(diǎn)。此演示使用了一些 Java 的網(wǎng)絡(luò) APIs 來在網(wǎng)絡(luò)中傳輸。作為第三個練習(xí)的一部分,。修改圖形界面的器,讓其能接收并且跳至 23 頁Resour,文章,指南,和其他參考書目的列表,這會幫助你學(xué)習(xí)到更到關(guān)于此指南包括的。安裝需求要運(yùn)行此指南中的例程序,你需要如下的工具和組件:Java 2 Java,標(biāo)準(zhǔn)版,編譯和運(yùn)行演示程序框架,版本 2.1.1a 或者更高一塊已經(jīng)安裝并且配置號的適當(dāng)?shù)穆暱ㄒ慌_或者多臺測試機(jī)器演示的源代碼文件在 mediaplayer.jar 中最后的一個演示應(yīng)用顯示了 JMF 在網(wǎng)絡(luò)中的應(yīng)用。如果需要,此演示能運(yùn)行在一個獨(dú)立的機(jī)器上,使用此機(jī)
5、器即是傳輸方也是接收方。用 JMF 的所有功能,你仍然需要至少兩臺聯(lián)網(wǎng)的機(jī)器。要觀察到在網(wǎng)絡(luò)中使在 23 頁中的 Resour可Java 2,完整的源代碼文件,以及其他一些完成本指南所需要的工具。安裝文件將 JMF 安裝到你的計算機(jī)中的第一步是在 JMF 的主頁中安裝文件,它同樣包括了 JMF 源代碼和 API 文檔的。23 頁的Resour中有JMF 的。目 前,JMF 有 Windows, Solaris, Linux 等版本,以及可運(yùn)行在任何裝有虛擬機(jī)的計算機(jī)上一個純 Java 版本。為了增加性能,你需要一個與你操作系統(tǒng)所適應(yīng)的版本。任何在一個操作系 統(tǒng) JMF 版本下書寫和編譯的代碼都
6、可以方便的移植到另外的操作系統(tǒng)上。例如,如果你了一個 Solaris 版本的 JMF 并且編譯了一個類,這些類就可以 在 Linux 上使用,不會有任何問題。作為選擇,你可以選擇純 Java 版本,或者跨版本的 JMF。這些版本沒有使用操作系統(tǒng)特有的庫文件。如果沒有合適的 JMF 版本適合的操作系統(tǒng),那么跨版本就是一個不錯的選擇。安裝 JMF完 JMF 安裝程序后,雙擊安裝程序的圖標(biāo)。大部分安裝程序都會有個選項,安裝本地庫到系統(tǒng)目錄中;例如,Windows 版本安裝程序會有一個選項“Move DLLs to Windows/System directory.”。最好將此選項選中,因為它能確保這
7、些操作系統(tǒng)的庫文件能正確的安裝在安裝的過程中,你還需要選擇項目來更新系統(tǒng)的 CLASSPATH 和 PATH 變量。如果這些選項被關(guān)閉,那么在你編譯和運(yùn)行本指南的例程序的時候就需要在 classpath 中引入 JMF 的 jar 文件。關(guān)于作者Eric Olson 在 Retek Inc 工作的工程師。它在 Java上有四年的工作經(jīng)驗,并且在不同的基于 Java 的技術(shù)上富有經(jīng)驗,包括 JMF, Jini, Jiro, JSP, servlets, and EJBs。Eric 畢業(yè)于 St. Paul, MN 的 St. Thomas 大學(xué),獲得計算機(jī)科學(xué)的學(xué)位。他在 IBM 的 SanFr
8、ancisco 項目組工作,負(fù)責(zé) WebSphere 商業(yè)組件。他同時再為 Imation Corp.工作,負(fù)責(zé)應(yīng)用?,F(xiàn)在,他正在開發(fā)零售行業(yè)的基于 web 的解決方案。再業(yè)余的時間,Eric 和 PaulMonday 在 Stereo Beacon 上合作一個分布式的點(diǎn)對點(diǎn)的基于 JMF 的器。聯(lián)系Eric.第二節(jié). 一個簡單的音頻瀏覽器在本節(jié)中,進(jìn)行創(chuàng)建一個簡單的音頻器的第一個練習(xí)。本例將介紹Manager 類和 Player 接口,中兩個都是建立大多數(shù)基于 JMF 應(yīng)用的重要部分。本例的功能目標(biāo)是在字符界面下本地的音頻文件。學(xué)習(xí)此源代碼,并了解每一行所做的任務(wù)。完成本節(jié)后,你將會有一個基
9、于 JMF 的可WAV, AU 等多種音頻文件的演示程序。在本練習(xí)后的源代碼分類種可查詢文件 SimpleAudioPlayer.java。包括 MP3,引入必要的類SimpleAudioPlayer 類中包括了一些調(diào)用,在其前幾行中需要引入所有必要的類:import import import import importjavax.media.*; java.io.File; java.io.IOException; .URL;.MalformedURLException;The javax.media 包是由 JMF 定義的多個包之一。javax.media 是一個包,包括了定義 Mana
10、ger 類和 Player 接口等。本節(jié)中,主要學(xué)習(xí) Manager 類和Player 接口,其余的 javax.media 類放在后面的章節(jié)中。除了引入 javax.media外,以上的代碼片斷引入了一些創(chuàng)建器的輸入的。Player 接口在下面的代碼片斷中,創(chuàng)建一個公共類 SimpleAudioPlayer 并舉例定義一個Player 變量:public class SimpleAudioPlayer private Player audioPlayer = null;術(shù) 語 Player 聽起來由點(diǎn)熟悉,因為它是建立在公用的音頻或者器的基礎(chǔ)上的。事實上,這個接口的例子就像是當(dāng)作它們的真實的
11、副本。 Players揭示了一個實體上的法。例如,一個 JMF器(如音箱系統(tǒng)或者 VCR)涉及到功能上的方器可以開始和結(jié)束一個流。在 本節(jié)種,將使用 Player 的開始和結(jié)束功能。在一個文件上創(chuàng)建一個 Player使用 JMF 獲得一個特定文件的 Player 實例非常簡單。Manager 類在 JMF 中如同一個工廠制作許多的特殊接口類型,包括 Player 接口。因此,Manager 類的責(zé)任就是創(chuàng)建 Player 實例,如下例:public SimpleAudioPlayer(URL url) throws IOException, NoPlayerException,CannotRe
12、alizeException audioPlayer = Manager.createRealizedPlayer(url);public SimpleAudioPlayer(File file) throws IOException, NoPlayerException,CannotRealizeException this(file.toURL();如果你看完本節(jié)的代碼,你可以注意到 Manager 類包含了創(chuàng)建一個 Player 實例的其他方法。會研究其中的一些,如在后面的章節(jié)中的 DataSource 或者M(jìn)ediaLocator 的實例化。Player 的狀態(tài)JMF 定義了大量的一個
13、 Player 實例可能存在的不同狀態(tài)。如下:Prefetched Prefetching Realized Realizing Started Unrealized使用這些狀態(tài)因 為使用常常是資源非常密集的,由 JMF 對象揭示的許多方法都是不閉塞的,允許一系列事件的狀態(tài)改變的異步通知。例如,一個 Player 在它可以啟 動之前,必須經(jīng)過 Prefetched 和 Realized 狀態(tài)。由于這些狀態(tài)的改變都需要一些時間來完成,JMF應(yīng)用可以分配一個線程來初始化創(chuàng)建 Player 實例,然后再繼續(xù)其他的操作。當(dāng) Player 準(zhǔn)備就緒的時候,它會通知應(yīng)用程序其狀態(tài)已經(jīng)改變。在一個如同的這樣
14、簡單的 程序中,多功能性的類型并不是很重要。處于這個原因,Manager 類也提供了一些創(chuàng)建 Realized player 的有用方法。調(diào)用一個createRealizedPlayer()方法來阻塞調(diào)用線程,直到player 達(dá)到Realized 狀態(tài)。為了調(diào) 用一個無阻塞的創(chuàng)建 player 的方法,在 Manager 類中使用了一個createPlayer()方法。下面的一行代碼中創(chuàng)建了一個的Realized player:audioPlayer = Manager.createRealizedPlayer(url);需要在例 程序中使用啟動和停止 Player設(shè)定一個 Player 實
15、例的啟動或是停止就如同調(diào)用 Player 的一個簡單的認(rèn)證方法,如下所示:public void play() audioPlayer.start();public void stop() audioPlayer.stop(); audioPlayer.close();調(diào)用 SimpleAudioPlayer 類中的 play()方法來實現(xiàn)調(diào)用 Player 實例的 start()方法。調(diào)用此方法后,你能聽到本地的喇叭player 停止并且關(guān)閉掉 Player 對象。文件。同樣的,stop()方法使對 于和或者本地文件來說,關(guān)閉 Player 實例所有資源是一個有用的方法。因為這是一個簡單的例
16、子,關(guān)閉 Player 是終止一個會話可接受 的方法。但是在實際的應(yīng)用中,你需要的確認(rèn)在除掉 Player 之前必須要關(guān)閉掉。一但你已經(jīng)關(guān)閉掉 player,在再次的 Player 實例(等待它的狀態(tài)改變)。一個之前你必須要創(chuàng)建 一個新建立一個 SimpleAudioPlayer最后,這個應(yīng)用程序要包含一個可以從命令提示行中輸入命令而調(diào)用的main()方法。在此 main()方法中, File audioFile = new File(args0);調(diào)用創(chuàng)建 SimpleAudioPlayer 的方法:SimpleAudioPlaylayer = new SimpleAudioPlayer(a
17、udioFile);在音頻文件之前的唯一的一些事情就是調(diào)用已經(jīng)創(chuàng)建的音頻 player 的方法play(),如下所示:playlay();要停止和清除掉音頻 player,在 main()方法中也應(yīng)該有如下調(diào)用: player.stop();編譯和運(yùn)行 SimpleAudioPlayer通過在命令提示行輸入 javac SimpleAudioPlayer.java 來編譯例程序。所創(chuàng)建的文件 SimpleAudioPlayer.class 在當(dāng)前工作目錄中。然后在命令提示行中鍵入如下命令來運(yùn)行例程序:java SimpleAudioPlayer audioFile將 audioFile 替換成
18、你本地機(jī)器上的音頻文件。所有的相對文件名都試相對于當(dāng)前的工作目錄。你會看到一些當(dāng)前正在回車鍵。文件的標(biāo)志信息。要終止,按下如果編譯失敗,確認(rèn) JMF 的 jar 文件已經(jīng)正確的包含在 CLASSPATH 環(huán)境變量中。第三節(jié). JMF 用戶界面組件一節(jié)中,學(xué)習(xí)了建立一個通過字符界面音頻文件的應(yīng)用程序。JMF中一個最重要的特點(diǎn)就是你不需要為了配置器而去了解文件的格式;一 切都內(nèi)置了。舉一個例子,再前面的例子中,需要使用 MP3 格式的時候,不需要讓應(yīng)用程序為一個 MP3 文件建立一個特殊的 Player。如同你將會再本節(jié)所見到的,對于件類型接口的詳細(xì)資料。文件的操作同樣有效。JMF 有所有文處理與
19、音頻最大的不同就是,須建立一個能的顯示屏?xí)⒁粋€的可視的幕。幸運(yùn)的是,JMF 能處理許多的這些資料。如同再上例一樣Player 對象,并且使用很多的可視組件來直接從 JMF 對象中創(chuàng)建瀏覽器。本節(jié)中,second ex學(xué)習(xí)兩個例程序。his section, well walk through thele application. 請再后面的練習(xí)的源代碼分布中查閱MediaPlayerFrame.java。關(guān)于例子 在 本節(jié)中,為練習(xí)的一部分創(chuàng)建一個能顯示和運(yùn)行本地音頻和的應(yīng)用程序。作研究 JMF 內(nèi)置的一些GUI 組件。熟悉 AWT 和 Swing 將 有助于你理解本例,但這并不是必須的。
20、除非需要直接涉及到 JMF 的 GUI 組件,或者是不會詳細(xì)介紹源代碼的。你可以在源代碼的注釋中找到這里未涉及的詳細(xì)說明。本例中使用的許多概念,類和方法都和第一個例子的類似。建立 Player 的基本操作大都一樣。最大的不同就是需要對 Player 對象專研更深一點(diǎn),特別當(dāng)需要從 Player 獲取信息的時候。如何開始器例子被設(shè)計得如同音頻例子一樣通過命令行來運(yùn)行,但是本例需要建立在 GUI 基礎(chǔ)上。如同在上節(jié)一樣,先通過文件名調(diào)用應(yīng)用。然后,應(yīng)用程序顯示一個帶有可操作組件的窗體。在 MediaPlayerFrame 開始的一行中 javax.swing.Jframe 類。這就是使方法。任何客
21、戶機(jī)程序創(chuàng)建了本 義的 show()方法來顯示。下面是一個 MediaPlayerFrame 正在定義了類并擴(kuò)展自,器如同一個在桌面上的單獨(dú)窗體的對象后都可以通過調(diào)用 Jframe 類中定MPEG的屏幕截圖:獲取 GUI 組件Player 界面有一些方法來獲取已選擇可視組件的涉及。在 MediaPlayerFrame 中,使用如下組件:pplayer.ponent()是一個所有的可視組件。ponent() 是一個操作時間軸的可視組件(包括開始,停止,回放),也包含了一些 player.getGainControl()流的有用信息。ponent() 是操作音量(增加)的可視組件。getGainC
22、ontrol()方法返回一個 GainControl 實例,可用于改變的增加等級。使用可視化組件上面的界面方法都返回一個ponent 類的實例。沒個實例都視可加載到窗體上的可視組件。這些組件都與 Player 有直接的聯(lián)系,所以在這些組件上的所有可視元素的處理都會產(chǎn)生 Player后相應(yīng)的變化。在這些組件加入到的窗體的之前,必須要保證它們不為空。因為并不是所有的器包括每一種可視組件只需添加相關(guān)器類型的組ponent()件。比 如,一般來說一個音頻就要返回空。你不會想在音頻器沒有可視組件,所以器窗體上添加可視組件的。獲得的特殊控制 個 Player 實例也可以通過 getControl()和 g
23、etControls()方法來其控制,getControls()返回一個控制對象集, 而 getControl()返回一個控制。不同的器類型可選擇為特殊的操作來控制集去指定的類型,或者用于獲取該的傳輸機(jī)制。如果你在寫 一個只支持某些類型的器,你需要依靠某些在 Player 實例中可用 Control 對象。由于的器是非常抽象的,被設(shè)計于多種 不同類型,簡單就可使用的為用戶所有的 Control 對象。如果找到任何擴(kuò)展的控制集,ponent()方法 來增加相應(yīng)的可視控件到面板上。通過這個辦法,用戶就可以觀察器上的所有組件。以下代碼片斷將所有的控制對象給用戶:Control controls =
24、player.getControls();for (i = 0; i controls.length; i+) if (controlsiponent() != null) tabPane.add(controlsiponent();為 了使一個真實的應(yīng)用程序能用 Control 實例做一些有用的事(除了能顯示可視組件之外),應(yīng)用程序需要知道該 Control 的特殊類型,并分配它。此 后,應(yīng)用程序就可使用這些 control 來控制了。例如,如果你知道你經(jīng)常使用的javax.media.control.QualityControl 類型的 Control,你能使用 QualityContro
25、l 界面,之后在 QualityControl 界面上通過調(diào)用各種方法來改變性質(zhì)設(shè)定。使用一個 MediaLocator在新的基于 GUI 的器和的第一個簡單器之間最大的不同就是,使用一個 MediaLocator 對象而不是 URL 來創(chuàng)建 Player 實例,如下所示:public void setMediaLocator(MediaLocator locator) throws IOException, NoPlayerException, CannotRealizeException setPlayer(Manager.createRealizedPlayer(locator);在稍后
26、的章節(jié)中這個變化的原因。目前,在網(wǎng)絡(luò)上資源站點(diǎn)上,關(guān)于 MediaLocator 對象和 URL 的描述被認(rèn)為是非常相似的。事實上,你可以 從一個 URL 創(chuàng)建一個 MediaLocator,也可以從 MediaLocator 獲取到 URL。的新器一個 URL 中創(chuàng)建一個 MediaLocator,并使用該 MediaLocator 通過文件創(chuàng)建了一個 Player。編譯和運(yùn)行 MediaPlayerFrame通過在命令提示行輸入 javac MediaPlayerFrame.java 來編譯例程序。在工作目錄下將創(chuàng)建一個名為 MediaPlayerFrame.class 的文件。在命令提示
27、行中鍵入如下來運(yùn)行例程序:java MediaPlayerFrame mediaFile你需要用你本機(jī)上的一個文件來替換掉 mediaFile(音頻或者文件都可以)。所有的相對文件名都是相對于當(dāng)前工作目錄。你會看見一個顯示控制文件的 GUI 控制集的窗口。欲了解 JMF 支持的音頻和資源。文件列表,在 23 頁的如果初始編譯時失敗,請確認(rèn) JMF 的 jar 文件已經(jīng)包含在當(dāng)前的 CLASSPATH 環(huán)境變量中。MediaPlayerFrame 在行動在本節(jié)前你看見的一個 屏幕截圖顯示了一個音頻器正在器正在MPEG文件的屏幕截圖。下面的一個 MP3 文件:要的學(xué)習(xí)本練習(xí)中的例子,查看完成的 M
28、ediaPlayerFrame 源代碼。第四節(jié). JMF 概念JMF 體系結(jié)構(gòu)你過了使用 JMF本地文件是容易,現(xiàn)在后退一步,來看看一幅是如何通過 JMF 創(chuàng)建了如此成基于的應(yīng)用程序的大的畫面,是如 何通過 JMF 創(chuàng)建了如此成基于的應(yīng)用程序。全面的了解 JMF 體系結(jié)構(gòu)是沒有意義的,本節(jié)將給你一個大體的概念,關(guān)于高級的 JMF 組件是如何組合起 來創(chuàng)建想得到的東西。JMF 的組件結(jié)構(gòu)非常的靈活,它的組件一般可以分成三個部分: Input 描述某種被用于在進(jìn)程休息的時候作為一個輸入的。 pros 執(zhí)行某些輸入上的活動。一個過程有一個明確的輸入和輸出。大量的過程可用, 能被用于一個輸入或者一批輸
29、入。這些過程能被聯(lián)系起來,一個過程的輸出被用于另外一個過程的輸入。在這種風(fēng)格中,大量的過程可能被應(yīng)用于一個輸入。(這段 期間是可選擇的開始的兩個例子沒有包含真正的數(shù)據(jù)過程,只有一個來自文件的輸入和一個通過 Player 的輸出。) Output 描述了的某些目的地。從這些描述中,你可以想象到 JMF 組件體系結(jié)構(gòu)聽起來就好像在一個典型的聲系統(tǒng)或者 VCR 之后。很容易設(shè)想到,使用 JMF 就如同打開電視或者在聲音箱系統(tǒng)下調(diào)節(jié)聲音的風(fēng)格。例如,錄制喜愛的電視件的基礎(chǔ)中:的簡單的動作能在這些組 Input 是電視廣播流,在同一個頻道音頻和。 Pros 是一個設(shè)備(就是,一個 VCR 或者許多的數(shù)字
30、設(shè)備)轉(zhuǎn)換模擬或者數(shù)字音頻 Output 是廣播流成適合到磁帶或其他上的格式。已格式化軌跡(音頻和)到某些類型的上。JMF 資料處理模式以下說明了JMF 數(shù)據(jù)處理模塊并對每個類型給出了例子:使用此模式,很容易明白前面的兩個例子,從文件中輸入音頻和并輸出到本地計算機(jī)上。在后面的章節(jié)中,的 JMF 網(wǎng)絡(luò)功能。也會談?wù)撘恍┩ㄟ^和接收音頻處理模型例子將 JMF 的輸入,處理和輸出模式聯(lián)系起來,作都可能通過 JMF 完成。一個例子,轉(zhuǎn)換一種能開始想象許多基于的操類型為其他類型并將其輸出存儲到一個新 的文件。舉一個例子,想要在不損壞原始文件的前提下轉(zhuǎn)化一個 WAV 格式的音頻文件為 MP3 格式。以下的過
31、程模式插圖,就是轉(zhuǎn)換的步驟:開始執(zhí)行本例的輸入是一個 WAV 文件。它被一個格式轉(zhuǎn)換工具加工,并輸出到一個新的文件?,F(xiàn)在,讓看看 JMF API 中的這個模式的每一步。使用輸入,處理和輸出模式作為概念上的路標(biāo)。JMF 輸入再 JMF 中,一般由一個 MediaLocator 對象來描述一個輸入。如先前規(guī)定的,MediaLocator 的外觀和行為都非常象一個 URL,這樣它可以唯一確定網(wǎng)絡(luò)上的一個資源。事實上,使用一個 URL 來創(chuàng)建一個 MediaLocator 是完全可能的;面的兩個例子中就是這樣做的。為 了的轉(zhuǎn)換例子,需要建立一個 MediaLocator 來描述最初的 WAV文件。如同
32、在后面的章節(jié)中見到的,一個 MediaLocator 也可以用于描述一個網(wǎng)絡(luò)中流。在這個案例中,MediaLocator 會描述的URL很像一個被 URL 指定的在 Web 上的資源,用于取代指定一個本地文件系統(tǒng)的文件來建立 MediaLocator。一個 MediaLocator 和一個 URL 之間的不同要 成功的建立一個 URL 對象,需要適當(dāng)?shù)?.URLStreamHandler 安裝于系統(tǒng)中。這個流處理的用途是能夠處理被 URL 描述的流類 型。一個 MediaLocator對象并沒有這個需要。例如,的下個應(yīng)用程序?qū)⑹褂脤崟r傳輸協(xié)議(RTP)在網(wǎng)絡(luò)上傳輸音頻。由于多數(shù)的系統(tǒng)都未為 R
33、TP 協(xié)議安裝一個 URLStreamHandler,所以創(chuàng)建一個 URL 對象會失敗。在這個應(yīng)用中,只有 MediaLocator 對象會成功。要理解關(guān)于 URL 對象以及創(chuàng)建和一個 URLStreamHandler 的信息,查閱JDK 幫助文檔(查看 23 頁資源)。JMF 處理機(jī)當(dāng)使用 JMF 的時候,應(yīng)用程序的處理機(jī)組件被 Prosor 接口實例描述。你需要已有些熟悉 Prosor,它擴(kuò)展至 Player 接口。由于 Prosor 繼承直sor 增加了Player 接口,它同樣也從 Player 繼承所有可用屬性。另外,Pro兩個屬性:Configuring 和 Configured。
34、這些擴(kuò)展的屬性(和與之關(guān)聯(lián)的方法)用于 Prosor 從輸入流收集信息時的通信。在的最后的例程序中建立一個 Prosor 用于將 MP3 編碼格式的音頻轉(zhuǎn)換成適合在網(wǎng)絡(luò)上的格式。在稍后的板塊中會創(chuàng)建一個簡單的Prosor 的步驟。JMF 輸出有 少許的方法用于描述 JMF 中處理模式的輸出狀態(tài)。最簡單的(并且 最后一個例子中使用的)是 javax.media.DataSink 接口。一個 DataSink在內(nèi)容并且將其傳送到一些目的地。本節(jié)中最開始的音頻格式轉(zhuǎn)換過程中,MP3(輸出)文件將被 DataSink 描述。在最后一 個例子中,使用一個DataSink 在實際上完成網(wǎng)絡(luò)中音頻的工作。一
35、個DataSink 是在Manager類中,由指定一個 DataSource(輸入到 DataSink)和一個 MediaLocator(輸出到 DataSink)完成的。一個 DataSource 實例描述可用于 Players,Prosors 和 DataSinks 的輸入數(shù)據(jù)。一個處理機(jī)的輸出也被描述成一個 DataSource 對象。這就是為什么處理器能彼此聯(lián)系起來,在同一數(shù)據(jù)中完成多種操作。這也是來自 Prosor 的輸出能作為輸入被 Player 或者 DataSink 使用的原因(它可將傳遞到輸出目的地)。一個 DataSink 的最后目的文件由一個 MediaLocator 對
36、象說明。如同前面一樣,MediaLocator 描述一個網(wǎng)絡(luò)資源;這就是流將被傳遞的地方。第五節(jié).接收J(rèn)MF 和實時傳輸協(xié)議(RTP)許 多的友善網(wǎng)絡(luò)的特征直接建立在 JMF 中,這些使為客戶端程序通過網(wǎng)絡(luò)傳輸和接收非常容易。當(dāng)在一個網(wǎng)絡(luò)上的一個用戶想要接收任何種類的流的時候, 它不需要在廣播。在流前等待全部的廣播到機(jī)器上;用戶可以實時的中些提出了這個概念。通過流,一個網(wǎng)絡(luò)客戶端能接收廣播。到其他機(jī)器上 廣播的音頻,甚至獲取正在發(fā)生的實況在 IETF RFC 1889 中定義了實時傳輸協(xié)議(RTP)。發(fā)展在快速和可靠的狀態(tài)下通過網(wǎng)絡(luò)傳輸時間極其敏感的數(shù)據(jù),RTP 在 JMF 中用于提供給用戶向
37、其他網(wǎng)絡(luò)節(jié)點(diǎn)中傳輸 流的方法。在 本節(jié)中,學(xué)習(xí)的最后一個例程序。這里,你將學(xué)習(xí)到如何傳輸一個在一臺機(jī)器上的 MP3 文件到另外的在同一個網(wǎng)絡(luò)的機(jī)器上去。實際的 MP3源文 件并不從主計算機(jī)上移除,它也不使到其他機(jī)器上去;事實上它將會轉(zhuǎn)換成能使用 RTP 傳輸?shù)奈募袷讲⑼ㄟ^網(wǎng)絡(luò)發(fā)送。一旦被一個客戶端接收到,源文件 (現(xiàn)在是 RTP 信息包的形式)可以再次傳輸,這一次是在的一種格式。在 MediaTransmitter.java 文件中源代碼查看學(xué)習(xí)以下練習(xí)。器上可設(shè)置處理模式可以面的章節(jié)中定義的處理模式的基礎(chǔ)下來的最終的例子。在傳輸機(jī)器上,處理模式看起來像這樣:事實上,MediaTransmi
38、tter 對象源代碼包括了以下三行:private private privateMediaLocator mediaLocator = null; DataSink dataSink = null;Prosor mediaProsor = null;這三個實例變量可以直接到前面的處理模式圖表,如下:的處理器;它將負(fù)責(zé)轉(zhuǎn)換音頻文件從 MP3 文件模 mediaProsor 變量是式到一個適合通過 RTP 協(xié)議傳輸?shù)母袷健?dataSink 變量是的輸出塊。 當(dāng)建立 DataSink 時需要指定一個 MediaLocator,它是 DataSink 的目的文件。當(dāng)通過運(yùn)行 DataSink的處理
39、過的,它將傳輸?shù)皆贛ediaLocator 中指定的地點(diǎn)。RTP MediaLocator面的兩個練習(xí)中,實例。 在本練習(xí)中, 出流;換句話說,通過從文件中獲得的一個 URL 建立了 MediaLocator須建立一個 MediaLocator 來描述網(wǎng)絡(luò)上輸須創(chuàng)建一個能的音頻的目的地的MediaLocator。一個 RTP MediaLocator 符合如下規(guī)則,看起來就像一個典型的URL:rtp:/address:port/content-type讓看看上面 URL 規(guī)范的每一段: address 是將傳輸?shù)牡牡刂贰R詥尾サ哪J絺鬏敚ㄒ粋€IP 地址),地址將會是有意接收的機(jī)器的 IP 地址
40、。以廣播的模式(到子網(wǎng)中的所有機(jī)器),地址將會 是以 255 作為最后的一塊的子網(wǎng)地址。舉個例子,如果我再子網(wǎng)中可指定地址為 192.168.1 和想要到子網(wǎng)中的所有節(jié)點(diǎn),我可以指定55 作為地址;這樣允許子網(wǎng)中的每個節(jié)點(diǎn) port 必須是被傳輸者和接收者都允許的一個端口。廣播。 content-type 是下面的一個簡單的 RTP流類型。在的案子中,這個將會是音頻。MediaLocator 例子會讓所有在指定網(wǎng)絡(luò)中的機(jī)器接收到流:rtp:/55:49150/audio創(chuàng)建一個處理機(jī)在 setDataSource()方法中首先要做的就是創(chuàng)建一個 Prosor 實例。下面的 Prosor 的職責(zé)
41、是轉(zhuǎn)換 MP3 音頻為一個 RTP 來表示:public void setDataSource(DataSource ds) throws IOException,NoProsorException, CannotRealizeException, NoDataSinkException mediaProsor =Manager.createRealizedProsor(new ProsorM(ds, FORMATS, CONTENT_DESCRIPTOR);在 Manager 類中,能創(chuàng)建一個 Prosor 對象,通過兩種方法中的一種:createProsor ()或者 createReal
42、izedProsor()。你很可能會注意到這兩個方法樣式的顯示和前面例子中創(chuàng)建一個 Player 的方法很相似。在 目前的例子中,創(chuàng)建一個已實現(xiàn)的 Prosor。這樣做是因為使用的應(yīng)用非常簡單,在 Proso 處于 Realized 狀態(tài)時不需要關(guān)心任何真實的工作。創(chuàng)建一個 ProsorM創(chuàng)建一個已實現(xiàn)的 Prosor,需要創(chuàng)建一個為 Prosor 描述輸入和輸出,需要下面的類型的 Pro一些:sorM實例。為了創(chuàng)建ProsorM一個 DataSource,將被處理的(輸入文件)。一個 javax.media.Format 數(shù)組,描述輸入的格式。一個 tocol.ContentDescript
43、or 實例,為的處理機(jī)描述輸出格式。傳送者的 DataSource 是通過一個參數(shù)傳遞到此方法。定義輸入和輸出格式因 為的 MediaTransmitter 類會被時常用于將輸入格式(MP3)轉(zhuǎn)換成創(chuàng)建一 個新的一種輸出格式(音頻 RTP),中學(xué)對象被定義成靜態(tài)。javax.media.format.AudioFormat 實例用于描述輸入類型(在 java 幫助文檔中查看可用格式)。這就是的處理 機(jī)可以獲取 MP3 音頻文件的原因。也創(chuàng)建一個 tocol.ContentDescriptor 實例來描述想要處理機(jī)輸出的。在的案子中,這是一個 RTP流。這就是為什么的處理機(jī)可以只制造 RTP 流
44、。下面的代碼片斷顯示了如何設(shè)置格式和內(nèi)容描述符變量,用于創(chuàng)建ProsorM對象:ic final Format FORMATS = new Format private snew AudioFormat(AudioFormat.MPEG_RTP);private sic final ContentDescriptor CONTENT_DESCRIPTOR =new ContentDescriptor(ContentDescriptor.RAW_RTP);連接輸入,處理機(jī)和輸出現(xiàn)在有一個處于 Realized 狀態(tài)的 Prosor,需要設(shè)置 DataSink 以能實際上RTP。創(chuàng)建 DataSi
45、nk 是簡單的大概使用另外一個調(diào)用給 Manager對象,如下所示:dataSink = Manager.createDataSink(mediaPro mediaLocator);setDataOutput(),createDataSink ()方法獲取新 Prosor 的輸出(作為一個 DataSource 參數(shù))和 MediaLocator 對象,和 MediaTransmitter 對象同時建立的。通過這樣,你能開始的不同的組件是如何在處理模式中聯(lián)系起來的:從一個Pro Prosor 中獲取輸出并使用他們作為輸入到其他組 件。在這個特殊的應(yīng)用中,sor 輸出用于傳輸?shù)?DataSink
46、 的一個輸入。創(chuàng)建一個 DataSource 實例在這點(diǎn)上,全部都是做和設(shè)置的器的廣播傳輸。需要創(chuàng)建 DataSource 對象,用于創(chuàng)建處理機(jī)(就是,在的MediaTransmitter 中,參數(shù)傳遞到 setDataSource()方法)。下面是創(chuàng)建一個 DataSource 實例的代碼:File mediaFile = new File(args1);DataSourource = Manager.createDataSource(new MediaLocator(mediaFile.toURL();這 段代碼是在 MediaTransmitter 對象中的 vmain()方法。這里通過
47、從命令行輸入的第二個參數(shù)創(chuàng)建一個 File 對象。通過文件創(chuàng)建 一個MediaLocator,而后通過位置創(chuàng)建一個 DataSource。這個新近創(chuàng)建的 DataSource是一個涉及到傳送者的輸入文件。能使 用這個 DataSource 初始化傳輸者。開始和停止 MediaTransmitter通過調(diào)用其中的 startTransmitting()方法來開始 MediaTransmitter,如下所示:public void startTransmitting() throws IOException mediaProsor.start();dataSink.open(); dataSink
48、.start();這個方法首先開啟處理機(jī),然后打開并啟動 DataSink。在這個調(diào)用后,器就可在傳送者上。停止傳輸者是非常簡單的。以下代碼將 DataSink 和 Prosor 都停止和關(guān)閉掉:public void stopTransmitting() throws IOException dataSink.stop();dataSink.close();mediaPro mediaProsor.stop();sor.close();編譯和運(yùn)行 MediaTransmitter通過在命令行中輸入 javac MediaTransmitter.java 來編譯例程序,可在你的工作目錄中生成一
49、個同名的.class 文件。要運(yùn)行例程序,在命令提示行中輸入以下代碼:java MediaTransmitter rtpMediaLocator audioFile此例將創(chuàng)建一個 myAudio.mp3 文件的廣播。記將 rtpMediaLocator替換成一個傳輸?shù)?RTP URL,如同先前的。你同樣也需要將 audioFile 替換成你本機(jī)的音頻文件名。所有的相對文件名都是相對于當(dāng)前工作目錄的。你會看見一些信息標(biāo)志正在的文件。按下 Enter 鍵來停止。為傳送者的一個例命令行交互如下:java MediaTransmitter rtp:/55:49150/audio myAudio.mp3
50、如果初始編輯失敗,確定 JMF 的 jar 文件包含 CLASSPATH 環(huán)境變量中。要近一步探索本程序和練習(xí),請查閱 MediaTransmitter 源代碼。接收傳輸?shù)默F(xiàn)在你可能會問,“如果沒有人可以看或者收聽的話,這個的?”好幸運(yùn)的是,設(shè)定一個接收的客戶端只需要對在第二個例程序的MediaPlayerFrame 源代碼做很小的改動。 MediaPlayerFrame 類需要一個很小的調(diào)節(jié)來接收和法中,你需要注釋掉如下的一行:音頻文件。在 main()方mpf.setMediaLocator(new MediaLocator(new File(args0).toURL();并且輸入如下的一
51、行:mpf.setMediaLocator(new MediaLocator(args0);這個簡單的改動允許通過 String 來創(chuàng)建一個 MediaLocator 對象,而不是通過創(chuàng)建一個 File 來創(chuàng)建 MediaLocator。其他代碼都一樣。指定 RTP URL在 12 頁的說明編譯和運(yùn)行 MediaPlayerFrame 介紹了如何編譯和運(yùn)行 MediaPlayerFrame 例程序。這唯一的不同就是你需要為傳輸者指定 RTP URL。為接收者的例命令行交互如下:java MediaPlayerFrame rtp:/55:49150/audio運(yùn)行網(wǎng)絡(luò)傳送者的注意事項如果你在網(wǎng)絡(luò)
52、上只使用一臺機(jī)器,你仍然可以運(yùn)行傳輸程序。當(dāng)你啟動傳送程序的時候,你可以即使用 RTP URL 傳輸?shù)刂?,也可指定你工作的機(jī)器的機(jī)器地址。為了能夠調(diào)節(jié)傳輸,在開始前接收者必須使用精確的同樣的 RTP URL。如果你運(yùn)行本例真實的網(wǎng)絡(luò)版本,每臺你使用的機(jī)器都需要安裝 JMF,不論是傳輸還是接收流。這是必須的,因為不論是傳送程序還是接收程序都大量的使用了 JMF 的 API。在任一個案子中,確認(rèn)在指定的 RTP URL 中使用了相同的地址和端口;否則傳輸是不會工作的。第六節(jié). 約束和資源摘要我希望本指南能給你提供如何使用 JMF 的 API 的有用的瀏覽。建立了三個小的應(yīng)用程序來本地的音頻和,也通
53、過網(wǎng)絡(luò)和接收。這些應(yīng)用程序的源代碼中包含了很多的 javadoc 樣式的注釋。這就有助于你理解你剩余許多 JMF 的。在本指南中并沒有涉及。實際上,更關(guān)注 JMF 的基本概念和應(yīng)用;在此基礎(chǔ)上,能輕易地擴(kuò)展學(xué)習(xí)的其他范圍。要更深入 JMF 的應(yīng)用程序,你可能想要學(xué)習(xí)下面的面板中所提到的題,查閱 23 頁的資源。更近一步的閱讀本指南中的主高級大量的值得做的練本指南的范圍之上。在簡單的說明之下自己更進(jìn)一步的學(xué)習(xí),你可以擴(kuò)展的練習(xí)開始:的應(yīng)用程序代碼,也可以反展你的 JMF 相關(guān)知識。使用以下捕獲:JMF 包含了豐富的 API 來捕獲數(shù)據(jù)。如果你對使用 JMF 捕獲感,你可以使用 javax.media.CaptureDeviceManager 類和tocol.CaptureDevice 接口的 API 來學(xué)習(xí)。對于一個高級的練習(xí),考慮使用 CaptureDeviceManager 和 CaptureDevice 接口來增加捕獲功能到應(yīng) 用程序的 GUI 版本上。 會話管理:由于本指南是一個 JMF 的說明,僅實現(xiàn)了 javax.media.DataSink 輸出。另 外的輸出表示是使用 javax.media.rtp.Ses戶端創(chuàng)建并監(jiān)視他們的 RTP 流和連接。通過 Ses使輸出表現(xiàn)非常的簡單,僅Manager。這個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年新能源投資合作框架協(xié)議3篇
- 2024商鋪?zhàn)赓U協(xié)議書:綠色家居建材市場租賃范本3篇
- 2024年度工業(yè)自動化設(shè)備配件集成采購合同范本3篇
- 2024年二零二四年度新型外墻裝飾材料研發(fā)與應(yīng)用合同3篇
- 2024年智能硬件設(shè)備研發(fā)與制造合同
- 2024夏令營親子互動游戲開發(fā)與實施合同正規(guī)范本3篇
- 2024年度駕駛員健康保障與福利聘用勞動合同3篇
- 2024年暴雨應(yīng)急預(yù)案(30篇)
- 《汽安展廣州站總結(jié)》課件
- 預(yù)防電子郵件詐騙:保護(hù)個人信息的重要性
- GB/T 44328-2024七氟異丁腈
- 生態(tài)環(huán)境保護(hù)課件
- 戶外徒步活動策劃方案(共5篇)
- 2021-SoulX自然堂品牌合作結(jié)案
- DBJ15 31-2016建筑地基基礎(chǔ)設(shè)計規(guī)范(廣東省標(biāo)準(zhǔn))
- 我國商業(yè)銀行中間業(yè)務(wù)的發(fā)展現(xiàn)狀、存在問題及對策研究-以中國建設(shè)銀行為例
- DL∕ T 736-2010 農(nóng)村電網(wǎng)剩余電流動作保護(hù)器安裝運(yùn)行規(guī)程
- 滬教版七年級數(shù)學(xué)上冊期末試卷01(原卷版+解析)
- 籃球場建設(shè)合同協(xié)議
- 2024-2030年中國機(jī)械密封行業(yè)市場運(yùn)營現(xiàn)狀及投資規(guī)劃研究建議報告
- 勞動教育國內(nèi)外研究現(xiàn)狀綜述
評論
0/150
提交評論