利用JMF進(jìn)行多媒體編程26067_第1頁(yè)
利用JMF進(jìn)行多媒體編程26067_第2頁(yè)
利用JMF進(jìn)行多媒體編程26067_第3頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、僅供個(gè)人參考利用 JMF進(jìn)行多媒體編程Java 媒體框架( JMF)使你能夠編寫出功能強(qiáng)大的多媒體程序,卻不用關(guān)心底層復(fù)雜的實(shí)現(xiàn)細(xì)節(jié)。JMF API 的使用相對(duì)比較簡(jiǎn)單,但是能夠滿足幾乎所有多媒體編程的需求。在這篇文章中,我將向你介紹如何用很少的代碼就編寫出多媒體程序。Java 多媒體框架( JMF)中包含了許多用于處理多媒體的API。它是一個(gè)相當(dāng)復(fù)雜的系統(tǒng),完全了解這個(gè)系統(tǒng)可能需要花上幾周的時(shí)間,但是這篇文章將主要介紹JMF的幾個(gè)核心接口和類,然后通過一個(gè)簡(jiǎn)單的例子向你展示如何利用該接口進(jìn)行編程。JMF目前的最新版本是2.1 ,Sun 通過它向 Java 中引入處理多媒體的能力。下面是JMF

2、所支持的功能的一個(gè)概述: 可以在 Java Applet和應(yīng)用程序中播放各種媒體文件,例如AU、AVI、 MIDI 、MPEG、 QuickTime 和 WAV等文件。 可以播放從互聯(lián)網(wǎng)上下載的媒體流。 可以利用麥克風(fēng)和攝像機(jī)一類的設(shè)備截取音頻和視頻,并保存成多媒體文件。 處理多媒體文件,轉(zhuǎn)換文件格式。 向互聯(lián)網(wǎng)上傳音頻和視頻數(shù)據(jù)流。 在互聯(lián)網(wǎng)上廣播音頻和視頻數(shù)據(jù)。JMF的結(jié)構(gòu)為了更好地說明JMF的結(jié)構(gòu),讓我們用立體聲音響做一個(gè)簡(jiǎn)單的比喻。當(dāng)你 CD機(jī)播放 CD唱片的時(shí)候, CD唱片向系統(tǒng)提供音樂信號(hào)。這些數(shù)據(jù)是在錄音棚中用麥克風(fēng)和其他類似的設(shè)備記錄下來的。CD播放機(jī)將音樂信號(hào)傳送到系統(tǒng)的音箱

3、上。在這個(gè)例子中,麥克風(fēng)就是一個(gè)音頻截取設(shè)備,CD唱片是數(shù)據(jù)源,而音箱是輸出設(shè)備。JMF的結(jié)構(gòu)和立體聲音響系統(tǒng)非常相似,在后面的文章中,你會(huì)遇到下面的這些術(shù)語: 數(shù)據(jù)源( Data source) 截取設(shè)備( Capture Device,包括視頻和音頻截取設(shè)備) 播放器( Player ) 處理器( Processor ) 數(shù)據(jù)格式( Format ) 管理器( Manager)下面讓我們來看一看這些術(shù)語到底代表什么意思。1數(shù)據(jù)源就像 CD中保存了歌曲一樣,數(shù)據(jù)源中包含了媒體數(shù)據(jù)流。在JMF中, DataSource 對(duì)象就是數(shù)據(jù)源,它可以是一個(gè)多媒體文件,也可以是從互聯(lián)網(wǎng)上下載的數(shù)據(jù)流。對(duì)

4、于DataSource 對(duì)象,一旦你確定了它的位置和類型,對(duì)象中就包含了多媒體的位置信息和能夠播放該多媒體的軟件信息。當(dāng)創(chuàng)建了DataSource 對(duì)象后,可以將它送入Player對(duì)象中,而Player對(duì)象不需要關(guān)心DataSource 中的多媒體是如何獲得的,以及格式是什么。在某些情況下,你需要將多個(gè)數(shù)據(jù)源合并成一個(gè)數(shù)據(jù)源。例如當(dāng)你在制作一段錄像時(shí),你需要將音頻數(shù)據(jù)源和視頻數(shù)據(jù)源合并在一起。 JMF支持?jǐn)?shù)據(jù)源合并,在后面的例子中我們將提到這一點(diǎn)。2截取設(shè)備截取設(shè)備指的是可以截取到音頻或視頻數(shù)據(jù)的硬件,如麥克風(fēng)、攝像機(jī)等。截取到的數(shù)據(jù)可以被送入Player對(duì)象中進(jìn)行處理。3播放器在 JMF中對(duì)

5、應(yīng)播放器的接口是Player 。Player對(duì)象將音頻視頻數(shù)據(jù)流作為輸入,然后將數(shù)據(jù)流輸出到音箱或屏幕上,就像不得用于商業(yè)用途僅供個(gè)人參考CD播放機(jī)讀取 CD唱片中的歌曲,然后將信號(hào)送到音箱上一樣。Player 對(duì)象有多種狀態(tài), JMF中定義了 JMF的六種狀態(tài),在正常情況下 Player 對(duì)象需要經(jīng)歷每個(gè)狀態(tài),然后才能播放多媒體。下面是對(duì)這些狀態(tài)的說明。 Unrealized:在這種狀態(tài)下, Player 對(duì)象已經(jīng)被實(shí)例化,但是并不知道它需要播放的多媒體的任何信息。 Realizing:當(dāng)調(diào)用 realize ()方法時(shí), Player 對(duì)象的狀態(tài)從 Unrealized 轉(zhuǎn)變?yōu)?Reali

6、zing 。在這種狀態(tài)下, Player對(duì)象正在確定它需要占用哪些資源。 Realized :在這種狀態(tài)下 Player對(duì)象已經(jīng)確定了它需要哪些資源,并且也知道需要播放的多媒體的類型。 Prefetching:當(dāng)調(diào)用 prefectch()方法時(shí), Player 對(duì)象的狀態(tài)從 Realized 變?yōu)?Prefetching 。在該狀態(tài)下的 Player對(duì)象正在為播放多媒體做一些準(zhǔn)備工作,其中包括加載多媒體數(shù)據(jù),獲得需要獨(dú)占的資源等。 這個(gè)過程被稱為預(yù)取 (Prefetch)。 Prefetched :當(dāng) Player 對(duì)象完成了預(yù)取操作后就到達(dá)了該狀態(tài)。 Started :當(dāng)調(diào)用 start

7、()方法后, Player 對(duì)象就進(jìn)入了該狀態(tài)并播放多媒體。4處理器處理器對(duì)應(yīng)的接口是Processor ,它一種播放器。在JMFAPI 中, Processor接口繼承了Player接口。 Processor對(duì)象除了支持支持 Player對(duì)象支持的所有功能,還可以控制對(duì)于輸入的多媒體數(shù)據(jù)流進(jìn)行何種處理以及通過數(shù)據(jù)源向其他的Player對(duì)象或 Processor對(duì)象輸出數(shù)據(jù)。除了在播放器中提到了六種狀態(tài)外,Processor對(duì)象還包括兩種新的狀態(tài),這兩種狀態(tài)是在Unrealized狀態(tài)之后,但是在Realizing狀態(tài)之前。 Configuring:當(dāng)調(diào)用 configure()方法后, Pr

8、ocessor 對(duì)象進(jìn)入該狀態(tài)。在該狀態(tài)下,Processor對(duì)象連接到數(shù)據(jù)源并獲取輸入數(shù)據(jù)的格式信息。 Configured:當(dāng)完成數(shù)據(jù)源連接,獲得輸入數(shù)據(jù)格式的信息后,Processor 對(duì)象就處于Configured狀態(tài)。5數(shù)據(jù)格式Format 對(duì)象中保存了多媒體的格式信息。該對(duì)象中本身沒有記錄多媒體編碼的相關(guān)信息,但是它保存了編碼的名稱。Format的子類包括 AudioFormat 和 VideoFormat 類, ViedeoFomat 又有六個(gè)子類: H261Format、 H263Format、 IndexedColorFormat 、JPEGFormat、RGBFormat和

9、 YUVFormat 類。6管理器JMF提供了下面四種管理器: Manager :Manager 相當(dāng)于兩個(gè)類之間的接口。例如當(dāng)你需要播放一個(gè)DataSource 對(duì)象,你可以通過使用Manager 對(duì)象創(chuàng)建一個(gè) Player對(duì)象來播放它。使用Manager 對(duì)象可以創(chuàng)建Player 、 Processor 、DataSource 和 DataSink 對(duì)象。 PackageManager :該管理器中保存了 JMF類注冊(cè)信息。 CaptureDeviceManager :該管理器中保存了截取設(shè)備的注冊(cè)信息。 PlugInManager :該管理器中保存了 JMF插件的注冊(cè)信息。創(chuàng)建一個(gè) Pl

10、ayer對(duì)象在 JMF編程中,最常見的工作就是創(chuàng)建一個(gè) Player 對(duì)象。你可以通過 Manager 類的 createPlayer ()方法創(chuàng)建 Player 對(duì)象。Manager對(duì)象使用多媒體的 URL或 MediaLocator 對(duì)象來創(chuàng)建 Player 對(duì)象。當(dāng)你獲得了一個(gè) Player 對(duì)象后,你可以通過調(diào)用 getVisualComponent ()方法得到 Player 對(duì)象的圖像部件( Visual Component,在圖像部件上可以播放多媒體的圖像)。然后將圖像部件加入到應(yīng)用程序或 Applet 的界面上。 Player 對(duì)象還包含一個(gè)控制面板,在上面可以控制媒體的播放、

11、停止和暫停等。Player類中的很多方法只有在Player對(duì)象處于 Realized的狀態(tài)下才會(huì)被調(diào)用。為了保證Player對(duì)象已經(jīng)到達(dá)了該狀態(tài),你需要使用 Manager 的 createRealizePlayer()方法來獲得Player對(duì)象。但是對(duì)于start ()方法來說,你可以在Player對(duì)象到達(dá)Prefetched狀態(tài)之前調(diào)用它,它可以自動(dòng)將Player的狀態(tài)轉(zhuǎn)換到Started狀態(tài)。不得用于商業(yè)用途僅供個(gè)人參考截取多媒體數(shù)據(jù)多媒體數(shù)據(jù)的截取是 JMF程序中另一個(gè)非常重要的功能。你可以按照下面的步驟截取數(shù)據(jù): 通過查詢 CaptureDevieceManager獲得你希望使用的截

12、取設(shè)備。 獲得設(shè)備對(duì)應(yīng)的 CaptureDeviceInfo對(duì)象。 從 CaptureDeviecInfo對(duì)象中獲得MediaLocator 對(duì)象,然后用它創(chuàng)建一個(gè)DataSource 對(duì)象。 使用 DataSource 對(duì)象創(chuàng)建 Player對(duì)象或 Processor 對(duì)象。 調(diào)用 start()方法,開始截取多媒體數(shù)據(jù)。你可以使用CaptureDeviceManager對(duì)象獲得系統(tǒng)中可用的視頻和音頻截取設(shè)備。通過調(diào)用getDeviceList()方法你可以獲得設(shè)備的列表。每個(gè)設(shè)備都對(duì)應(yīng)一個(gè)CaptrueDeviceInfo對(duì)象。也可通過調(diào)用CaptureDevieceManager對(duì)象的

13、getDevice ()方法來獲得特定的CaptureDeviceInfo對(duì)象。在使用設(shè)備截取多媒體數(shù)據(jù)前,還需要從CaptureDeviceInfo對(duì)象中獲得設(shè)備對(duì)應(yīng)的 MediaLocator 對(duì)象。然后你可以直接使用 MediaLocator 來構(gòu)造 Player 或 Processor 的實(shí)例,也可以用 MediaLocator 構(gòu)造一個(gè) DataSource 對(duì)象,然后將 DataSource 對(duì)象送入 Player 或 Processor 對(duì)象中。最后調(diào)用 start ()方法來截取多媒體數(shù)據(jù)。一個(gè) JMF例子當(dāng)你使用JMF進(jìn)行編程以前, 你需要安裝JMF。同時(shí)在硬件上也有一些要求

14、。由于本文的代碼是在Windows 2000 下編寫和測(cè)試,因此文章中提到的操作系統(tǒng)需要的軟件都是與Windows有關(guān)的。雖然Java 是跨平臺(tái)的,但是JMF是個(gè)例外并不是所有的平臺(tái)上都實(shí)現(xiàn)了JMF。硬件和軟件要求硬件方面你需要與SoundBlaster兼容的聲卡,芯片最好使用奔騰III以上的芯片。內(nèi)存最好不小于64MB。同時(shí)你需要安裝下面的軟件: Windows95/98 ,Windows NT 4.0, Windows2000或 WindowsXP。 JMF 類和動(dòng)態(tài)庫(kù)在 Windows 下安裝 JMF2.1當(dāng)下載了JMF2.1 以后,運(yùn)行jmf-2_1_1b-windows-i586.e

15、xe。該程序會(huì)將JMF2.1 安裝到你指定的目錄下。當(dāng)安裝成功后,你需要確認(rèn)一下安裝程序正確設(shè)定了CLASSPATH和 PATH環(huán)境變量。在CLASSPATH中需要包含jmf.jar和 sound.jar;在 PATH中需要包含JMF動(dòng)態(tài)庫(kù)的路徑。JMFRegistry如果你希望使用視頻和音頻截取的設(shè)備,你需要確認(rèn)安裝了這些設(shè)備的驅(qū)動(dòng)程序。除此之外,你還需要運(yùn)行JMFRegistry應(yīng)用程序。 JMFRegistry 可以向 JMF注冊(cè)新的數(shù)據(jù)源、媒體處理器、插件、視頻和音頻截取設(shè)備,然后你才能夠在你的程序中使用它們。你只需要運(yùn)行一次JMFRegistry就能注冊(cè)系統(tǒng)中所有的視頻和音頻截取設(shè)備

16、。當(dāng)你運(yùn)行了JMFRegistry后,會(huì)彈出圖一所示的窗口:不得用于商業(yè)用途僅供個(gè)人參考圖一通過 JMFRegistry注冊(cè)視頻和音頻截取設(shè)備選擇“ Capture Devices”標(biāo)簽,然后按下“Detect Capture Devices”按鈕,程序?qū)⒆詣?dòng)檢測(cè)出系統(tǒng)中的視頻和音頻截取設(shè)備。在左邊的類表框中會(huì)列出所有檢測(cè)到的設(shè)備的名稱。在圖一中我們看到JMFRegsitery發(fā)現(xiàn)了 JavaSound audio capture、vfw:Logitech USB Video Camera:0和 vfw:Microsoft WDM Image Capture (Win32):1。單擊某個(gè)設(shè)備可

17、以看到該設(shè)備支持的視頻或音頻格式。如果JMFRegistry 無法檢測(cè)到設(shè)備,有可能是沒有正常安裝設(shè)備的驅(qū)動(dòng)程序。例子程序由于 JMF2.1 比較復(fù)雜,我不可能在在例子中包含JMF2.1 支持的所有功能。因此我選擇了下面幾個(gè)在JMF中比較常用的功能:播放多媒體、注冊(cè)音頻和視頻截取設(shè)備、截取視頻和音頻。1播放多媒體在 JMF.java 中有一個(gè) play ()方法。該方法可以播放用戶選擇的多媒體文件。 當(dāng)播放多媒體文件時(shí), 你需要一個(gè) Player 對(duì)象。在例子中, dualPlayer 就是 Player 接口的實(shí)現(xiàn)對(duì)象。Player dualPlayer;在 Play ()方法中,通過使用F

18、ileDialog獲得媒體文件的路徑和文件名,并保存在filename中。try FileDialog fd =new FileDialog(this, "Select File", FileDialog.LOAD);fd.show();String filename = fd.getDirectory() + fd.getFile();.catch (Exception e) ;然后你需要通過媒體管理器Manager 間接創(chuàng)建一個(gè)Player對(duì)象。你可以使用Manager 類的 createPlayer()方法或者createProcessor()方法來獲得一個(gè)Playe

19、r對(duì)象或 Processor對(duì)象。在 play ()方法中,我使用的是createPlayer()方法。不得用于商業(yè)用途僅供個(gè)人參考dualPlayer = Manager.createPlayer(new MediaLocator(" + filename);有時(shí)你需要使用一個(gè)Player對(duì)象來控制多個(gè)其他的Player和 Controller對(duì)象,我們把這個(gè)Player對(duì)象稱為主對(duì)象,并把這些對(duì)象組成一個(gè)組。通過調(diào)用主對(duì)象中的start ()、 stop ()、 setMediaTime ()等方法就可以激活組中所有成員的相應(yīng)方法。主對(duì)象控制所有的狀態(tài)變化和事件發(fā)布。然后使用ad

20、dControllerListerner()方法來將一個(gè)ControllerListener對(duì)象綁定到 Player對(duì)象上, Controller對(duì)象將向該ControllerListener對(duì)象發(fā)送事件消息。dualPlayer.addControllerListener(this);最后需要調(diào)用start ()方法來啟動(dòng)Player對(duì)象。 start ()方法將Player對(duì)象的狀態(tài)設(shè)置為Started 。如果 Player沒有被實(shí)體化( Realize )或預(yù)?。?Prefetch ), start()方法會(huì)自動(dòng)執(zhí)行這些操作。dualPlayer.start();由于 JMF類實(shí)現(xiàn)了Co

21、ntrollerLister接口,因此需要實(shí)現(xiàn)該接口中的controllerUpdate()方法,該方法在Controller對(duì)象產(chǎn)生一個(gè)事件時(shí)被調(diào)用。public synchronized void controllerUpdate(ControllerEvent event) if (event instanceof RealizeCompleteEvent) Component comp;if (comp = dualPlayer.getVisualComponent() != null)add ("Center", comp);if (comp = dualPlay

22、er.getControlPanelComponent() != null)add("South", comp);validate();當(dāng) JMF類產(chǎn)生了一個(gè)RealizeCompleteEvent事件后, controllerUpdate()方法在界面上增加兩個(gè)Component對(duì)象,一個(gè)用于播放媒體,一個(gè)用于放置控制按鈕,例如播放、停止等。在運(yùn)行程序的過程中,程序會(huì)產(chǎn)生下面的輸出。Starting player .source=,previous=Unrealized,current=Realizing,target=StartedOpen log file: C:te

23、stJavaJMFJMFjmf.logsource=,duration=不得用于商業(yè)用途僅供個(gè)人參考source=,previous=Realizing,current=Realized,target=StartedAdding visual componentAdding control panelsource=,previous=Realized,current=Prefetching,target=Startedsource=,previous=Prefetching,current=Prefetched,target=Startedsource=,previous=Prefetched

24、,current=Started,target=Started,mediaTime=,timeBaseTime=source=,previous=Started,current=Prefetched,target=Prefetched,mediaTime=前面提到,當(dāng)調(diào)用start ()方法的時(shí)候,Player會(huì)切換到Started狀態(tài)。從上面列出的信息中可以看到Player對(duì)象的狀態(tài)從 Unrealized變成了 Started 。當(dāng) EndOfMedia 事件被激活時(shí)(這時(shí)Player對(duì)象完成了媒體文件的播放),狀態(tài)從Started變成了 Prefetched。圖二顯示了程序正在播放多媒體

25、文件時(shí)的情況。不得用于商業(yè)用途僅供個(gè)人參考圖二程序正在播放媒體文件2注冊(cè)音頻和視頻截取設(shè)備在例子中,注冊(cè)音頻和視頻截取設(shè)備的方法只在程序的內(nèi)部注冊(cè)這些設(shè)備,在程序外則不起作用。該方法的作用是當(dāng)用戶的計(jì)算機(jī)上存在多和音頻和視頻截取設(shè)備時(shí),告訴程序因該使用哪個(gè)設(shè)備和這些設(shè)備支持的音頻和視頻格式。因此在進(jìn)行截取處理之前需要獲得設(shè)備的配置信息。在例子中,當(dāng)在 Configure 菜單上按下 Capture Device 命令后,會(huì)彈出 CaptureDeviceDialog 對(duì)話框。如果在截取音頻或視頻前沒有設(shè)定設(shè)備的配置,也會(huì)彈出該對(duì)話框。圖三顯示了該對(duì)話框。圖三設(shè)備注冊(cè)對(duì)話框讓我們來看一下Capt

26、ureDeviceDialog類中的 init()方法:在初始化了界面之后,通過調(diào)用CaptureDeviceManager類的getDeviceList()方法:devices = CaptureDeviceManager.getDeviceList ( null );CaptureDeviceManager類使用查詢機(jī)制和一個(gè)注冊(cè)表來定位設(shè)備,然后將設(shè)備的信息放入CaptureDeviceInfo對(duì)象中返回。 我們還可以利用CaptureDeviceManager類來注冊(cè)新的設(shè)備。通過調(diào)用 getDeviceList()方法程序獲取了一個(gè)支持指定格式的設(shè)備的列表。在例子中,我將格式參數(shù)設(shè)定

27、為null ,這意味著設(shè)備可以使用任何格式。返回值被放入device變量中。如果getDeviceList()方法返回的是一個(gè)非空值,程序會(huì)將包含在其中的音頻設(shè)備名稱和視頻設(shè)備名稱分別放入兩個(gè)下拉列表中中,但是到目前為止我們還不知道哪些設(shè)備是音頻設(shè)備,哪些是視頻設(shè)備。我們可以通過CaptureDeviceInfo的 getFormat ()方法獲得 Format 對(duì)象組數(shù), 在 Format 對(duì)象中保存了設(shè)備支持的媒體格式。Format 類間接被AudioFormat 和 VideoFormat 類所繼承。因此我們可以利用設(shè)備支持的格式類型來區(qū)分設(shè)備的類型:不得用于商業(yè)用途僅供個(gè)人參考if (

28、devices!=null &#38;&#38; devices.size()>0) int deviceCount = devices.size();audioDevices = new Vector();videoDevices = new Vector();Format formats;for ( int i = 0; i < deviceCount; i+ ) cdi = (CaptureDeviceInfo) devices.elementAt ( i );formats = cdi.getFormats();for ( int j=0; j<for

29、mats.length; j+ ) if ( formatsj instanceof AudioFormat ) audioDevices.addElement(cdi);break;else if (formatsj instanceof VideoFormat ) videoDevices.addElement(cdi);break;. . .上面的程序運(yùn)行后,audioDevices ()中將包含所有的音頻設(shè)備,videoDevices ()中將保存所有的視頻設(shè)備。其中cdi 是CaptureDeviceInfo對(duì)象。然后將設(shè)備名稱填入下拉列表中:/ 將音頻設(shè)備顯示在下拉列表中for (

30、int i=0; i<audioDevices.size(); i+) cdi = (CaptureDeviceInfo) audioDevices.elementAt(i); audioDeviceCombo.addItem(cdi.getName();/ 將視頻設(shè)備顯示在下拉列表中for (int i=0; i<videoDevices.size(); i+) cdi = (CaptureDeviceInfo) videoDevices.elementAt(i);videoDeviceCombo.addItem(cdi.getName();然后程序顯示出當(dāng)前選中的設(shè)備支持的格式

31、:displayAudioFormats();displayVideoFormats();下一步需要獲取用戶選中的音頻設(shè)備和視頻設(shè)備以及它們支持的格式,相關(guān)的方法是JMF類中的 getAudioDevice()、getVideoDevice()、 getAudioFormat ()和 getVideoFormat ()方法。然后將獲取的對(duì)象分別保存到audioCDI , videoCDI ,audioFormat和 videoFormat 中:不得用于商業(yè)用途僅供個(gè)人參考audioCDI = cdDialog.getAudioDevice();if (audioCDI!=null) audio

32、DeviceName = audioCDI.getName();Audio Device Name: " + audioDeviceName);videoCDI = cdDialog.getVideoDevice();if (videoCDI!=null) videoDeviceName = videoCDI.getName();Video Device Name: " + videoDeviceName);/ 獲得選中的多媒體格式videoFormat = cdDialog.getVideoFormat();audioFormat = cdDialog.getAudioF

33、ormat();3截取視頻和音頻使用 capture ()方法可以截取音頻和視頻數(shù)據(jù)。但是在使用該方法前需要確定是否已經(jīng)選中了視頻和音頻截取設(shè)備:if (audioCDI=null &#38;&#38; videoCDI=null)registerDevices();和 play ()方法類似,可以通過使用Manger 類中的靜態(tài)方法createPlayer()創(chuàng)建一個(gè)Player對(duì)象,該對(duì)象可以播放一個(gè)DataSource 對(duì)象中的數(shù)據(jù)流。Player createPlayer(MediaLocator sourceLocator)在例子中,我首先通過調(diào)用audioCDI 和

34、 videoCDI 的 getLocator()方法來獲得MediaLocator對(duì)象,然后利用Manager 類的createPlayer()方法創(chuàng)建Player對(duì)象。最后將一個(gè)ControllerListener對(duì)象綁定到視頻Player對(duì)象上并開始播放。videoPlayer = Manager.createPlayer(videoCDI.getLocator();audioPlayer = Manager.createPlayer(audioCDI.getLocator();videoPlayer.addControllerListener(this);videoPlayer.start();audioPlayer.start();使用這種方法導(dǎo)致最后獲得了兩個(gè)Player對(duì)象。我們也可以使用Manager 類中的 createDataSource()方法從視頻和音頻CaptureDeviceInfo對(duì)象( audioCID 和 videoCDI )中獲得視頻和音頻數(shù)據(jù)源(DataSource 對(duì)象

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論