久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Java Media Framework 基礎(chǔ)教程

瀏覽:145日期:2024-06-13 13:36:00
內(nèi)容: Java媒體架構(gòu)基礎(chǔ)developerWorks出版,你主要資源的來源ibm.com/developerWorks作者:Eric Olson;pawenwen版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明作者:Eric Olson;pawenwen地址:http://www.matrix.org.cn/resource/article/43/43883_JMF.html關(guān)鍵詞: Java Media Framework內(nèi)容表格1. 關(guān)于此指南2. 一個(gè)簡單的音頻播放器3. JMF用戶接口組件4. JMF概念5. 傳播和接收媒體6. 總結(jié)以及資源第一節(jié). 關(guān)于此指南此指南包含的內(nèi)容?Java媒體架構(gòu)(JMF)是一個(gè)令人激動(dòng)的通用的API,它允許Java開發(fā)者用許多不同的方法處理媒體。本指南主要通過使用工作的例子提供一個(gè)JMF的一些主要的特征的概述。閱讀完本指南后,你將會(huì)明白JMF體系結(jié)構(gòu)中的主要播放功能。你同樣能正確的使用JMF,使用現(xiàn)存的例子和可為更多特殊功能擴(kuò)展的源代碼。本指南包含著以下主題:· 下載和安裝JMF· 主要的JMF類以及它們在JMF體系結(jié)構(gòu)中的應(yīng)用· 播放本地的媒體文件· 為媒體的存取和操作制作以和圖形用戶界面(GUI)· 通過網(wǎng)絡(luò)傳播媒體· 通過網(wǎng)絡(luò)接收媒體幾乎所有的媒體類型的操作和處理都可以通過JMF來實(shí)現(xiàn)。全面的討論JMF所提供的所有特征已經(jīng)超過了本指南的范圍,我們將使用三個(gè)簡單的媒體應(yīng)用程序來學(xué)習(xí)此框架的構(gòu)建模塊。通過這個(gè)方法,本指南將為你未來學(xué)習(xí)和實(shí)施更多特殊的應(yīng)用提供準(zhǔn)備。我應(yīng)該使用此指南嗎?本指南會(huì)帶你學(xué)習(xí)使用JMF工作的基礎(chǔ)。為完成這些,我們會(huì)創(chuàng)建三個(gè)的獨(dú)立工作的例程序。每個(gè)例子都會(huì)建立前一個(gè)例子的基礎(chǔ)上,顯示JMF功能性的不同方面。在本指南中的例子假定你曾經(jīng)使用過并且已經(jīng)熟悉了Java程序語言。除了Java核心和JMF的類之外,我們會(huì)使用一些Java AWT和Swing類(用于創(chuàng)建GUI),也會(huì)有一些Java網(wǎng)絡(luò)類(用于在網(wǎng)絡(luò)中傳輸媒體)。對GUI和網(wǎng)絡(luò)類一些熟悉有助于你更快的明白觀點(diǎn)和這里的例子,但并非是閱讀本指南必須的。我們將學(xué)習(xí)的例程序如下· 一個(gè)簡單的音頻播放器(JMF的HelloWorld應(yīng)用):這個(gè)字符界面的播放器通過在命令行中簡單的輸入媒體文件的名字就可以播放大多數(shù)的音頻類型。此音頻播放器的演示大體上顯示了JMF的特有的類。· 一個(gè)圖形界面的媒體播放器:我們將使用JMF內(nèi)置的接口組件來建立圖形界面,所以在此練習(xí)中必須有一些圖形界面的編程經(jīng)驗(yàn)。這個(gè)媒體閱覽器演示使用了一些Java AWT和Swing類來為用戶顯示圖形組件。· 一個(gè)媒體廣播應(yīng)用:此應(yīng)用程序允許一個(gè)本地媒體文件通過網(wǎng)絡(luò)傳播。此程序能靈活的使媒體只傳輸?shù)街付ǖ木W(wǎng)絡(luò)節(jié)點(diǎn),或者傳輸?shù)揭粋€(gè)子網(wǎng)絡(luò)中的所有節(jié)點(diǎn)。此演示使用了一些Java的網(wǎng)絡(luò)APIs來在網(wǎng)絡(luò)中傳輸媒體。作為第三個(gè)練習(xí)的一部分,我們將修改圖形界面的播放器,讓其能接收并且播放媒體。跳至23頁觀看Resources,文章,指南,和其他參考書目的列表,這會(huì)幫助你學(xué)習(xí)到更到關(guān)于此指南包括的主題。安裝需求要運(yùn)行此指南中的例程序,你需要如下的工具和組件:· Java 2 平臺,標(biāo)準(zhǔn)版,編譯和運(yùn)行演示程序· Java媒體框架,版本2.1.1a或者更高· 一塊已經(jīng)安裝并且配置號的適當(dāng)?shù)穆暱?middot; 一臺或者多臺測試機(jī)器· 演示的源代碼文件在mediaplayer.jar中最后的一個(gè)演示應(yīng)用顯示了JMF在網(wǎng)絡(luò)中的應(yīng)用。如果需要,此演示能運(yùn)行在一個(gè)獨(dú)立的機(jī)器上,使用此機(jī)器即是傳輸方也是接收方。可是要觀察到在網(wǎng)絡(luò)中使用JMF的所有功能,你仍然需要至少兩臺聯(lián)網(wǎng)的機(jī)器。在23頁中的Resources可下載Java 2平臺,完整的源代碼文件,以及其他一些完成本指南所需要的工具。下載安裝文件將JMF安裝到你的計(jì)算機(jī)中的第一步是在JMF的主頁中下載安裝文件,它同樣包括了JMF源代碼和API文檔的鏈接。23頁的Resources中有下載JMF的鏈接。目前,JMF有Windows, Solaris, Linux等版本,以及可運(yùn)行在任何裝有虛擬機(jī)的計(jì)算機(jī)上一個(gè)純Java版本。為了增加性能,你需要下載一個(gè)與你操作系統(tǒng)所適應(yīng)的版本。任何在一個(gè)操作系統(tǒng)JMF版本下書寫和編譯的代碼都可以方便的移植到另外的操作系統(tǒng)上。例如,如果你下載了一個(gè)Solaris版本的JMF并且編譯了一個(gè)類,這些類就可以在Linux上使用,不會(huì)有任何問題。作為選擇,你可以選擇下載純Java版本,或者跨平臺版本的JMF。這些版本沒有使用操作系統(tǒng)特有的庫文件。如果沒有合適的JMF版本適合的操作系統(tǒng),那么跨平臺版本就是一個(gè)不錯(cuò)的選擇。安裝JMF下載完JMF安裝程序后,雙擊安裝程序的圖標(biāo)。大部分安裝程序都會(huì)有個(gè)選項(xiàng),安裝本地庫到系統(tǒng)目錄中;例如,Windows版本安裝程序會(huì)有一個(gè)選項(xiàng)“Move DLLs to Windows/System directory.。最好將此選項(xiàng)選中,因?yàn)樗艽_保這些操作系統(tǒng)的庫文件能正確的安裝在安裝的過程中,你還需要選擇項(xiàng)目來更新系統(tǒng)的CLASSPATH和PATH變量。如果這些選項(xiàng)被關(guān)閉,那么在你編譯和運(yùn)行本指南的例程序的時(shí)候就需要在classpath中引入JMF的jar文件。關(guān)于作者Eric Olson在Retek Inc工作的軟件工程師。它在Java平臺上有四年的工作經(jīng)驗(yàn),并且在不同的基于Java的技術(shù)上富有經(jīng)驗(yàn),包括JMF, Jini, Jiro, JSP, servlets, and EJBs。Eric畢業(yè)于St. Paul, MN的St. Thomas大學(xué),獲得計(jì)算機(jī)科學(xué)的學(xué)位。他在IBM的SanFrancisco項(xiàng)目組工作,負(fù)責(zé)WebSphere商業(yè)組件。他同時(shí)再為Imation Corp.工作,負(fù)責(zé)存儲(chǔ)應(yīng)用。現(xiàn)在,他正在開發(fā)零售行業(yè)的基于web的軟件解決方案。再業(yè)余的時(shí)間,Eric和PaulMonday在Stereo Beacon上合作—一個(gè)分布式的點(diǎn)對點(diǎn)的基于JMF的媒體播放器。聯(lián)系Eric zpalffy@yahoo.com.第二節(jié). 一個(gè)簡單的音頻播放器瀏覽在本節(jié)中,我們將進(jìn)行創(chuàng)建一個(gè)簡單的音頻播放器的第一個(gè)練習(xí)。本例將介紹Manager類和Player接口,中兩個(gè)都是建立大多數(shù)基于JMF應(yīng)用的重要部分。本例的功能目標(biāo)是在字符界面下播放本地的音頻文件。我們將學(xué)習(xí)此源代碼,并了解每一行所做的任務(wù)。完成本節(jié)后,你將會(huì)有一個(gè)基于JMF的可播放包括MP3, WAV, AU等多種音頻文件的演示程序。在本練習(xí)后的源代碼分類種可查詢文件SimpleAudioPlayer.java。引入必要的類SimpleAudioPlayer類中包括了一些調(diào)用,在其前幾行中需要引入所有必要的類:import javax.media.*;import java.io.File;import java.io.IOException;import java.net.URL;import java.net.MalformedURLException;The javax.media包是由JMF定義的多個(gè)包之一。javax.media是一個(gè)核心包,包括了定義Manager類和Player接口等。本節(jié)中,我們主要學(xué)習(xí)Manager類和Player接口,其余的javax.media類放在后面的章節(jié)中。除了引入javax.media聲明外,以上的代碼片斷引入了一些創(chuàng)建媒體播放器的輸入的聲明。Player接口在下面的代碼片斷中,創(chuàng)建一個(gè)公共類SimpleAudioPlayer并舉例定義一個(gè)Player變量:public class SimpleAudioPlayer {private Player audioPlayer = null;術(shù)語Player聽起來由點(diǎn)熟悉,因?yàn)樗墙⒃谖覀児玫囊纛l或者視頻播放器的基礎(chǔ)上的。事實(shí)上,這個(gè)接口的例子就像是當(dāng)作它們的真實(shí)的副本。Players揭示了一個(gè)實(shí)體上的媒體播放器(如立體音箱系統(tǒng)或者VCR)涉及到功能上的方法。例如,一個(gè)JMF媒體播放器可以開始和結(jié)束一個(gè)媒體流。在本節(jié)種,我們將使用Player的開始和結(jié)束功能。在一個(gè)文件上創(chuàng)建一個(gè)Player使用JMF獲得一個(gè)特定媒體文件的Player實(shí)例非常簡單。Manager類在JMF中如同一個(gè)工廠制作許多的特殊接口類型,包括Player接口。因此,Manager類的責(zé)任就是創(chuàng)建Player實(shí)例,如下例:public SimpleAudioPlayer(URL url) throws IOException,NoPlayerException,CannotRealizeException {audioPlayer = Manager.createRealizedPlayer(url);}public SimpleAudioPlayer(File file) throws IOException,NoPlayerException,CannotRealizeException {this(file.toURL());}如果你看完本節(jié)的代碼,你可以注意到Manager類包含了創(chuàng)建一個(gè)Player實(shí)例的其他方法。我們會(huì)研究其中的一些,如在后面的章節(jié)中的DataSource或者M(jìn)ediaLocator的實(shí)例化。Player的狀態(tài)JMF定義了大量的一個(gè)Player實(shí)例可能存在的不同狀態(tài)。如下:· Prefetched· Prefetching· Realized· Realizing· Started· Unrealized使用這些狀態(tài)因?yàn)槭褂妹襟w常常是資源非常密集的,由JMF對象揭示的許多方法都是不閉塞的,允許一系列事件監(jiān)聽的狀態(tài)改變的異步通知。例如,一個(gè)Player在它可以啟動(dòng)之前,必須經(jīng)過Prefetched和Realized狀態(tài)。由于這些狀態(tài)的改變都需要一些時(shí)間來完成,JMF媒體應(yīng)用可以分配一個(gè)線程來初始化創(chuàng)建Player實(shí)例,然后再繼續(xù)其他的操作。當(dāng)Player準(zhǔn)備就緒的時(shí)候,它會(huì)通知應(yīng)用程序其狀態(tài)已經(jīng)改變。在一個(gè)如同我們的這樣簡單的程序中,多功能性的類型并不是很重要。處于這個(gè)原因,Manager類也提供了一些創(chuàng)建Realized player的有用方法。調(diào)用一個(gè)createRealizedPlayer()方法來阻塞調(diào)用線程,直到player達(dá)到Realized狀態(tài)。為了調(diào)用一個(gè)無阻塞的創(chuàng)建player的方法,我們在Manager類中使用了一個(gè)createPlayer()方法。下面的一行代碼中創(chuàng)建了一個(gè)我們需要在例程序中使用的Realized player:audioPlayer = Manager.createRealizedPlayer(url);啟動(dòng)和停止Player設(shè)定一個(gè)Player實(shí)例的啟動(dòng)或是停止就如同調(diào)用Player的一個(gè)簡單的認(rèn)證方法,如下所示:public void play() {audioPlayer.start();}public void stop() {audioPlayer.stop();audioPlayer.close();}調(diào)用SimpleAudioPlayer類中的play()方法來實(shí)現(xiàn)調(diào)用Player實(shí)例的start()方法。調(diào)用此方法后,你能聽到本地的喇叭的聲音文件。同樣的,stop()方法使player停止并且關(guān)閉掉Player對象。對于讀取和或者播放本地媒體文件來說,關(guān)閉Player實(shí)例釋放所有資源是一個(gè)有用的方法。因?yàn)檫@是一個(gè)簡單的例子,關(guān)閉Player是終止一個(gè)會(huì)話可接受的方法。但是在實(shí)際的應(yīng)用中,你需要小心的確認(rèn)在除掉Player之前必須要關(guān)閉掉。一但你已經(jīng)關(guān)閉掉player,在再次播放一個(gè)媒體之前你必須要?jiǎng)?chuàng)建一個(gè)新的Player實(shí)例(等待它的狀態(tài)改變)。建立一個(gè)SimpleAudioPlayer最后,這個(gè)媒體播放應(yīng)用程序要包含一個(gè)可以從命令提示行中輸入命令而調(diào)用的main()方法。在此main()方法中,我們將調(diào)用創(chuàng)建SimpleAudioPlayer的方法:File audioFile = new File(args[0]);SimpleAudioPlayer player = new SimpleAudioPlayer(audioFile);在播放音頻文件之前的唯一的一些事情就是調(diào)用已經(jīng)創(chuàng)建的音頻player的方法play(),如下所示:player.play();要停止和清除掉音頻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替換成你本地機(jī)器上的音頻文件。所有的相對文件名都試相對于當(dāng)前的工作目錄。你會(huì)看到一些當(dāng)前正在播放文件的標(biāo)志信息。要終止播放,按下回車鍵。如果編譯失敗,確認(rèn)JMF的jar文件已經(jīng)正確的包含在CLASSPATH環(huán)境變量中。第三節(jié). JMF用戶界面組件播放視頻在前一節(jié)中,我們學(xué)習(xí)了建立一個(gè)通過字符界面播放音頻文件的應(yīng)用程序。JMF中一個(gè)最重要的特點(diǎn)就是你不需要為了配置媒體播放器而去了解媒體文件的格式;一切都內(nèi)置了。舉一個(gè)例子,再我們前面的例子中,需要使用MP3格式的時(shí)候,我們不需要讓應(yīng)用程序?yàn)橐粋€(gè)MP3文件建立一個(gè)特殊的Player。如同你將會(huì)再本節(jié)所見到的,對于視頻文件的操作同樣有效。JMF有所有媒體文件類型接口的詳細(xì)資料。處理視頻媒體與音頻最大的不同就是,我們必須建立一個(gè)能播放視頻的顯示屏幕。幸運(yùn)的是,JMF能處理許多的這些資料。如同再上例一樣我們會(huì)建立一個(gè)Player對象,并且使用很多的可視組件來直接從JMF對象中創(chuàng)建我們的可視的媒體瀏覽器。本節(jié)中,我們將學(xué)習(xí)兩個(gè)例程序。In this section, we'll walk through the second example application. 請?jiān)俸竺娴木毩?xí)的源代碼分布中查閱MediaPlayerFrame.java。關(guān)于例子在本節(jié)中,我們將創(chuàng)建一個(gè)能顯示和運(yùn)行本地音頻和視頻媒體的應(yīng)用程序。作為練習(xí)的一部分,我們將研究JMF內(nèi)置的一些GUI組件。熟悉AWT和Swing將有助于你理解本例,但這并不是必須的。除非需要直接涉及到JMF的GUI組件,或者我們是不會(huì)詳細(xì)介紹源代碼的。你可以在源代碼的注釋中找到這里未涉及的詳細(xì)說明。本例中我們使用的許多概念,類和方法都和第一個(gè)例子的類似。建立Player的基本操作大都一樣。最大的不同就是我們需要對Player對象專研更深一點(diǎn),特別當(dāng)需要從Player獲取媒體信息的時(shí)候。如何開始視頻播放器例子被設(shè)計(jì)得如同音頻播放例子一樣通過命令行來運(yùn)行,但是本例需要建立在GUI基礎(chǔ)上。如同在上節(jié)一樣,我們先通過媒體文件名調(diào)用應(yīng)用。然后,應(yīng)用程序顯示一個(gè)帶有可操作媒體組件的窗體。在MediaPlayerFrame開始的一行中我們定義了類并擴(kuò)展自,javax.swing.Jframe類。這就是使媒體播放器如同一個(gè)在桌面上的單獨(dú)窗體的方法。任何客戶機(jī)程序創(chuàng)建了本媒體播放對象后都可以通過調(diào)用Jframe類中定義的show()方法來顯示。下面是一個(gè)MediaPlayerFrame正在播放MPEG電影的屏幕截圖:獲取GUI組件Player界面有一些方法來獲取已選擇可視組件的涉及。在MediaPlayerFrame中,我們使用如下組件:· player.getVisualComponent()是一個(gè)播放所有視頻媒體的可視組件。· player.getControlPanelComponent() 是一個(gè)操作時(shí)間軸的可視組件(包括開始,停止,回放),也包含了一些媒體流的有用信息。· player.getGainControl().getControlComponent() 是操作音量(增加)的可視組件。getGainControl()方法返回一個(gè)GainControl實(shí)例,可用于改變節(jié)目的增加等級。使用可視化組件上面的界面方法都返回一個(gè)java.awt.Component類的實(shí)例。沒個(gè)實(shí)例都視可加載到我們窗體上的可視組件。這些組件都與Player有直接的聯(lián)系,所以在這些組件上的所有可視元素的處理都會(huì)產(chǎn)生Player播放媒體后相應(yīng)的變化。在我們將這些組件加入到我們的窗體的之前,必須要保證它們不為空。因?yàn)椴⒉皇撬械拿襟w播放器包括每一種可視組件,我們只需添加相關(guān)播放器類型的組件。比如,一般來說一個(gè)音頻播放器沒有可視組件,所以getVisualComponent()就要返回空。你不會(huì)想在音頻播放器窗體上添加可視組件的。獲得媒體的特殊控制一個(gè)Player實(shí)例也可以通過getControl()和getControls()方法來暴露其控制,getControls()返回一個(gè)控制對象集,而getControl()返回一個(gè)控制。不同的播放器類型可選擇為特殊的操作來暴露控制集去指定的媒體類型,或者用于獲取該媒體的傳輸機(jī)制。如果你在寫一個(gè)只支持某些媒體類型的播放器,你需要依靠某些在Player實(shí)例中可用Control對象。由于我們的播放器是非常抽象的,被設(shè)計(jì)于播放多種不同媒體類型,我們簡單的為用戶暴露所有的Control對象。如果找到任何擴(kuò)展的控制集,我們就可使用getControlComponent()方法來增加相應(yīng)的可視控件到標(biāo)簽面板上。通過這個(gè)辦法,用戶就可以觀察播放器上的所有組件。以下代碼片斷將所有的控制對象暴露給用戶:Control[] controls = player.getControls();for (int i = 0; i < controls.length; i++) {if (controls[i].getControlComponent() != null) {tabPane.add(controls[i].getControlComponent());}}為了使一個(gè)真實(shí)的應(yīng)用程序能用Control實(shí)例做一些有用的事(除了能顯示可視組件之外),應(yīng)用程序需要知道該Control的特殊類型,并分配它。此后,應(yīng)用程序就可使用這些control來控制媒體節(jié)目了。例如,如果你知道你經(jīng)常使用的媒體暴露javax.media.control.QualityControl類型的Control,你能使用QualityControl界面,之后在QualityControl界面上通過調(diào)用各種方法來改變性質(zhì)設(shè)定。使用一個(gè)MediaLocator在我們新的基于GUI的媒體播放器和我們的第一個(gè)簡單播放器之間最大的不同就是,我們使用一個(gè)MediaLocator對象而不是URL來創(chuàng)建Player實(shí)例,如下所示:public void setMediaLocator(MediaLocator locator) throws IOException,NoPlayerException, CannotRealizeException {setPlayer(Manager.createRealizedPlayer(locator));}我們將在稍后的章節(jié)中討論這個(gè)變化的原因。目前,在網(wǎng)絡(luò)上資源站點(diǎn)上,關(guān)于MediaLocator對象和URL的描述被認(rèn)為是非常相似的。事實(shí)上,你可以從一個(gè)URL創(chuàng)建一個(gè)MediaLocator,也可以從MediaLocator獲取到URL。我們的新媒體播放器一個(gè)URL中創(chuàng)建一個(gè)MediaLocator,并使用該MediaLocator通過文件創(chuàng)建了一個(gè)Player。編譯和運(yùn)行MediaPlayerFrame通過在命令提示行輸入javac MediaPlayerFrame.java來編譯例程序。在工作目錄下將創(chuàng)建一個(gè)名為MediaPlayerFrame.class的文件。在命令提示行中鍵入如下來運(yùn)行例程序:java MediaPlayerFrame mediaFile你需要用你本機(jī)上的一個(gè)媒體文件來替換掉mediaFile(音頻或者視頻文件都可以)。所有的相對文件名都是相對于當(dāng)前工作目錄。你會(huì)看見一個(gè)顯示控制媒體文件的GUI控制集的窗口。欲了解JMF支持的音頻和視頻文件列表,在23頁的資源。如果初始編譯時(shí)失敗,請確認(rèn)JMF的jar文件已經(jīng)包含在當(dāng)前的CLASSPATH環(huán)境變量中。MediaPlayerFrame在行動(dòng)在本節(jié)前你看見的一個(gè)視頻播放器正在播放MPEG視頻文件的屏幕截圖。下面的屏幕截圖顯示了一個(gè)音頻播放器正在播放一個(gè)MP3文件:要更多的學(xué)習(xí)本練習(xí)中的例子,查看完成的MediaPlayerFrame源代碼。第四節(jié). JMF概念JMF體系結(jié)構(gòu)你曾見過了使用JMF播放本地媒體文件是多么的容易,現(xiàn)在我們將后退一步,來看看一幅是如何通過JMF創(chuàng)建了如此成熟的基于媒體的應(yīng)用程序的大的畫面,是如何通過JMF創(chuàng)建了如此成熟的基于媒體的應(yīng)用程序。全面的了解JMF體系結(jié)構(gòu)是沒有意義的,本節(jié)將給你一個(gè)大體的概念,關(guān)于高級的JMF組件是如何組合起來創(chuàng)建想得到的東西。JMF的組件結(jié)構(gòu)非常的靈活,它的組件一般可以分成三個(gè)部分:· Input描述某種被用于在進(jìn)程休息的時(shí)候作為一個(gè)輸入的媒體。· process執(zhí)行某些輸入上的活動(dòng)。一個(gè)過程有一個(gè)明確的輸入和輸出。大量的過程可用, 能被用于一個(gè)輸入或者一批輸入。這些過程能被聯(lián)系起來,一個(gè)過程的輸出被用于另外一個(gè)過程的輸入。在這種風(fēng)格中,大量的過程可能被應(yīng)用于一個(gè)輸入。(這段期間是可選擇的——我們開始的兩個(gè)例子沒有包含真正的數(shù)據(jù)過程,只有一個(gè)來自文件的輸入和一個(gè)通過Player的輸出。)· Output 描述了媒體的某些目的地。從這些描述中,你可以想象到JMF組件體系結(jié)構(gòu)聽起來就好像在一個(gè)典型的立體聲系統(tǒng)或者VCR之后。很容易設(shè)想到,使用JMF就如同打開電視或者在立體聲音箱系統(tǒng)下調(diào)節(jié)聲音的風(fēng)格。例如,錄制喜愛的電視節(jié)目的簡單的動(dòng)作能在這些組件的基礎(chǔ)中:· Input 是電視廣播流,在同一個(gè)頻道運(yùn)輸音頻和視頻。· Process 是一個(gè)記錄設(shè)備(就是,一個(gè)VCR或者許多的數(shù)字設(shè)備)轉(zhuǎn)換模擬或者數(shù)字音頻視頻廣播流成適合復(fù)制到磁帶或其他媒體上的格式。· Output 是記錄已格式化軌跡(音頻和視頻)到某些類型的媒體上。JMF資料處理模式以下圖片說明了JMF數(shù)據(jù)處理模塊并對每個(gè)類型給出了例子:使用此模式,很容易明白我們前面的兩個(gè)例子,從文件中輸入音頻和視頻并輸出到本地計(jì)算機(jī)上。在后面的章節(jié)中,我們也會(huì)談?wù)撘恍┩ㄟ^傳播和接收音頻媒體的JMF網(wǎng)絡(luò)功能。處理模型例子將JMF的輸入,處理和輸出模式聯(lián)系起來,我們能開始想象許多基于媒體的操作都可能通過JMF完成。一個(gè)例子,轉(zhuǎn)換一種媒體類型為其他類型并將其輸出存儲(chǔ)到一個(gè)新的文件。舉一個(gè)例子,我們想要在不損壞原始文件的前提下轉(zhuǎn)化一個(gè)WAV格式的音頻文件為MP3格式。以下的過程模式插圖,就是我們將開始執(zhí)行轉(zhuǎn)換的步驟:本例的輸入是一個(gè)WAV文件。它被一個(gè)媒體格式轉(zhuǎn)換工具加工,并輸出到一個(gè)新的文件。現(xiàn)在,讓我們看看JMF API中的這個(gè)模式的每一步。我們使用輸入,處理和輸出模式作為概念上的路標(biāo)。JMF輸入再JMF中,一般由一個(gè)MediaLocator對象來描述一個(gè)輸入。如先前規(guī)定的,MediaLocator的外觀和行為都非常象一個(gè)URL,這樣它可以唯一確定網(wǎng)絡(luò)上的一個(gè)資源。事實(shí)上,使用一個(gè)URL來創(chuàng)建一個(gè)MediaLocator是完全可能的;我們在前面的兩個(gè)例子中就是這樣做的。為了我們的媒體轉(zhuǎn)換例子,我們需要建立一個(gè)MediaLocator來描述最初的WAV文件。如同我們將在后面的章節(jié)中見到的,一個(gè)MediaLocator也可以用于描述一個(gè)跨越網(wǎng)絡(luò)中媒體流。在這個(gè)案例中,MediaLocator會(huì)描述傳播的URL――很像一個(gè)被URL指定的在Web上的資源,用于取代指定一個(gè)本地文件系統(tǒng)的文件來建立MediaLocator。一個(gè)MediaLocator和一個(gè)URL之間的不同要成功的建立一個(gè)URL對象,需要適當(dāng)?shù)膉ava.net.URLStreamHandler安裝于系統(tǒng)中。這個(gè)流處理的用途是能夠處理被URL描述的流類型。一個(gè)MediaLocator對象并沒有這個(gè)需要。例如,我們的下個(gè)應(yīng)用程序?qū)⑹褂脤?shí)時(shí)傳輸協(xié)議(RTP)在網(wǎng)絡(luò)上傳輸音頻。由于多數(shù)的系統(tǒng)都未為RTP協(xié)議安裝一個(gè)URLStreamHandler,所以創(chuàng)建一個(gè)URL對象會(huì)失敗。在這個(gè)應(yīng)用中,只有MediaLocator對象會(huì)成功。要理解更多關(guān)于URL對象以及創(chuàng)建和注冊一個(gè)URLStreamHandler的信息,查閱JDK幫助文檔(查看23頁資源)。JMF處理機(jī)當(dāng)我們使用JMF的時(shí)候,應(yīng)用程序的處理機(jī)組件被Processor接口實(shí)例描述。你需要已有些熟悉Processor,它擴(kuò)展至Player接口。由于Processor繼承直Player接口,它同樣也從Player繼承所有可用屬性。另外,Processor增加了兩個(gè)屬性:Configuring和Configured。這些擴(kuò)展的屬性(和與之關(guān)聯(lián)的方法)用于Processor從輸入流收集信息時(shí)的通信。在我們的最后的例程序中,我們將建立一個(gè)Processor用于將MP3編碼格式的音頻轉(zhuǎn)換成適合在網(wǎng)絡(luò)上傳播的格式。在稍后的板塊中我們會(huì)討論創(chuàng)建一個(gè)簡單的Processor的步驟。JMF輸出有少許的方法用于描述JMF中處理模式的輸出狀態(tài)。最簡單的(并且我們將在最后一個(gè)例子中使用的)是javax.media.DataSink接口。一個(gè)DataSink讀取媒體內(nèi)容并且將其傳送到一些目的地。本節(jié)中最開始的音頻格式轉(zhuǎn)換過程中,MP3(輸出)文件將被DataSink描述。在我們最后一個(gè)例子中,我們將使用一個(gè)DataSink在實(shí)際上完成網(wǎng)絡(luò)中傳播音頻媒體的工作。一個(gè)DataSink是在Manager類中,由指定一個(gè)DataSource(輸入到DataSink)和一個(gè)MediaLocator(輸出到DataSink)完成的。一個(gè)DataSource實(shí)例描述可用于Players,Processors和DataSinks的輸入數(shù)據(jù)。一個(gè)處理機(jī)的輸出也被描述成一個(gè)DataSource對象。這就是為什么處理器能彼此聯(lián)系起來,在同一媒體數(shù)據(jù)中完成多種操作。這也是來自Processor的輸出能作為輸入被Player或者DataSink使用的原因(它可將媒體傳遞到輸出目的地)。一個(gè)DataSink的最后目的文件由一個(gè)MediaLocator對象說明。如同前面一樣,MediaLocator描述一個(gè)網(wǎng)絡(luò)資源;這就是媒體流將被傳遞的地方。第五節(jié).傳播接收媒體JMF和實(shí)時(shí)傳輸協(xié)議(RTP)許多的友善網(wǎng)絡(luò)的特征直接建立在JMF中,這些使為客戶端程序通過網(wǎng)絡(luò)傳輸和接收媒體非常容易。當(dāng)在一個(gè)網(wǎng)絡(luò)上的一個(gè)用戶想要接收任何種類的媒體流的時(shí)候,它不需要在觀看媒體前等待全部的廣播下載到機(jī)器上;用戶可以實(shí)時(shí)的觀看廣播。在流媒體中些提出了這個(gè)概念。通過流媒體,一個(gè)網(wǎng)絡(luò)客戶端能接收到其他機(jī)器上廣播的音頻,甚至獲取正在發(fā)生的實(shí)況視頻廣播。在IETF RFC 1889中定義了實(shí)時(shí)傳輸協(xié)議(RTP)。發(fā)展在快速和可靠的狀態(tài)下通過網(wǎng)絡(luò)傳輸時(shí)間極其敏感的數(shù)據(jù),RTP在JMF中用于提供給用戶向其他網(wǎng)絡(luò)節(jié)點(diǎn)中傳輸媒體流的方法。在本節(jié)中,我們將學(xué)習(xí)我們的最后一個(gè)例程序。這里,你將學(xué)習(xí)到如何傳輸一個(gè)存儲(chǔ)在一臺機(jī)器上的MP3文件到另外的在同一個(gè)網(wǎng)絡(luò)的機(jī)器上去。實(shí)際的MP3源文件并不從主計(jì)算機(jī)上移除,它也不使復(fù)制到其他機(jī)器上去;事實(shí)上它將會(huì)轉(zhuǎn)換成能使用RTP傳輸?shù)奈募袷讲⑼ㄟ^網(wǎng)絡(luò)發(fā)送。一旦被一個(gè)客戶端接收到,源文件(現(xiàn)在是RTP信息包的形式)可以再次傳輸,這一次是在接收機(jī)器上可播放的一種格式。在MediaTransmitter.java文件中源代碼查看學(xué)習(xí)以下練習(xí)。設(shè)置處理模式我們可以在前面的章節(jié)中定義的處理模式的基礎(chǔ)下來討論我們的最終的例子。在傳輸機(jī)器上,處理模式看起來像這樣:事實(shí)上,MediaTransmitter對象源代碼包括了以下三行:private MediaLocator mediaLocator = null;private DataSink dataSink = null;private Processor mediaProcessor = null;這三個(gè)實(shí)例變量可以直接映射到前面的處理模式圖表,如下:· mediaProcessor變量是我們的處理器;它將負(fù)責(zé)轉(zhuǎn)換音頻文件從MP3文件模式到一個(gè)適合通過RTP協(xié)議傳輸?shù)母袷健?middot; dataSink變量是我們的輸出塊。· 當(dāng)我們建立DataSink時(shí)我們需要指定一個(gè)MediaLocator,它是DataSink的目的文件。當(dāng)我們通過運(yùn)行DataSink我們的處理過的媒體,它將傳輸?shù)轿覀冊贛ediaLocator中指定的地點(diǎn)。RTP MediaLocator在前面的兩個(gè)練習(xí)中,我們通過從文件中獲得的一個(gè)URL建立了MediaLocator實(shí)例。 在本練習(xí)中,我們必須建立一個(gè)MediaLocator來描述網(wǎng)絡(luò)上媒體傳播輸出流;換句話說,我們必須創(chuàng)建一個(gè)能我們的音頻傳播的目的地的MediaLocator。一個(gè)RTP MediaLocator符合如下規(guī)則,看起來就像一個(gè)典型的URL:rtp://address:port/content-type讓我們看看上面URL規(guī)范的每一段:· address 是將傳輸?shù)拿襟w的地址。以單播的模式傳輸(一個(gè)專用IP地址),地址將會(huì)是有意接收的機(jī)器的IP地址。以廣播的模式傳播(到子網(wǎng)中的所有機(jī)器),地址將會(huì)是以255作為最后的一塊的子網(wǎng)地址。舉個(gè)例子,如果我再子網(wǎng)中可指定地址為192.168.1和想要傳播到子網(wǎng)中的所有節(jié)點(diǎn),我可以指定192.168.1.255作為地址;這樣允許子網(wǎng)中的每個(gè)節(jié)點(diǎn)監(jiān)聽廣播媒體。· port 必須是被傳輸者和接收者都允許的一個(gè)端口。· content-type 是媒體流類型。在我們的案子中,這個(gè)將會(huì)是音頻。下面的一個(gè)簡單的RTP傳播MediaLocator例子會(huì)讓所有在指定網(wǎng)絡(luò)中的機(jī)器接收到媒體流:rtp://192.168.1.255:49150/audio創(chuàng)建一個(gè)處理機(jī)在setDataSource()方法中我們首先要做的就是創(chuàng)建一個(gè)Processor實(shí)例。下面的Processor的職責(zé)是轉(zhuǎn)換MP3音頻媒體為一個(gè)RTP來表示:public void setDataSource(DataSource ds) throws IOException,NoProcessorException, CannotRealizeException, NoDataSinkException {mediaProcessor = Manager.createRealizedProcessor(new ProcessorModel(ds, FORMATS, CONTENT_DESCRIPTOR));在Manager類中,我們能創(chuàng)建一個(gè)Processor對象,通過兩種方法中的一種:createProcessor()或者createRealizedProcessor()。你很可能會(huì)注意到這兩個(gè)方法樣式的顯示和前面例子中創(chuàng)建一個(gè)Player的方法很相似。在目前的例子中,我們將創(chuàng)建一個(gè)已實(shí)現(xiàn)的Processor。我們這樣做是因?yàn)槲覀兪褂玫膽?yīng)用非常簡單,在Processo處于Realized狀態(tài)時(shí)我們不需要關(guān)心任何真實(shí)的工作。創(chuàng)建一個(gè)ProcessorModel創(chuàng)建一個(gè)已實(shí)現(xiàn)的Processor,我們需要?jiǎng)?chuàng)建一個(gè)為Processor描述輸入和輸出媒體類型的ProcessorModel實(shí)例。為了創(chuàng)建ProcessorModel,我們需要下面的一些:· 一個(gè)DataSource,將被處理的媒體(輸入文件)。· 一個(gè)javax.media.Format數(shù)組,描述輸入媒體的格式。· 一個(gè)javax.media.protocol.ContentDescriptor實(shí)例,為我們的處理機(jī)描述輸出格式。傳送者的DataSource是通過一個(gè)參數(shù)傳遞到此方法。定義輸入和輸出格式因?yàn)槲覀兊腗ediaTransmitter類會(huì)被時(shí)常用于將輸入媒體格式(MP3)轉(zhuǎn)換成一種輸出格式(音頻RTP),中學(xué)對象被定義成靜態(tài)。我們創(chuàng)建一個(gè)新的javax.media.format.AudioFormat實(shí)例用于描述媒體輸入類型(在java幫助文檔中查看可用格式)。這就是我們的處理機(jī)可以獲取MP3音頻文件的原因。我們也創(chuàng)建一個(gè)javax.media.protocol.ContentDescriptor實(shí)例來描述想要處理機(jī)輸出的。在我們的案子中,這是一個(gè)RTP媒體流。這就是為什么我們的處理機(jī)可以只制造RTP流。下面的代碼片斷顯示了我們?nèi)绾卧O(shè)置格式和內(nèi)容描述符變量,用于創(chuàng)建ProcessorModel對象:private static final Format[] FORMATS = new Format[] {new AudioFormat(AudioFormat.MPEG_RTP)};private static final ContentDescriptor CONTENT_DESCRIPTOR =new ContentDescriptor(ContentDescriptor.RAW_RTP);連接輸入,處理機(jī)和輸出現(xiàn)在我們有一個(gè)處于Realized狀態(tài)的Processor,我們需要設(shè)置DataSink以能實(shí)際上傳播RTP媒體。創(chuàng)建DataSink是簡單的大概使用另外一個(gè)調(diào)用給Manager對象,如下所示:dataSink = Manager.createDataSink(mediaProcessor.getDataOutput(),mediaLocator);createDataSink()方法獲取新Processor的輸出(作為一個(gè)DataSource參數(shù))和MediaLocator對象,我們和MediaTransmitter對象同時(shí)建立的。通過這樣,你能開始我們的不同的組件是如何在處理模式中聯(lián)系起來的:我們從一個(gè)Processor中獲取輸出并使用他們作為輸入到其他組件。在這個(gè)特殊的應(yīng)用中,Processor輸出用于傳輸媒體的DataSink的一個(gè)輸入。創(chuàng)建一個(gè)DataSource實(shí)例在這點(diǎn)上,我們?nèi)慷际亲龊驮O(shè)置我們的媒體播放器的廣播傳輸。我們需要?jiǎng)?chuàng)建DataSource對象,我們用于創(chuàng)建處理機(jī)(就是,在我們的MediaTransmitter中,參數(shù)傳遞到setDataSource()方法)。下面是創(chuàng)建一個(gè)DataSource實(shí)例的代碼:File mediaFile = new File(args[1]);DataSource source = Manager.createDataSource(new MediaLocator(mediaFile.toURL()));這段代碼是在MediaTransmitter對象中的vmain()方法。這里我們通過從命令行輸入的第二個(gè)參數(shù)創(chuàng)建一個(gè)File對象。我們通過文件創(chuàng)建一個(gè)MediaLocator,而后通過位置創(chuàng)建一個(gè)DataSource。這個(gè)新近創(chuàng)建的DataSource是一個(gè)涉及到傳送者的輸入文件。我們能使用這個(gè)DataSource初始化傳輸者。開始和停止MediaTransmitter我們通過調(diào)用其中的startTransmitting()方法來開始MediaTransmitter,如下所示:public void startTransmitting() throws IOException {mediaProcessor.start();dataSink.open();dataSink.start();}這個(gè)方法首先開啟處理機(jī),然后打開并啟動(dòng)DataSink。在這個(gè)調(diào)用后,接收機(jī)器就可在媒體傳送者上監(jiān)聽。停止傳輸者是非常簡單的。以下代碼將DataSink和Processor都停止和關(guān)閉掉:public void stopTransmitting() throws IOException {dataSink.stop();dataSink.close();mediaProcessor.stop();mediaProcessor.close();}編譯和運(yùn)行MediaTransmitter通過在命令行中輸入javac MediaTransmitter.java來編譯例程序,可在你的工作目錄中生成一個(gè)同名的.class文件。要運(yùn)行例程序,在命令提示行中輸入以下代碼:java MediaTransmitter rtpMediaLocator audioFile此例將創(chuàng)建一個(gè)myAudio.mp3文件的媒體廣播。不要忘記將rtpMediaLocator替換成一個(gè)媒體傳輸?shù)腞TP URL,如同先前討論的。你同樣也需要將audioFile替換成你本機(jī)的音頻文件名。所有的相對文件名都是相對于當(dāng)前工作目錄的。你會(huì)看見一些信息標(biāo)志正在播放的文件。按下Enter鍵來停止播放。為傳送者的一個(gè)例命令行交互如下:java MediaTransmitter rtp://192.168.1.255:49150/audio myAudio.mp3如果初始編輯失敗,確定JMF的jar文件包含CLASSPATH環(huán)境變量中。要近一步探索本程序和練習(xí),請查閱MediaTransmitter源代碼。接收傳輸?shù)拿襟w現(xiàn)在你可能會(huì)問,“如果沒有人可以看或者收聽的話,這個(gè)傳播媒體有什么好的?幸運(yùn)的是,設(shè)定一個(gè)接收傳播媒體的客戶端只需要對我們在第二個(gè)例程序的MediaPlayerFrame源代碼做很小的改動(dòng)。MediaPlayerFrame類需要一個(gè)很小的調(diào)節(jié)來接收和播放音頻文件。在main()方法中,你需要注釋掉如下的一行:mpf.setMediaLocator(new MediaLocator(new File(args[0]).toURL()));并且輸入如下的一行:mpf.setMediaLocator(new MediaLocator(args[0]));這個(gè)簡單的改動(dòng)允許我們通過String來創(chuàng)建一個(gè)MediaLocator對象,而不是通過創(chuàng)建一個(gè)File來創(chuàng)建MediaLocator。其他代碼都一樣。指定RTP URL在12頁的說明編譯和運(yùn)行MediaPlayerFrame介紹了如何編譯和運(yùn)行MediaPlayerFrame例程序。這唯一的不同就是你需要為傳輸者指定RTP URL。為接收者的例命令行交互如下:java MediaPlayerFrame rtp://192.168.1.255:49150/audio運(yùn)行網(wǎng)絡(luò)媒體傳送者的注意事項(xiàng)如果你在網(wǎng)絡(luò)上只有權(quán)使用一臺機(jī)器,你仍然可以運(yùn)行傳輸程序。當(dāng)你啟動(dòng)傳送程序的時(shí)候,你可以即使用RTP URL傳輸?shù)刂罚部芍付愎ぷ鞯臋C(jī)器的機(jī)器地址。為了能夠調(diào)節(jié)傳輸,在開始前接收者必須使用精確的同樣的RTP URL。如果你運(yùn)行本例真實(shí)的網(wǎng)絡(luò)版本,每臺你使用的機(jī)器都需要安裝JMF,不論是傳輸還是接收媒體流。這是必須的,因?yàn)椴徽撌莻魉统绦蜻€是接收程序都大量的使用了JMF的API。在任一個(gè)案子中,確認(rèn)在指定的RTP URL中使用了相同的地址和端口;否則媒體傳輸是不會(huì)工作的。第六節(jié). 約束和資源摘要我希望本指南能給你提供如何使用JMF的API的有用的瀏覽。我們建立了三個(gè)小的應(yīng)用程序來播放本地的音頻和視頻,也通過網(wǎng)絡(luò)傳播和接收媒體。這些應(yīng)用程序的源代碼中包含了很多的javadoc樣式的注釋。這就有助于你理解你剩余的問題。許多JMF的主題在本指南中并沒有涉及。實(shí)際上,我們更關(guān)注JMF的基本概念和應(yīng)用;在此基礎(chǔ)上,我們能輕易地?cái)U(kuò)展學(xué)習(xí)的其他范圍。要更深入JMF的應(yīng)用程序,你可能想要學(xué)習(xí)下面的面板中所提到的主題。更近一步的閱讀本指南中的主題,查閱23頁的資源。高級主題大量的值得做的練習(xí)在本指南的范圍之上。在簡單的說明之下自己更進(jìn)一步的學(xué)習(xí),你可以擴(kuò)展我們的應(yīng)用程序代碼,也可以反展你的JMF相關(guān)知識。使用以下的練習(xí)開始:· 媒體捕獲:JMF包含了豐富的API來捕獲媒體數(shù)據(jù)。如果你對使用JMF捕獲媒體感興趣,你可以使用javax.media.CaptureDeviceManager類和javax.media.protocol.CaptureDevice接口的API來學(xué)習(xí)。對于一個(gè)高級的練習(xí),考慮使用CaptureDeviceManager和CaptureDevice接口來增加媒體捕獲功能到媒體播放應(yīng)用程序的GUI版本上。· 會(huì)話管理:由于本指南是一個(gè)JMF的說明,我們使輸出表現(xiàn)非常的簡單,僅僅實(shí)現(xiàn)了javax.media.DataSink輸出。另外的輸出表示是使用javax.media.rtp.SessionManager。這個(gè)管理類允許客戶端創(chuàng)建并監(jiān)視他們的RTP流和連接。通過SessionManager并隨后創(chuàng)建流,它可能非常的接近監(jiān)視RTP會(huì)話。作為一個(gè)高級的練習(xí),轉(zhuǎn)換我們的地三個(gè)演示程序來使用SessionManager,然后監(jiān)聽流出的RTP流已經(jīng)哪些客戶端在收聽。· 使用JMF的多點(diǎn)傳送:我們的廣播演示應(yīng)用程序說明了如何傳送一個(gè)網(wǎng)絡(luò)的媒體到另外一個(gè)網(wǎng)絡(luò)的一或多臺機(jī)器上去。它也可能使用JMF中的多點(diǎn)傳輸協(xié)議來提供給更復(fù)雜,多用戶的網(wǎng)絡(luò)。JMF用戶指南提供了一個(gè)使用JMF的多播協(xié)議的更深入的探討。更進(jìn)一步追蹤本主題查看23頁資源。· 傳輸視頻: 我們的最后一個(gè)演示應(yīng)用程序著眼于如何傳輸一個(gè)MP3音頻文件,但是JMF也能夠通過網(wǎng)絡(luò)傳遞視頻。關(guān)注API文檔中的Format和ContentDescriptor類獲得如何使用的更好的方法。· 導(dǎo)入/導(dǎo)出RTP媒體流: JMF同樣允許將RTP流保存為文件以便將來使用。舉一個(gè)實(shí)例,一個(gè)遠(yuǎn)程電信會(huì)議可以保存下來以后再看。由于流已經(jīng)保存再RTP格式中,已經(jīng)不需要再次轉(zhuǎn)換,這樣可導(dǎo)致傳輸程序的性能改進(jìn)。通過一個(gè)文件而不是URL來設(shè)置DataSink對象中輸入/輸出MediaLocator。你會(huì)再JMF用戶指南中發(fā)現(xiàn)更深層次的主題探討。資源JMF· 下載mediaplayer.jar,本指南中使用的完整的例源代碼。· JMF主頁 (http://www.javasoft.com/jmf)是最好的探討JMF更多信息的資源。· 你可以找到JMF說明書(http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html),再Java開發(fā)者聯(lián)盟上包括API文檔和JMF用戶指南。你必須有權(quán)使用所有的這些資源,如果你想做任何更深入的JMF編程的話。· 官方的JMF支持文件格式 頁面(http://java.sun.com/products/java-media/jmf/2.1.1/formats.html) 列出了所有可為JMF辨識并播放的文件格式。此文件格式頁面也包括了學(xué)習(xí)更多關(guān)于捕獲設(shè)備和RTP格式的參考。· MPEG-4 Video for JMF (http://www.alphaworks.ibm.com/tech/mpeg-4), 來自IBMalphaWorks, 是一個(gè)JMF的視頻編解碼器。RTP· IETF RTP RFC (http://www.ietf.org/rfc/rfc1889.txt) 非常詳細(xì)的描述了RTP協(xié)議。· 查看 JMF API Guide(http://java.sun.com/products/java-media/jmf/2.1.1/specdownload.html) ,有許多有關(guān)于RTP協(xié)議和描述以及它是如何在JMF上應(yīng)用的。· 哥倫比亞大學(xué)有一個(gè)比較有用的RTP FAQ(http://www.cs.columbia.edu/~hgs/rtp/faq.html).Java技術(shù)· Java 2 Platform, Standard Edition (http://java.sun.com/j2se/) 可從sun公司獲得。· sun的指南關(guān)于JFC/Swing (http://java.sun.com/docs/books/tutorial/uiswing/index.html)和 AWT (http://java.sun.com/docs/books/tutorial/information/download.html#OLDui) 是非常好的能學(xué)習(xí)到很多關(guān)于Java程序語言中GUI編程的好地方。· 另外一個(gè)sun指南學(xué)習(xí)network programming 基礎(chǔ)(http://java.sun.com/docs/books/tutorial/networking/index.html)。多點(diǎn)傳輸協(xié)議· Explicit Multicast (XCAST)(http://oss.software.ibm.com/developerworks/opensource/xcast/) 是IP多點(diǎn)傳輸?shù)囊环N形式,為非常多的多點(diǎn)傳輸組設(shè)計(jì)提供可升級的支持,這些組有些少量的參與者代表。XCAST 代碼得到了IBM Common Public License的認(rèn)可。· Todd Montgomery 的 MTP page (http://www.nard.net/~tmont/rm-links.html),在這里你能找到一個(gè)廣泛的涉及到多點(diǎn)傳輸協(xié)議的列表。附加資源· 你可以在developerWorks Java technology zone (http://www-106.ibm.com/developerworks/java/)中找到許多的關(guān)于Java各方面的內(nèi)容。· 查看 developerWorks tutorials page(http://www-105.ibm.com/developerworks/education.nsf/dw/java-onlinecourse-bytitle?OpenDocument&Count=for a complete listing of free tutorials. Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd Java媒體架構(gòu)基礎(chǔ)developerWorks出版,你主要資源的來源ibm.com/developerWorks作者:Eric Olson;pawenwen版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息?
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 福利视频网站 | 色婷婷综合在线视频 | 日日天天 | 亚洲午夜精品一区二区三区 | 国产精品久久久久久久久久99 | 欧美日韩精品久久 | 亚洲第一免费视频网站 | 亚洲成人av在线播放 | 免费av片网站 | 一区三区视频 | 久久国产精品无码网站 | 精品久久久久久久久久久久久久久久久久 | 国产视频网 | 99成人 | 久久国产精品视频 | www.av在线| 精品久久久99 | 妞干网福利视频 | www久| 午夜寂寞少妇aaa片毛片 | 久久精品久久久久久 | 亚洲国产精品久久久 | 国产精品久久久久久久久免费 | 在线视频亚洲 | 91精品国产综合久久久久久丝袜 | 麻豆av电影在线观看 | 国产精品欧美一区二区三区 | 91麻豆产精品久久久久久 | 久久激情综合 | 日韩精品视频免费专区在线播放 | 山岸逢花在线观看无删减 | 一 级 黄 色 片免费网站 | 国产成人一区二区 | 亚洲精选一区二区 | 日韩视频在线观看 | 国产永久免费 | 色99在线 | 亚洲 欧美日韩 国产 中文 | 久综合在线 | 91精品久久久久久久久久入口 | 国产一级免费在线 | 免费视频爱爱太爽了 | 91在线视频播放 | 在线精品一区 | 91.成人天堂一区 | а天堂中文最新一区二区三区 | 岛国一区| 日本免费黄色 | 中文在线视频 | 国产精品爱久久久久久久 | 午夜看片在线观看 | 国产免费一区二区 | 成人黄色电影在线观看 | 亚洲精品久久久久久动漫 | 国产精品一区二区三区四区 | 精品国产高清一区二区三区 | 97超碰在线免费 | 欧美成人一区二区三区片免费 | 久久久久久久久久一区二区 | 99久热在线精品视频观看 | 91精品午夜| 久久男女| 亚洲日韩欧美一区二区在线 | 一级片在线免费看 | 成年人免费看片 | 久久综合九色综合欧美狠狠 | 日韩视频一区二区三区 | 国产成人精品一区二区三区网站观看 | www.av7788.com| 亚洲最黄网站 | 国产一级视频 | 一级激情片 | 亚洲视频一区二区三区四区 | 在线日韩欧美 | 天天夜夜操操 | 欧美日韩最新 | 欧洲亚洲精品久久久久 | 免费成人高清 | 一区二区三区不卡视频 | 99草视频 | 精品第一页 | 在线观看免费av网站 | 国产精品久久av | 欧美三区 | 美女又黄又免费 | 成人黄色片网站 | 天天插天天干 | 久久女同互慰一区二区三区 | 色吧久久| 欧美成人a | 亚洲综合无码一区二区 | 日韩资源在线 | 欧美日韩国产一区二区 | 国产一在线 | 国产欧美日韩 | 久久国产精品一区二区 | 丁香久久 | 精品久久久久国产 | 久久一区 | 中文字幕av黄色 | 欧美高清视频一区二区三区 | 国产精品久久久久久久久免费 | 日韩视频中文字幕 | 国产精品a一区二区三区网址 | 久久久久久久久99精品 | 久久999| 亚洲性生活免费视频 | 99青青草| 久久九九国产精品 | 国产传媒在线视频 | 精品欧美黑人一区二区三区 | 欧美久久影视 | 男女做爰高清无遮挡免费视频 | 亚洲精品久久久久久久久 | 国产毛片毛片 | 亚洲精品亚洲人成人网 | 91爱啪啪 | 久久小草 | 在线播放国产一区二区三区 | 国产日韩欧美视频 | 亚洲成av人片一区二区三区 | 亚洲精品电影在线观看 | 在线观看的av | zzzwww在线观看免 | 在线一级电影 | 色免费视频 | 国产一区日韩欧美 | 免费av一区二区三区 | 啊v视频| 亚洲精品一二三区 | a视频在线观看 | 日韩综合一区 | 一级久久久久 | 欧美精品一区视频 | 99精品国产热久久91蜜凸 | 91亚洲国产精品 | 亚洲伊人中文字幕 | h视频在线观看免费 | 国产精品片aa在线观看 | 一区二区三区国产 | 亚洲高清一区二区三区 | 国产一区二区在线免费观看 | 中文字幕免费视频观看 | 欧美三级免费观看 | 日本在线黄色 | 久久精品久久久久电影 | 久久久久无码国产精品一区 | 国产视频久久久久 | 国产精品久久久久久久久 | 亚洲高清在线 | 午夜精品久久久久久久久久久久 | 一区二区中文字幕 | 中文字幕一区在线观看视频 | 日韩欧美国产精品综合嫩v 亚洲欧美日韩在线 | 精品久久一二三区 | 国产成人久久精品一区二区三区 | 日韩精品久久久久久 | 国产精品国产精品国产专区不片 | 91无吗 | 久久久性色精品国产免费观看 | 精品欧美一区二区三区久久久小说 | 午夜精品一区二区三区免费视频 | 亚洲一区二区三区福利 | 国产一区二区免费 | 99pao成人国产永久免费视频 | 国产精品成人国产乱一区 | 91麻豆产精品久久久久久 | 欧美久久久久久久久久久久 | 亚洲国产二区 | 欧美激情综合五月色丁香小说 | 欧美午夜精品久久久久久蜜 | 久久久精品网站 | 黄色拍拍视频 | 久久久久久日产精品 | www.久久久久久久久久久久 | 精品久久久久一区二区国产 | 久久久久久久99精品免费观看 | 精品欧美一区二区三区久久久 | 国产日韩中文字幕 | 欧美精品一区二区三区在线四季 | 午夜激情影院 | 国产成人精品一区二区三区视频 | 中文成人在线 | a级在线免费 | 日本另类αv欧美另类aⅴ | 亚洲一区在线日韩在线深爱 | 日韩在线资源 | 欧美精品免费在线观看 | 91久久国产综合久久蜜月精品 | 欧美国产高清 | 国产成人免费视频网站视频社区 | 91在线 | 亚洲 | 亚洲精品成人悠悠色影视 | 九九99九九精彩46 | 亚洲精品一区久久久久久 | 91精品久久久久 | 精品少妇一区二区三区日产乱码 | 日韩精品免费视频 | 国产韩国精品一区二区三区 | 久久久www成人免费无遮挡大片 | 操碰97| 日韩一区二区三区在线视频 | 亚洲色图综合 | 欧美爱爱视频 | 国产精品久久久久久久久久久久久 | 性色av一区二区三区 | 超碰操| 免费成人精品 | av中文字幕在线 | 91嫩草在线| 国产午夜小视频 | 日产精品久久久一区二区 | 99视频在线免费观看 | 天堂中文网 | 日韩亚洲精品在线观看 | 伊人网在线视频观看 | 日韩在线播放一区二区 | 亚洲国产精久久久久久久 | 午夜国产一区 | 国产一区久久 | 中文字幕在线日韩 | 欧美日韩在线播放 | 国产免费亚洲 | 亚洲www啪成人一区二区 | 91丨九色丨国产 | aaa天堂 | 日韩亚洲欧美综合 | 日韩欧美在线免费观看 | 久久久一区二区 | 欧美精品成人一区二区在线 | 国产精品视频一区二区三区不卡 | 精品免费一区二区 | 国产成人av在线播放 | 琪琪午夜伦伦电影福利片 | 国产精品18hdxxxⅹ在线 | 少妇久久久 | 国产一区在线免费观看 | 国产亚洲精品综合一区91555 | 亚洲免费在线观看 | 人妖天堂狠狠ts人妖天堂狠狠 | 最新日韩精品在线观看 | 国产欧美日韩在线观看 | 久久精品亚洲精品国产欧美 | 国产精品亚洲精品久久 | 在线视频国产一区 | 天天夜夜操 | 国产视频一区二区 | 国产乱码精品一区二区三区五月婷 | 国产亚洲精品久久久 | 国产高清一级毛片在线不卡 | 久久九九国产精品 | 欧美日韩在线视频一区二区 | 狠狠插天天干 | 99视频免费播放 | 一本大道久久a久久精二百 国产精品片aa在线观看 | 在线国产专区 | 91在线观看视频 | 激情欧美一区二区三区中文字幕 | 黄色网址大全在线观看 | 欧美视频在线免费 | 欧美精品一区二区三区在线四季 | 毛片一区二区 | 国产精品久久久久久久岛一牛影视 | 婷婷久 | 日韩城人网站 | 精品美女一区 | 国产精品99久久久久 | 成人精品视频99在线观看免费 | 91中文在线 | 久久日韩| 亚洲成人av在线 | 综合 欧美 亚洲日本 | 成人精品视频 | av色资源| 久久亚洲一区二区 | 姐姐在线观看动漫第二集免费 | 一级a毛片| 国产免费av在线 | 天天网 | 午夜精品91 | 国产精品久久久久久久久久久久久久 | 美女操网站 | 黄色一级毛片 | 在线欧美成人 | 久久99视频 | 午夜专区 | 精品一区二区在线观看 | 九九热在线观看 | 91男女视频 | 午夜精品一区二区三区在线视频 | 国产大片aaa| 久久久精彩视频 | 五月天婷婷综合 | 999成人网| 欧美一级片在线 | 欧美a在线看 | 久久久久国产一级毛片高清版小说 | 欧美视频区 | 国产依人 | 中文字幕乱码一区二区三区 | 亚洲精品国偷拍自产在线观看 | 国产一区网站 | 国产在线不卡一区 | 欧美第一区 | 国产欧美精品一区二区三区 | 国产精品美女久久久久久免费 | 亚洲精品视频大全 | 午夜免费视频 | 久久久精 | 欧美精品一二三 | 久久综合九九 | 日韩精品在线一区 | 日本一级淫片免费看 | 一级一片在线观看 | 亚洲va中文字幕 | 福利一区二区 | 日韩在线视频一区 | 久久成人国产精品 | 亚洲欧美aa | 久久精品性 | 日韩欧美在线一区二区 | 国产亚洲成av人片在线观看桃 | 亚洲天堂一区二区 | 六月丁香av | 91精品国产综合久久久久久蜜月 | 一本一道久久久a久久久精品91 | 亚洲午夜精品一区二区三区他趣 | 久久久久国产精品免费免费搜索 | 精品午夜久久久 | 国产在线观看欧美 | 日韩av一区二区三区在线 | 免费观看一区二区三区毛片 | 免费观看视频www | 一级毛片在线播放 | t66y最新地址一地址二69 | 亚洲第1页 | 日韩欧美亚洲 | 在线视频一区二区 | 热久久影院 | 欧美一级黄色片 | 国产中文字幕一区 | 9191视频| 一区二区三区国产 | 波多野结衣 一区二区 | 国产精品久久久久久久久久东京 | 91精品国产91久久综合桃花 | 4h影视| 午夜看片 | 日韩欧美精品区 | 一区二区三区四区在线 | 欧美一区亚洲二区 | 亚洲视频一区二区三区 | 久久亚洲精品中文字幕 | www日韩| 羞羞在线观看视频免费观看hd | 久久国产精品一区二区 | 国产玖玖 | 在线欧美a | 毛片国产 | 男人天堂亚洲天堂 | 久久久久中文字幕 | 国产一级一级片 | 成人免费在线电影 | 国产精品久久久久久久一区探花 | 国产视频h| 综合久久久 | 亚洲一区视频 | 国产精品日本一区二区在线播放 | 久福利 | 欧日韩不卡在线视频 | 成人黄色片网站 | 91精品国产综合久久福利软件 | 超碰在线播| 在线免费毛片 | 国产99久久 | 北条麻妃99精品青青久久 | 一级a性色生活片久久毛片波多野 | 中文字幕久久精品 | 日韩一区二区黄色片 | 国内精品一区二区三区 | 日韩免费区 | 国产精品一区二区在线看 | 91麻豆视频 | 婷婷综合激情 | 不卡一二| 国产aaaaav久久久一区二区 | 一区二区三区在线观看免费 | 精品久久久久一区二区国产 | 欧洲成人在线观看 | 在线观看国产 | 青青久久 | 成人一区二区三区久久精品嫩草 | 一级黄色毛片免费观看 | 精国产品一区二区三区 | www国产成人免费观看视频 | 国产一区二区三区久久久久久 | 99伊人 | 免费高潮视频95在线观看网站 | 成人免费小视频 | 欧美一区二区三区视频在线观看 | 欧美日韩综合精品 | 91久久久久 | 国产精品久久久爽爽爽麻豆色哟哟 | 特级av| 国产做a爰片久久毛片a我的朋友 | 亚洲男人天堂网 | 日韩快播电影网 | 亚洲欧美在线一区 | 一区二区三区有限公司 | 91影库| 午夜视频在线免费观看 | 日韩综合区 | 老司机深夜福利在线观看 | 欧美精品一区二区三区手机在线 | 国产欧美综合一区 | 午夜精品久久久久久久男人的天堂 | 欧美亚洲国产一区 | 亚洲午夜精品一区二区三区他趣 | 亚洲一级黄色 | 在线观看中文字幕亚洲 | 99热精品在线 | 91社区在线观看高清 | 久久99这里只有精品 | 红杏aⅴ成人免费视频 | 日韩国产高清在线 | 欧美激情在线精品一区二区三区 | 日本成人中文字幕 | 免费一区二区 | 国产精品免费观看 | 在线观看中文字幕 | 欧美激情 在线 | 欧美成人一区二区三区片免费 | 精品无码久久久久国产 | 欧美专区在线 | 亚洲日本va中文字幕 | 日韩婷婷 | 亚洲精品久久久久午夜 | 国产免费av一区二区三区 | 午夜亚洲福利 | 国产精品久久久久久久久费观看 | 91精品一区二区 | 欧美黄色a视频 | 精品久久久久国产免费 | 欧美精品一区三区 | 91偷拍精品一区二区三区 | 一区二区三区四区精品 | 精品一区二区三区在线观看视频 | 欧美日韩视频一区二区 | 久久艹99 | 天堂成人av | 亚洲日韩中文字幕一区 | 日本在线免费观看 | 欧美黑人一级爽快片淫片高清 | 国产精品一区二区三区在线免费观看 | 成人免费视频7777777 | 精品一区二区在线播放 | 美国一级毛片a | 成人综合区 | 一级毛片免费看 | www亚洲一区 | 国产精品一区二区在线 | 91久久| 欧洲妇女成人淫片aaa视频 | 欧美极品视频 | 久久久久久久国产 | 在线观看黄色大片 | 久久在线视频 | 黄色一级片在线看 | 免费毛片一区二区三区久久久 | 一区二区三区在线播放 | 岛国一区 | 日韩精品一区二区三区在线观看 | 在线永久免费观看日韩a | 日韩中文字幕在线播放 | 国产成人无遮挡在线视频 | 欧洲精品在线视频 | 欧美肉体xxxx肉交高潮 | 中文字幕avav | 日韩一区二区三区在线观看 | www国产网站 | 国产精品a久久 | 成人国产免费视频 | 久久激情视频 | 男人的天堂中文字幕 | 欧美精品在线观看 | 亚洲免费在线观看 | 啪啪毛片| 蜜月久综合久久综合国产 | 日韩成人tv | 日日天天 | 久久久精品亚洲 | 成人免费福利视频 | 亚洲精品久久久久久久久久久 | 日本一区二区不卡视频 | 亚洲精品一区二区 | 国产一区二区三区视频在线观看 | 在线观看黄 | 日本午夜电影 | 久久精品国产v日韩v亚洲 | 久久精品1区2区 | av国产精品 | 亚洲激情久久 | 国产精品视频播放 | 欧美一区永久视频免费观看 | 九九综合九九 | 欧美日韩国产综合视频 | 久久午夜精品 | 武道仙尊动漫在线观看 | 91九色在线 | 在线观看国产一区 | 欧美日韩视频在线第一区 | 国产伦精品一区二区三区四区视频 | 国产精品夜夜春夜夜爽久久电影 | 亚洲国产高清高潮精品美女 | 久久亚洲国产 | 99riav国产精品 | 日日操日日操 | 欲色av | 亚洲人成中文字幕在线观看 | 天堂精品一区 | 日本一区二区精品视频 | 米奇狠狠操 | www.日韩系列 | 久久久中文字幕 | 国产精品一码二码三码在线 | 欧美成年黄网站色视频 | 日日爱影视 | 国产1级片 | 粉嫩av网站 | 青娱乐网站 | 在线中文日韩 | 国产一级毛片国语一级 | 亚洲国产精品久久久久 | 97视频免费在线观看 | 久久男人的天堂 | 日韩成人在线播放 | 91精品国产色综合久久 | 91精品电影 | 综合二区 | 欧美一区二区视频 | 久久成人免费观看 | 视频一区在线 | 久久精品日韩 | 一区二区国产精品 | 台湾av在线 | 国产一级纯肉体一级毛片 | 成人黄色短视频在线观看 | 欧美黄 片免费观看 | 国产亚洲女人久久久久毛片 | 在线亚洲精品 | 色av色av色av| 亚洲精品日韩激情在线电影 | 国产精选一区二区三区 | 超碰人人99 | 在线观看视频一区二区三区 | 在线观看免费的av | eeuss国产一区二区三区四区 | 欧美一级视频在线观看 | 国产999精品久久久影片官网 | 一区二区亚洲 | 欧美视频在线免费 | 国产欧美精品一区二区三区四区 | 亚洲高清在线观看 | 久久久久在线 | 暖暖成人免费视频 | 久久精品国产免费 | 天天干狠狠操 | 国产成人精品网站 | 欧美成人免费在线观看 | 国产精品爱久久久久久久 | 欧美日韩国产一区二区三区在线观看 | 精品久久久蜜桃 | 中文字幕综合在线 | 久一在线| 天天操天天摸天天干 | 欧美污污 | 在线国产视频 | 成人免费淫片aa视频免费 | 久久成人精品一区二区三区 | 中文字幕一区二区三区乱码图片 | 国产精品久久久久久久久 | 国产羞羞视频在线观看 | 狠狠色综合久久丁香婷婷 | 亚洲大奶网 | 一区二区手机在线 | 国产综合亚洲精品一区二 | 国产精品乱码一区二区三区 | 91精品国产综合久久久久久漫画 | 日韩在线二区 | 黄色影片网址 | 亚洲激情视频在线观看 | 亚洲 国产 另类 精品 专区 | 色视频在线免费观看 | 欧美色视频在线观看 | 黄色片在线 | 一区久久 | 午夜资源 | 在线观看视频一区二区三区 | 久草在线青青草 | 美女国产 | 国产精品国产 | 欧美三级在线视频 | 日韩在线中文 | 99国产精品久久久久久久 | 成人精品久久久 | 91高清免费看 | 日韩中文字幕av | 国产免费拔擦拔擦8x高清在线人 | 久久综合久色欧美综合狠狠 | 亚洲国产精品成人久久久 | 91麻豆精品一二三区在线 | 成人免费视频观看视频 | 在线视频一二区 | 国产欧美精品一区二区三区四区 | 国产色网 |