版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 畢 業(yè) 論 文(設(shè)計(jì))</p><p> 題 目:基于JMF的視頻播放器設(shè)計(jì)和實(shí)現(xiàn) </p><p> 學(xué) 號(hào): </p><p> 姓 名: </p><p> 年 級(jí): 2008
2、級(jí) </p><p> 學(xué) 院: 信息科學(xué)技術(shù)學(xué)院 </p><p> 系 別: 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 專(zhuān) 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 指導(dǎo)教師:
3、 </p><p> 完成日期: </p><p><b> 摘 要</b></p><p> 隨著多媒體技術(shù)的發(fā)展和人們對(duì)視頻,音頻數(shù)據(jù)的需求,越來(lái)越多的軟件加入了多媒體功能。</p><p> JMF(Java Media Framework API)是
4、一種采用Java語(yǔ)言開(kāi)發(fā)流式媒體應(yīng)用應(yīng)用程序接口。它作為Java Media API技術(shù)家族的一個(gè)重要組成部分,對(duì)Java平臺(tái)進(jìn)行了擴(kuò)展,為媒體應(yīng)用開(kāi)發(fā)人員提供了增強(qiáng)的媒體開(kāi)發(fā)能力。Java多媒體框架中包含了許多用于處理多媒體的API,所支持的功能包括:可以在Java Applet和應(yīng)用程序中播放各種媒體文件,例如AU、AVI、MIDI、MPEG、QuickTime和WAV等文件;可以播放從互聯(lián)網(wǎng)上下載的媒體流;可以利用麥克風(fēng)和攝像機(jī)一
5、類(lèi)的設(shè)備截取音頻和視頻,并保存成多媒體文件;處理多媒體文件,轉(zhuǎn)換文件格式;向互聯(lián)網(wǎng)上傳音頻和視頻數(shù)據(jù)流;在互聯(lián)網(wǎng)上廣播音頻和視頻數(shù)據(jù)等。 </p><p> 當(dāng)前的視頻播放器有用各種不同的語(yǔ)言和技術(shù)實(shí)現(xiàn)的,使用JAVA語(yǔ)言編寫(xiě)的視頻播放器有其獨(dú)特的優(yōu)勢(shì):Java跨平臺(tái),使得通過(guò)JMF API開(kāi)發(fā)的多媒體應(yīng)用同其他Java應(yīng)用一樣,擁有“一次開(kāi)發(fā),到處運(yùn)行”(write once, run anywhere)的
6、特點(diǎn)。</p><p> 本系統(tǒng)旨在使用JMF編寫(xiě)一個(gè)視頻播放器,首先通過(guò)GUI設(shè)計(jì)出視頻播放器的界面,然后通過(guò)偽代碼設(shè)計(jì),最后將偽代碼翻譯為JAVA代碼。最終播放器實(shí)現(xiàn)本地視頻,音頻播放,以及視頻音頻信息,音量調(diào)節(jié),暫停等一般播放器功能。</p><p> 關(guān)鍵詞:Java多媒體框架;視頻;播放器</p><p><b> Abstract <
7、;/b></p><p> Summary with the development of multimedia technology and the video, audio data needs, more and more software has joined the multimedia functionality. </p><p> JMF (Java Media
8、Framework API) is an application development and streaming media applications using Java language interfaces. As an important component of the Java Media API technologies family, the Java platform has been extended for t
9、he media development for application developers with enhanced capabilities. Java multimedia framework in the contains has many for processing multimedia of API, by support of function including: can in Java Applet and ap
10、plication in the play various media file, su</p><p> Current video player, useful for a wide variety of languages and technologies, video player written using the JAVA language has its unique advantage: cro
11、ss-platform Java, made by JMF API development of multimedia applications as with other Java applications, with "development once, run everywhere" (write once, run anywhere) features. </p><p> T
12、his system is designed to write a video player using JMF and achieve general player functions, and add some personalization features. </p><p> Keywords: Java media framework, video ,video player</p>
13、<p><b> 目 錄</b></p><p><b> 1引言1</b></p><p><b> 1.1項(xiàng)目背景1</b></p><p> 1.2技術(shù)現(xiàn)狀與發(fā)展趨勢(shì)1</p><p> 1.3論文組織結(jié)構(gòu)2</p><p
14、><b> 2技術(shù)背景3</b></p><p> 2.1 JMF結(jié)構(gòu)3</p><p> 2.1.1定義JMF3</p><p> 2.1.2JMF體系結(jié)構(gòu)簡(jiǎn)介3</p><p> 2.1.3時(shí)間模型4</p><p> 2.1.4管理器5</p>
15、;<p> 2.1.5事件模型5</p><p> 2.1.6數(shù)據(jù)模型6</p><p> 2.1.7控制6</p><p> 2.2PLAYER對(duì)象7</p><p> 3系統(tǒng)分析與設(shè)計(jì)17</p><p> 3.1需求分析17</p><p>
16、 3.1.1功能分析17</p><p> 3.1.2軟硬件環(huán)境分析17</p><p> 3.2概要設(shè)計(jì)17</p><p> 3.2.1初步設(shè)計(jì)17</p><p> 3.2.2GUI設(shè)計(jì)17</p><p> 3.2.3視頻播放器原理20</p><p>
17、3.2.4偽代碼設(shè)計(jì)20</p><p><b> 4系統(tǒng)的實(shí)現(xiàn)24</b></p><p> 4.1定義類(lèi)的說(shuō)明24</p><p> 4.2程序代碼24</p><p> 4.2.1代碼編寫(xiě)24</p><p> 4.2.2程序代碼整體分析32</p>
18、<p> 4.2.3MediaPlayer構(gòu)造函數(shù)33</p><p> 4.2.4SetupMenu構(gòu)造程序菜單34</p><p> 4.3系統(tǒng)操作演示36</p><p><b> 5總結(jié)40</b></p><p><b> 致 謝41</b><
19、;/p><p><b> 參考文獻(xiàn)42</b></p><p><b> 1引言</b></p><p><b> 項(xiàng)目背景 </b></p><p> 隨著互聯(lián)網(wǎng)和帶寬的日益發(fā)展,視頻播放已經(jīng)不再是單純個(gè)人行為,同時(shí)也不僅局限在本地電腦。從2006年開(kāi)始,網(wǎng)絡(luò)視頻發(fā)展日
20、新月益,出現(xiàn)了很多網(wǎng)絡(luò)視頻播放器,許多著名網(wǎng)站都提供視頻文件的搜索,還有很多的視頻網(wǎng)站提供視頻文件的免費(fèi)下載,視頻在互聯(lián)網(wǎng)上的共享已經(jīng)是大勢(shì)所趨,在授權(quán)的情況下,世界任何地方的任何視頻進(jìn)入網(wǎng)絡(luò)可以得到迅速的共享。</p><p> 另一方面,使用網(wǎng)絡(luò)下載視頻文件的用戶日益增加,互聯(lián)網(wǎng)上的視頻共享是網(wǎng)絡(luò)時(shí)代的一個(gè)非常重要的應(yīng)用,擁有非常大的用戶群。下載視頻文件要播放則必須使用視頻播放軟件,因此編制好的視頻播放軟件
21、有非常實(shí)際的現(xiàn)實(shí)意義。</p><p> 當(dāng)前的視頻播放器有用各種不同的語(yǔ)言和技術(shù)實(shí)現(xiàn)的,使用JAVA語(yǔ)言編寫(xiě)的視頻播放器有獨(dú)特的優(yōu)勢(shì):Java跨平臺(tái),使得通過(guò)JMF API開(kāi)發(fā)的多媒體應(yīng)用同其他Java應(yīng)用一樣,擁有“一次開(kāi)發(fā),到處運(yùn)行”(write once, run anywhere)的特點(diǎn)。JMF為多媒體的獲取、播放、處理和傳輸定義了統(tǒng)一的體系結(jié)構(gòu)、消息處理機(jī)制和程序設(shè)計(jì)接口,提供給開(kāi)發(fā)者一個(gè)可以擴(kuò)展的
22、并且跨平臺(tái)的強(qiáng)大的媒體工具,并完全支持RTP/RTCP協(xié)議。因此使用Java 語(yǔ)言開(kāi)發(fā)視頻播放器是理所當(dāng)然的。</p><p> 1.2 技術(shù)現(xiàn)狀與發(fā)展趨勢(shì)</p><p> Java是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱(chēng)Java語(yǔ)言)和Java平臺(tái)的總稱(chēng)。Java平臺(tái)由Java虛擬機(jī)(Java Virtual Machine)和
23、Java 應(yīng)用編程接口(Application Programming Interface、簡(jiǎn)稱(chēng)API)構(gòu)成。Java 應(yīng)用編程接口為Java應(yīng)用提供了一個(gè)獨(dú)立于操作系統(tǒng)的標(biāo)準(zhǔn)接口,可分為基本部分和擴(kuò)展部分。在硬件或操作系統(tǒng)平臺(tái)上安裝一個(gè)Java平臺(tái)之后,Java應(yīng)用程序就可運(yùn)行?,F(xiàn)在Java平臺(tái)已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運(yùn)行。Java語(yǔ)言吸收了Smalltalk語(yǔ)言和C++語(yǔ)言的優(yōu)
24、點(diǎn),并增加了其它特性,如支持并發(fā)程序設(shè)計(jì)、網(wǎng)絡(luò)通信、和多媒體數(shù)據(jù)控制等。</p><p> Java媒體架構(gòu)(JMF)是一個(gè)令人激動(dòng)的通用的API,它允許Java開(kāi)發(fā)者用許多不同的方法處理媒體。該核心框架支持不同媒體(如:音頻輸出和視頻輸出)間的時(shí)鐘同步。它是一個(gè)標(biāo)準(zhǔn)的擴(kuò)展框架,允許用戶制作純音頻流和視頻流。</p><p> Sun以四種不同的專(zhuān)用版本提供JMF 2.1.1技術(shù),滿足
25、專(zhuān)業(yè)開(kāi)發(fā)人員的各類(lèi)需求,第一個(gè)是一個(gè)輕便型版本,它完全采用Java語(yǔ)言編寫(xiě),適用于任何Java兼容系統(tǒng)。此外,開(kāi)發(fā)人員還可選 擇分別適用于Solaris、Windows或Linux等操作系統(tǒng)的性能最優(yōu)化軟件包,以提高性能和能力。 </p><p> JMF 2.1.1軟件也是Java Media系列軟件的一部分。Java Media系列軟件包括Java 3D、Java 2D、Java Sound和Java Ad
26、vanced Imaging等API。采用各種Java Media API,軟件開(kāi)發(fā)商人員就能容易、快速地為他們已有的各種應(yīng)用程序和客戶端Java小程序增添豐富的媒體功能,如流式視頻、3D圖像和影像處理等。就是說(shuō),各種Java Media API發(fā)揮了Java平臺(tái)的固有優(yōu)勢(shì),將"編寫(xiě)一次,到處運(yùn)行"的能力擴(kuò)展到了圖像、影像和數(shù)字媒體等各種應(yīng)用領(lǐng)域,從而大大縮減了開(kāi)發(fā)時(shí)間和降低了開(kāi)發(fā)成本。</p><
27、;p> 1.3 論文組織結(jié)構(gòu)</p><p> 第一部分 引言 描述項(xiàng)目背景,闡述了Java和JMF技術(shù)的現(xiàn)狀和發(fā)展趨勢(shì)。</p><p> 第二部分 技術(shù)背景 詳細(xì)的介紹系統(tǒng)中使用的JMF技術(shù)。</p><p> 第三部分 系統(tǒng)設(shè)計(jì) 闡述系統(tǒng)設(shè)計(jì)的思想以及采用的一些方法。</p><p> 第四部分 系統(tǒng)實(shí)現(xiàn) 對(duì)在系統(tǒng)開(kāi)發(fā)
28、的相關(guān)成果和問(wèn)題進(jìn)行總結(jié),并給出了重要的相關(guān)代碼。</p><p><b> 2 技術(shù)背景</b></p><p><b> 2.1 JMF結(jié)構(gòu)</b></p><p> 2.1.1 定義JMF</p><p> JMF實(shí)際上是Java的一個(gè)類(lèi)包。JMF 2.1.1技術(shù)提供了先進(jìn)的媒體處理能
29、力,從而擴(kuò)展了Java平臺(tái)的功能。這些功能包括:媒體捕獲、壓縮、流轉(zhuǎn)、回放,以及對(duì)各種主要媒體形式和編碼的支 持,如M-JPEG、H.263、MP3、RTP/RTSP (實(shí)時(shí)傳送協(xié)議和實(shí)時(shí)流轉(zhuǎn)協(xié)議)、Macromedias Flash、IBM的HotMedia和Beatniks的Rich Media Format (RMF)等。JMF 2.1.1還支持廣受歡迎的媒體類(lèi)型,如Quicktime、Microsofts AVI和MPEG-1等
30、。此外,JMF 2.1.1軟件中包括了一個(gè)開(kāi)放的媒體架構(gòu),可使開(kāi)發(fā)人員靈活采用各種媒體回放、捕獲組件,或采用他們自己的定制的內(nèi)插組件。</p><p> 2.1.2 JMF體系結(jié)構(gòu)簡(jiǎn)介</p><p> 在開(kāi)發(fā)JMF 應(yīng)用程序之前要完全理解JMF 的體系架構(gòu)、接口和類(lèi)。就拿我們的家用攝像機(jī)系統(tǒng)作個(gè)例子。首先用攝像機(jī)拍攝內(nèi)容,拍攝下來(lái)的內(nèi)容錄制在DV帶中。DV帶可以放在放像機(jī)里播放、放像
31、機(jī)提供視頻信號(hào)給電視機(jī),提供音頻信號(hào)給音箱,這樣我們就可以在電視機(jī)上看到畫(huà)面,從音箱里聽(tīng)到聲音。JMF API 提供的也是同樣的模型。</p><p> JMF 提供的模型可大致分為七類(lèi) </p><p> 數(shù)據(jù)源(Data source)</p><p> 截取設(shè)備(Capture Device)</p><p> 播放器(Play
32、er)</p><p> 處理器(Processor)</p><p> 數(shù)據(jù)池(Data Sink)</p><p> 數(shù)據(jù)格式(Format)</p><p> 管理器(Manager)</p><p> 圖2-1 傳統(tǒng)的多媒體數(shù)據(jù)處理設(shè)備與JMF的比較</p><p> JMF
33、高層結(jié)構(gòu)正如圖所示,數(shù)據(jù)源(Data Source)就像一盒磁帶一樣封裝了媒體數(shù)據(jù)流,而播放器(Player)提供了像VCR一樣的機(jī)制處理和控制數(shù)據(jù)。</p><p> 2..1.3時(shí)間模型</p><p> 圖2-2 JMF時(shí)間模型</p><p> JMF的時(shí)間精準(zhǔn)到納秒級(jí),雖然在Java中其他的類(lèi)也支持納秒級(jí)的時(shí)間,但是在JMF中,一個(gè)時(shí)間點(diǎn)一般用Ti
34、me對(duì)象來(lái)表示。</p><p> 支持JMF時(shí)間模型的類(lèi)必須實(shí)現(xiàn)Clock才能追蹤媒體數(shù)據(jù)流。Clock接口定義了基本的時(shí)間定位盒同步操作,而這些操作在表現(xiàn)媒體數(shù)據(jù)時(shí)是必須的。</p><p> Clock中的數(shù)據(jù)media time表示在媒體流中的當(dāng)前的位置。流的開(kāi)頭是媒體時(shí)間0,流的最后是媒體時(shí)間的最大時(shí)間。媒體流的持續(xù)時(shí)間(Duration)是媒體數(shù)據(jù)流的從開(kāi)始到結(jié)束的經(jīng)歷的時(shí)
35、間。</p><p><b> 2.1.4 管理器</b></p><p> 通過(guò)使用管理器(Manager)這個(gè)對(duì)象,JMF使得用戶實(shí)現(xiàn)的新的關(guān)鍵接口與已存在的類(lèi)無(wú)縫對(duì)接。管理器模型使用了工廠模式。</p><p> 使用JMF來(lái)完成程序時(shí),我們需要使用Manager的create方法來(lái)構(gòu)造Player,Processors,DataS
36、ink,DataSource來(lái)為你的應(yīng)用程序服務(wù)。例如如果你式通過(guò)一個(gè)輸入設(shè)備捕獲媒體數(shù)據(jù),你將會(huì)使用CapturtDeviceManager來(lái)找出哪些設(shè)備是可用的,并且通過(guò)這些對(duì)象來(lái)獲取相關(guān)信息。</p><p> 2.1.5 事件模型</p><p> 圖 2-3 JMF事件模型</p><p> JMF使用一個(gè)結(jié)構(gòu)化的事件報(bào)告機(jī)制來(lái)使得應(yīng)用程序來(lái)與當(dāng)前
37、的媒體的狀態(tài)來(lái)保持通信。同時(shí)它還使得基于JMF的程序能夠響應(yīng)媒體驅(qū)動(dòng)的錯(cuò)誤狀況,比如說(shuō)資源部可獲得這種情況。當(dāng)JMF對(duì)象需要報(bào)告當(dāng)前的情況時(shí),它會(huì)拋出MediaEvent。MediaEvent由許多特定類(lèi)型的事件。對(duì)于每一個(gè)可以拋出MediaEvent的對(duì)象,JMF定義了相應(yīng)的監(jiān)聽(tīng)者對(duì)象。</p><p> 2.1.6 數(shù)據(jù)模型</p><p> 圖 2-4 JMF數(shù)據(jù)模型</p
38、><p> JMF媒體播放器經(jīng)常使用DataSource來(lái)管理媒體內(nèi)容的轉(zhuǎn)移。DataSource封裝了媒體位置,使用的協(xié)議等信息,這些信息式用來(lái)傳輸媒體的。</p><p> DataSource是通過(guò)JMF中的MediaLocator或者URL來(lái)指明的。MediaLocator與URL相似并且能通過(guò)一個(gè)URL構(gòu)造,但是它與URL的區(qū)別是即使在相應(yīng)的協(xié)議處理沒(méi)被安裝的情況下它也能被構(gòu)造,
39、而URL不行。</p><p><b> 2.1.7 控制</b></p><p> 圖 2-6 JMF控制</p><p> JMF控制提供了一種機(jī)制來(lái)設(shè)置和查詢對(duì)象的屬性??刂破饕话闾峁┫鄳?yīng)的用戶接口的訪問(wèn),通過(guò)訪問(wèn)來(lái)改變對(duì)象的屬性。許多JMF對(duì)象都可獲得控制器接口,包括DataSource對(duì)象,DataSink對(duì)象和JMF plug
40、-ins。</p><p> 2.2 Player 對(duì)象</p><p> 1.創(chuàng)建一個(gè)Player對(duì)象</p><p> 通過(guò)使用媒體Manager 來(lái)直接創(chuàng)建一個(gè)Player對(duì)象,要顯示這個(gè)Player對(duì)象,你獲取這個(gè)對(duì)象的組件并且將這些組件加到你的applet的外觀或者應(yīng)用程序的窗口中。</p><p> 當(dāng)你想創(chuàng)建一
41、個(gè)新的Player對(duì)象時(shí),你通過(guò)Manager的createPlayer或者createProcessor的方法創(chuàng)建它。Manager通過(guò)使用你指定的媒體的URL對(duì)象或者M(jìn)ediaLocator對(duì)象來(lái)創(chuàng)建一個(gè)合適的對(duì)象。URL對(duì)象只有在相關(guān)的URLSteeamHandler被安裝的情況下才能被正確的構(gòu)造,而MediaLocator則沒(méi)有這個(gè)限制。</p><p> 2.在Player對(duì)象未識(shí)別(Realized
42、)前阻塞</p><p> 許多可以被Player對(duì)象調(diào)用的方法要求Player對(duì)象在已被識(shí)別(Realized)的狀態(tài)。保證當(dāng)你調(diào)用這些方法之前Player對(duì)象已經(jīng)被識(shí)別的方法是使用Manager提供的createRealizedPlayer方法來(lái)創(chuàng)建Player對(duì)象。這個(gè)方法提供了一個(gè)便捷的方式在一步就創(chuàng)建并且識(shí)別(Realize)一個(gè)Player對(duì)象。當(dāng)這個(gè)方法被調(diào)用時(shí),它會(huì)阻塞直到這個(gè)Player對(duì)象被
43、識(shí)別。Manager也提供了一個(gè)相同的createRealizedProcessor方法來(lái)創(chuàng)建一個(gè)已識(shí)別的Processor對(duì)象。</p><p> 注意:阻塞Player對(duì)象或者Processor對(duì)象直到被識(shí)別可能引起不好的結(jié)果。比如,如果createRealizedPlayer在一個(gè)applet中被調(diào)用,Applet.start和Applet.stop將不能打斷Player對(duì)象的構(gòu)造過(guò)程。</p>
44、;<p> 3.顯示媒體接口組件</p><p> Player對(duì)象一般有兩種類(lèi)型的用戶接口組件,一個(gè)可視化組件和一個(gè)控制板組件。有些Player實(shí)現(xiàn)可以顯示額外的組件,比如說(shuō)音量控制和下載進(jìn)度條。</p><p> 4.顯示一個(gè)可視化組件</p><p> 如果有,一個(gè)可視化組件就是Player對(duì)象表現(xiàn)媒體的可視化表示。即使一個(gè)音頻播放器也有
45、可能有一個(gè)可視化組件,比如說(shuō)波形顯示或者其它生動(dòng)的特性。</p><p> 要顯示Player對(duì)象的可視化組件:</p><p> (1)通過(guò)調(diào)用getVisualComponent得到組件。</p><p> (2)將它加到applet的外觀表示或者應(yīng)用程序的窗口中。</p><p> 你可以通過(guò)它的可視化組件訪問(wèn)Player對(duì)象的
46、的顯示屬性,如它的x,y坐標(biāo)。Player組件的布局受到AWT布局管理器的控制。</p><p> 5.顯示控制面板組件</p><p> Player對(duì)象通常有一個(gè)控制板允許用戶控制媒體的表示。比如說(shuō),一個(gè)Player對(duì)象可能一個(gè)有開(kāi)始按鈕,結(jié)束按鈕,暫停按鈕和一個(gè)用來(lái)調(diào)控音量的滑動(dòng)條與其關(guān)聯(lián)。</p><p> 每一個(gè)Player對(duì)象提供一個(gè)默認(rèn)的控制板。
47、要顯示這個(gè)默認(rèn)的控制板:</p><p> (1)調(diào)用getControlPanelComponent得到組件。</p><p> (2)將返回的組件加到applet的外觀表示和應(yīng)用程序的窗口。</p><p> 如果你選擇定義一個(gè)定制的用戶接口,你可以實(shí)現(xiàn)GUI 組件并且調(diào)用正確的Player方法來(lái)響應(yīng)用戶的動(dòng)作。如果你將這個(gè)定制組件注冊(cè)成Controlle
48、rListener,當(dāng)Player對(duì)象的狀態(tài)改變時(shí),你也可以更新這個(gè)組件。</p><p> 6.顯示一個(gè)增益控制組件</p><p> Player對(duì)象的實(shí)現(xiàn)支持音頻增益調(diào)節(jié)的GainControl接口。GainControl提供方法調(diào)節(jié)有尿頻的音量,如setLevel和setMute。如果Player對(duì)象提供了GainControl組件要顯示它。</p><p&
49、gt; (1)調(diào)用getGainControl從Player對(duì)象獲得GainControl,如果返回為空,則Player不支持GainControl接口。</p><p> (2)在返回的GainControl上調(diào)用getControlComponent。</p><p> (3)將返回的組件加到applet的外觀表示或者應(yīng)用程序的窗口上。</p><p>
50、 注意getControls方法不返回Player對(duì)象的GainControl。你只能通過(guò)調(diào)用getGainControl來(lái)訪問(wèn)GainControl。</p><p> 7.顯示一般的控制組件</p><p> 許多Player對(duì)象有可以被用戶控制的其他的屬性。比如說(shuō),一個(gè)視頻Player對(duì)象可能允許用戶調(diào)整亮度和對(duì)比度,但是他們不是通過(guò)Player接口來(lái)管理。你可以通過(guò)調(diào)用getC
51、ontrols來(lái)得知一個(gè)Player對(duì)象支持哪些一般的控制。</p><p> 比如說(shuō),你可以調(diào)用getControls來(lái)得知一個(gè)Player對(duì)象是否支持CachingControl接口。</p><p> 8.顯示一個(gè)下載進(jìn)度組件</p><p> CachingControl接口是控制的特殊類(lèi)型,它被Player對(duì)象實(shí)現(xiàn),能夠報(bào)告它的下載進(jìn)度。Cachin
52、gControl提供了一個(gè)默認(rèn)的進(jìn)度條組件。這個(gè)組件會(huì)自動(dòng)的隨著下載進(jìn)度而更新。要在applet中使用默認(rèn)的進(jìn)度條:</p><p> 實(shí)現(xiàn)ControllerListener接口,并且在ControllerUpdate方法中監(jiān)聽(tīng)CachingControlEvent。</p><p> 當(dāng)你第一次收到一個(gè)CachingControlEvent:</p><p>
53、; (1)當(dāng)事件到達(dá)時(shí)調(diào)用getCachingControl方法得到緩沖控制。</p><p> (2)在CachingControl上調(diào)用getProgressBar以得到默認(rèn)的進(jìn)度條組件。</p><p> (3)將進(jìn)度條組件加入到你的applet外觀組件上。</p><p> 每次你收到一個(gè)CachingControlEvert,檢查下載是否已經(jīng)完成。
54、當(dāng)getContentProgress返回的值與getContentLength一樣,移除進(jìn)度條。</p><p> 當(dāng)進(jìn)度條需要更新時(shí),Player對(duì)象拋出一個(gè)CachingControlEvent。如果你實(shí)現(xiàn)你自己的進(jìn)度條組件,當(dāng)CachingControlEvent被拋出時(shí),你應(yīng)該能監(jiān)聽(tīng)這個(gè)事件并且更新進(jìn)度條。</p><p><b> 9.設(shè)置播放速率</b&g
55、t;</p><p> Player對(duì)象的速率決定媒體時(shí)間相對(duì)時(shí)間基線怎樣變化,它定義了當(dāng)時(shí)間基線的一個(gè)單位前進(jìn)的時(shí)候,媒體時(shí)間遷移幾個(gè)單位。Player對(duì)象的速率可以被認(rèn)為是一個(gè)暫時(shí)的刻度因素。比如說(shuō),當(dāng)Player開(kāi)始后,速率為2.0代表媒體時(shí)間的前進(jìn)速度是時(shí)間基線時(shí)間前進(jìn)的兩倍。</p><p> 理論上,一個(gè)Player對(duì)象的速率可以被設(shè)置為任何值,負(fù)值代表反向的播放媒體。然而
56、,有些媒體的格式依賴(lài)于幀,所以反向的播放或者在非標(biāo)準(zhǔn)的速率上播放它是不可能的,也是不實(shí)際的。</p><p> 要設(shè)置速率,你調(diào)用setRate并且傳入一個(gè)浮點(diǎn)類(lèi)型的值作為這個(gè)暫時(shí)的刻度因素。當(dāng)setRate被調(diào)用時(shí),這個(gè)方法返回當(dāng)前的設(shè)置,即使它沒(méi)被改變。Player對(duì)象僅保證支持1.0的速率。</p><p><b> 10.設(shè)置開(kāi)始位置</b></p&
57、gt;<p> 設(shè)置Player對(duì)象的媒體時(shí)間相當(dāng)于在一個(gè)媒體流中設(shè)置讀取的位置。對(duì)于象文件這樣的媒體數(shù)據(jù)源,媒體時(shí)間是有界限的,最大的媒體時(shí)間定義為媒體流結(jié)束的時(shí)間。</p><p> 要設(shè)置媒體時(shí)間,你調(diào)用setMediaTime并且傳入一個(gè)Time對(duì)象,這個(gè)對(duì)象代表你想設(shè)置的時(shí)間。</p><p><b> 11.幀定位</b></p&
58、gt;<p> 有些Player對(duì)象允許你定位到一個(gè)視頻的特殊幀。這使得你可以簡(jiǎn)單的找到開(kāi)始位置的特殊幀而不必指明這個(gè)位置的精確的時(shí)間。支持幀定位的Player對(duì)象實(shí)現(xiàn)了FramePositioningControl。</p><p> 要設(shè)置幀的位置,你調(diào)用FranePositioningControl的seek方法。當(dāng)你查找一幀時(shí),Player對(duì)象的媒體時(shí)間的值將會(huì)設(shè)置成那一幀的開(kāi)始時(shí)間,同
59、時(shí)一個(gè)MediaTimeEvent將會(huì)被拋出。</p><p> 有些Player對(duì)象可以將媒體時(shí)間和幀的位置進(jìn)行轉(zhuǎn)換。如果支持轉(zhuǎn)換,你可以使用FramePositioningControl的mapFrameToTime和mapTimeToFrame方法來(lái)獲得這些信息。(支持FramePositioningControl的Player對(duì)象不需要導(dǎo)出這個(gè)信息。)注意在媒體時(shí)間和幀之間不存在一一對(duì)應(yīng)的關(guān)系—幀是一段
60、持續(xù)的時(shí)間,所以一些不同的媒體時(shí)間可能會(huì)對(duì)應(yīng)同一幀。</p><p><b> 12.準(zhǔn)備開(kāi)始</b></p><p> 大多數(shù)Player對(duì)象不能立即開(kāi)始。在播放開(kāi)始前,某些硬件和軟件的狀況需要被滿足。比如說(shuō),如果一Player對(duì)象之前從未開(kāi)始過(guò),則它需要分配緩存來(lái)存儲(chǔ)媒體數(shù)據(jù)?;蛘呷绻襟w數(shù)據(jù)在網(wǎng)絡(luò)設(shè)備上,Player對(duì)象可能需要在下載數(shù)據(jù)之前建立一個(gè)網(wǎng)絡(luò)連接
61、。即使Player對(duì)象以前曾經(jīng)播放過(guò),緩存區(qū)在當(dāng)前的媒體位置也可能包含無(wú)效的數(shù)據(jù)。</p><p> 13.識(shí)別(Realizing)和預(yù)取(Prefetching)Player對(duì)象</p><p> JMF將一個(gè)Player對(duì)象的準(zhǔn)備過(guò)程分成兩個(gè)階段,識(shí)別(Realizing)和預(yù)取(Prefetching)。在開(kāi)始一個(gè)Player對(duì)象之前進(jìn)行識(shí)別和預(yù)取使得當(dāng)你調(diào)用start方法時(shí)能
62、最小化開(kāi)始播放媒體的時(shí)間,并且為用戶幫助創(chuàng)建一個(gè)響應(yīng)迅速,具有交互性的Player對(duì)象。實(shí)現(xiàn)ControllerListener接口使得當(dāng)這些操作發(fā)生時(shí)你能夠控制它。</p><p> 注意:Processor在準(zhǔn)備過(guò)程中引入了第三個(gè)階段,稱(chēng)為配置(Configuring)。在這個(gè)階段中,Processor的選項(xiàng)能夠被選擇以指定Processor怎樣來(lái)操縱媒體數(shù)據(jù)。要得到更多的信息,請(qǐng)查閱選擇跟蹤處理選項(xiàng)。&l
63、t;/p><p> 你調(diào)用realize方法將Player對(duì)象進(jìn)入識(shí)別(Realizing)狀態(tài)并且開(kāi)始識(shí)別過(guò)程。你調(diào)用prefetch方法將Player對(duì)象進(jìn)入預(yù)取中(prefetching)狀態(tài)并初始化預(yù)取過(guò)程。Realize和prefetch方法都是異步的并且會(huì)立即返回。當(dāng)Player對(duì)象完成了要求的動(dòng)作時(shí),它會(huì)拋出RealizeCompleteEvent或者PrefetchCompleteEvent。Pla
64、yer對(duì)象的狀態(tài)描述了Player對(duì)象在這些狀態(tài)下的動(dòng)作。</p><p> Player對(duì)象在預(yù)取狀態(tài)下準(zhǔn)備開(kāi)始播放,而且它啟動(dòng)反應(yīng)時(shí)間不能再被減少。然而通過(guò)setMediaTime設(shè)定媒體時(shí)間可能使Player對(duì)象返回到被識(shí)別(Realized)狀態(tài)并且同時(shí)使得啟動(dòng)時(shí)延增加。</p><p> 記住一個(gè)在預(yù)取完畢的Player對(duì)象與系統(tǒng)資源相關(guān)。因?yàn)橛行┵Y源,比如說(shuō)聲卡,可能一次僅
65、僅能被一個(gè)程序使用,有一個(gè)在預(yù)取完畢的Player對(duì)象生存時(shí)可能會(huì)阻止其它Player對(duì)象開(kāi)始。</p><p><b> 14.獲取開(kāi)始時(shí)延</b></p><p> 要得到需要多少時(shí)間啟動(dòng)Player對(duì)象,你可以調(diào)用getStartLatency。對(duì)于有可變開(kāi)始時(shí)延的Player對(duì)象,getStartLatency的返回時(shí)間將會(huì)是最大的可能開(kāi)始時(shí)延。對(duì)于某些媒
66、體類(lèi)型,getStartLatency可能會(huì)返回LATENCY_UNKNOWN。</p><p> getStartLatency返回的開(kāi)始時(shí)延可能會(huì)因?yàn)镻layer對(duì)象當(dāng)前的狀態(tài)不同而不同。比如說(shuō),在完成了一個(gè)預(yù)取的動(dòng)作后,由getStartLatency返回的值通常會(huì)更小。一個(gè)可以被加入到Player對(duì)象的Controller對(duì)象將會(huì)返回一個(gè)有用的值一旦它被預(yù)取后。</p><p>
67、<b> 15.開(kāi)始表現(xiàn)</b></p><p> 一般你會(huì)通過(guò)調(diào)用start方法來(lái)開(kāi)始表現(xiàn)一個(gè)媒體流。Start方法通知Player對(duì)象盡可能快的開(kāi)始表現(xiàn)媒體數(shù)據(jù)。如果必須,start方法通過(guò)完成識(shí)別和預(yù)取的操作使得Player對(duì)象開(kāi)始播放。如果start方法是被一個(gè)已被開(kāi)始(started)的Player對(duì)象調(diào)用,唯一的效果是一個(gè)StartEvent將被拋出。</p>
68、<p> 時(shí)鐘定義了syncStart方法以用來(lái)同步化。請(qǐng)查閱同步多個(gè)媒體流獲取更多的信息。</p><p> 要使得Player對(duì)象在指明點(diǎn)開(kāi)始媒體流:</p><p> (1)通過(guò)調(diào)用setMeidaTime指明你想開(kāi)始的媒體流的點(diǎn)。</p><p> (2)在Player對(duì)象上調(diào)用start方法。</p><p>&l
69、t;b> 16.停止表現(xiàn)</b></p><p> 有四種情況媒體的表現(xiàn)將會(huì)停止:</p><p> (1)當(dāng)stop方法被調(diào)用時(shí)。</p><p> (2)當(dāng)指定的停止的時(shí)間到達(dá)時(shí)。</p><p> (3)當(dāng)沒(méi)有更多的媒體數(shù)據(jù)時(shí)。</p><p> (4)當(dāng)被接收的媒體數(shù)據(jù)相對(duì)于可接受
70、的播放速率說(shuō)太慢時(shí)。</p><p> 當(dāng)Player對(duì)象停止時(shí),如果媒體源能被控制,它的媒體時(shí)間將被凍結(jié)。如果Player對(duì)象在表現(xiàn)流式媒體,則可能不能凍結(jié)媒體時(shí)間。在這種情況下,僅僅是媒體數(shù)據(jù)的接收被停止—數(shù)據(jù)繼續(xù)被流式化,媒體時(shí)間繼續(xù)前進(jìn)。</p><p> 要立即停止一個(gè)Player對(duì)象,你調(diào)用stop方法。如果你在一個(gè)處于停止(Stopeed)狀態(tài)的Player對(duì)象調(diào)用sto
71、p方法,唯一的效果是StopByRequestEvent被拋出。</p><p> 17.在一個(gè)指定的時(shí)間停止表現(xiàn)</p><p> 你可以調(diào)用setStopTime方法來(lái)指明什么時(shí)候該停止Player對(duì)象。Player對(duì)象在到達(dá)指定的停止時(shí)間將停止。如果Player對(duì)象的速率是正值,Player對(duì)象將在媒體時(shí)間大于或者等于停止時(shí)間時(shí)停止。如果Player對(duì)象的速率是負(fù)值,Player
72、對(duì)象將在媒體時(shí)間小于或者等于停止時(shí)間時(shí)停止。如果當(dāng)前的媒體時(shí)間已經(jīng)大于指定的停止時(shí)間,Player對(duì)象將立即停止。</p><p> 比如說(shuō),假定一個(gè)Player對(duì)象的媒體時(shí)間是5.0并且setStopTime設(shè)定停止時(shí)間是6.0、如果Player對(duì)象的速率是正值,媒體時(shí)間正在增加,Player對(duì)象在媒體時(shí)間大于或者等于6.0的時(shí)候?qū)⑼V?。然而如果Player對(duì)象的速率是負(fù)值,它將反向播放,這時(shí)Player對(duì)象
73、將會(huì)立即停止,因?yàn)槊襟w時(shí)間已經(jīng)超過(guò)了停止時(shí)間。</p><p> 你也可以在一個(gè)停止(Stopped)狀態(tài)的Player對(duì)象上調(diào)用setStopTime方法。然而你只能設(shè)置停止時(shí)間在處于已開(kāi)始(Started)的Player對(duì)象上,如果停止時(shí)間當(dāng)前還沒(méi)有設(shè)定。如果已開(kāi)始(Started)的Player對(duì)象已經(jīng)有一個(gè)停止時(shí)間,setStopTime拋出一個(gè)錯(cuò)誤。</p><p> 你可以
74、調(diào)用getStopTime來(lái)得到當(dāng)前已安排的停止時(shí)間。如果時(shí)鐘沒(méi)有安排的停止時(shí)間,getStopTime方法將返回Clock.RESET。要移除停止時(shí)間以讓Player對(duì)象持續(xù)的播放直到它到達(dá)媒體結(jié)束,調(diào)用setStopTime(Clock.RESET)。</p><p> 18.釋放Player對(duì)象的資源</p><p> Deallocate方法使得Player對(duì)象釋放所有的獨(dú)占資
75、源并且最小化非獨(dú)占資源。雖然對(duì)于Player對(duì)象的緩存和存儲(chǔ)管理未被指明,大多數(shù)Player按照J(rèn)ava對(duì)象的標(biāo)準(zhǔn)分配那么大的緩存。當(dāng)deallocate方法調(diào)用時(shí)一個(gè)較好實(shí)現(xiàn)的Player對(duì)象盡量釋放多的內(nèi)部存儲(chǔ)。</p><p> Deallocate方法只能被處于已停止(Stopped)狀態(tài)的Player對(duì)象調(diào)用。為了避免ClockStartedErrors,你應(yīng)該在調(diào)用deallocate方法前調(diào)用st
76、op方法。在正在預(yù)取(prefetching)和預(yù)取完畢(prefetched)狀態(tài)下的Player對(duì)象上調(diào)用deallocate方法使得這個(gè)Player會(huì)返回到被識(shí)別(Realized)狀態(tài)。如果在Player對(duì)象在正在識(shí)別(Realizing)狀態(tài)下調(diào)用deallocate方法,Player對(duì)象將會(huì)拋出DeallocateEvent并且返回到未被識(shí)別(Unrealized)狀態(tài)下。(一旦一個(gè)Player對(duì)象被識(shí)別,它將不能返回到未被
77、識(shí)別(Unrealized)狀態(tài)。)</p><p> 一般情況下你在Player對(duì)象現(xiàn)在未被使用的時(shí)候調(diào)用deallocate方法。比如說(shuō),一個(gè)applet應(yīng)該調(diào)用deallocate方法作為它的stop方法的一部分。通過(guò)調(diào)用deallocate方法,當(dāng)釋放其它資源為系統(tǒng)整體來(lái)使用時(shí),程序?qū)⒕S護(hù)一個(gè)指向Player對(duì)象的引用。(JMF不會(huì)限制一個(gè)以前被預(yù)取完畢(Prefetched)或者開(kāi)始(Started)
78、的現(xiàn)處于已識(shí)別(Realized)狀態(tài)的Player對(duì)象維護(hù)信息,而這些信息將使得Player對(duì)象在未來(lái)某個(gè)時(shí)刻會(huì)更快的開(kāi)始。)</p><p> 當(dāng)你使用完一個(gè)Player對(duì)象(或者其他的控制器)并不打算在以后用到,你應(yīng)該調(diào)用close方法。Close方法暗示控制器(controller)將不會(huì)再被用到并能被自己關(guān)閉。調(diào)用colse方法會(huì)使得控制器(controller)釋放所有占用的資源,導(dǎo)致它停止所有的活
79、動(dòng)。當(dāng)一個(gè)控制器(Controller)被關(guān)閉后,它會(huì)拋出ControllrClosedEvent。一個(gè)已經(jīng)關(guān)閉的控制器(Controller)不能被重新打開(kāi),在一個(gè)已經(jīng)關(guān)閉的控制器(Controller)調(diào)用方法將會(huì)產(chǎn)生錯(cuò)誤。</p><p> 19.查詢Player對(duì)象</p><p> Player對(duì)象可以提供關(guān)于它當(dāng)前的參數(shù)的信息,這些參數(shù)包括速率,媒體時(shí)間,持續(xù)時(shí)間。<
80、/p><p><b> 20.獲得播放速率</b></p><p> 要獲得Player對(duì)象當(dāng)前的速率,你調(diào)用getRate方法。調(diào)用這個(gè)方法將會(huì)返回一個(gè)浮點(diǎn)型數(shù)據(jù)作為速率的值。</p><p><b> 21.獲得媒體時(shí)間</b></p><p> 要獲得Player對(duì)象當(dāng)前的媒體時(shí)間,你調(diào)用
81、getMediaTime。調(diào)用getMeidaTime返回一個(gè)Time類(lèi)型的對(duì)象作為當(dāng)前的媒體時(shí)間。如果player對(duì)象沒(méi)有在表現(xiàn)媒體數(shù)據(jù),返回媒體表現(xiàn)開(kāi)始的時(shí)間點(diǎn)。</p><p> 注意媒體時(shí)間和幀之間不存在一對(duì)一的關(guān)系。每個(gè)幀表現(xiàn)的是一段時(shí)間,而媒體時(shí)間在這個(gè)期間仍然會(huì)繼續(xù)前進(jìn)。</p><p> 22.獲取時(shí)間基線的時(shí)間</p><p> 通過(guò)得到Ti
82、meBase對(duì)象再調(diào)用getTime方法,你可以得到一個(gè)Player對(duì)象的當(dāng)前時(shí)間基線時(shí)間:</p><p> myCurrentTBTime = player1.getTimeBase().getTime();</p><p> 當(dāng)一個(gè)Player正在運(yùn)行時(shí),通過(guò)調(diào)用mapToTimeBase方法,你可以得到相對(duì)于一個(gè)特殊的媒體時(shí)間的時(shí)間基線的時(shí)間。 </p><
83、;p> 23.取媒體流的持續(xù)時(shí)間</p><p> 因?yàn)槌绦蚪?jīng)常需要得知一個(gè)特定的媒體流要運(yùn)行多久時(shí)間,所有的控制器(Controller)都實(shí)現(xiàn)了Duration接口。這個(gè)接口定義了一個(gè)單一的方法,getDuration。如果速率是1.0,持續(xù)時(shí)間代表了一個(gè)媒體對(duì)象將會(huì)運(yùn)行的時(shí)間長(zhǎng)度。一個(gè)媒體流的持續(xù)時(shí)間僅能通過(guò)Player對(duì)象得到。</p><p> 如果持續(xù)時(shí)間不能通過(guò)g
84、etDuration調(diào)用返回,將會(huì)返回DURATION_UNKNOWN。如果Player對(duì)象還沒(méi)有達(dá)到一個(gè)可以得到媒體源的持續(xù)時(shí)間的狀態(tài)時(shí),就會(huì)出現(xiàn)這種情況。在稍后的時(shí)間,持續(xù)時(shí)間可能會(huì)能得到,此時(shí)調(diào)用getDuration將會(huì)返回持續(xù)時(shí)間。如果媒體源沒(méi)有一個(gè)已定義的持續(xù)時(shí)間,比如說(shuō)一個(gè)直播的廣播,getDuration返回DURATION_UNBOUNDED。</p><p><b> 3 系統(tǒng)分析
85、與設(shè)計(jì)</b></p><p><b> 3.1需求分析</b></p><p><b> 3.1.1功能分析</b></p><p> 首先我們來(lái)看看構(gòu)造這個(gè)視頻播放器要達(dá)到什么樣的目標(biāo),確定了目標(biāo)也就確定了代碼量和程序的復(fù)雜程度。視頻播放器是一個(gè)菜單驅(qū)動(dòng)的簡(jiǎn)單AWT應(yīng)用,我用JMF所做的視頻播放器要達(dá)
86、到如下目標(biāo):</p><p> 視頻播放器包含“File” “Action” 兩個(gè)菜單。</p><p> “File”文件菜單包含兩個(gè)子菜單項(xiàng):“Open”“Exit”。</p><p> “Open”,用來(lái)打開(kāi)本地硬盤(pán)中的媒體文件。</p><p> “Exit”,退出播放程序。 </p><p> “A
87、ction”文件菜單包含兩個(gè)子菜單項(xiàng):“Play”“Stop”。</p><p> “Play”,開(kāi)始播放視頻。</p><p> “Stop”,停止播放當(dāng)前視頻。</p><p> 3.1.2 軟硬件環(huán)境分析</p><p> 視頻播放器可以在多種平臺(tái)上運(yùn)行。</p><p> 視頻播放器的核心功能通過(guò)JM
88、F(Java Media Framework)API實(shí)現(xiàn)。JMF擴(kuò)展了J2SE平臺(tái)的多媒體能力,允許Java應(yīng)用和Applet截取、回放、轉(zhuǎn)換包括音頻和視頻在內(nèi)的多種媒體。</p><p><b> 3.2概要設(shè)計(jì)</b></p><p> 3.2.1 初步設(shè)計(jì)</p><p> 我們把這個(gè)媒體播放器的設(shè)計(jì)分成兩個(gè)部分:GUI設(shè)計(jì),偽代碼
89、設(shè)計(jì)。在GUI設(shè)計(jì)中,我們要了解構(gòu)成程序的各個(gè)GUI部件。在偽代碼設(shè)計(jì)中,我們用自然語(yǔ)言寫(xiě)出程序運(yùn)行原理。</p><p> 3.2.2 GUI設(shè)計(jì) </p><p> 視頻播放器的用戶界面包含一個(gè)主窗口、兩個(gè)菜單和一個(gè)打開(kāi)文件的對(duì)話框。首先我們來(lái)看看主窗口的設(shè)計(jì)。主窗口把窗口標(biāo)題顯示為“08計(jì)算機(jī)-MC視頻播放器”,顯示“File”“Action” 菜單。下圖顯示了程序剛啟動(dòng)時(shí)的主窗
90、口。</p><p> 圖 3-1 視頻播放器啟動(dòng)時(shí)主窗口</p><p> “File”菜單包含兩個(gè)子菜單項(xiàng)?!癘pen”菜單顯示一個(gè)對(duì)話框,用來(lái)選擇本地媒體文件的位置。“Exit”菜單關(guān)閉視頻播放程序。另外,點(diǎn)擊主窗口右上角的關(guān)閉按鈕也可以關(guān)閉程序。</p><p> 圖 3-2“File”菜單</p><p> “Action”
91、菜單包含兩個(gè)子菜單項(xiàng)。“Play”菜單開(kāi)始播放當(dāng)前視頻?!癝top”菜單暫停播放當(dāng)前視頻。</p><p> 圖 3-3“Action”菜單</p><p> 點(diǎn)擊“File/Open”菜單時(shí),“Choose Video”對(duì)話框出現(xiàn)。選中媒體文件之后,點(diǎn)擊“打開(kāi)”按鈕即可打開(kāi)媒體文件;點(diǎn)擊“取消”按鈕中止文件打開(kāi)操作。</p><p> 圖 3-4 “Choo
92、se Video”窗口</p><p> 除了上面提到的部件之外,視頻播放器還包含一個(gè)視覺(jué)部件、一個(gè)控制面板部件。視覺(jué)部件順序播放媒體文件包含的各幀圖像;控制面板部件允許用戶調(diào)整媒體音量高低,或進(jìn)行其他控制操作,例如查看媒體文件信息。</p><p> 3.2.3 視頻播放器原理</p><p> 為了播放媒體,首先需要一個(gè)媒體播放器Player對(duì)象,這可以通
93、過(guò)“Open”菜單獲得。播放器完成從數(shù)據(jù)源接受數(shù)據(jù),申請(qǐng)播放資源,并以精確的時(shí)間順序根據(jù)每一道的數(shù)據(jù)格式分別提交到各自的資源目標(biāo),揚(yáng)聲器、顯示器,整個(gè)過(guò)程和關(guān)系如下圖所示:</p><p> 播放器對(duì)象Player具有若干種狀態(tài),大致可以分成創(chuàng)建播放器、判定請(qǐng)求資源、提交數(shù)據(jù)、播放媒體數(shù)據(jù)等狀態(tài) ,Java提供了ControllerListener接口來(lái)監(jiān)聽(tīng)Player對(duì)象的各個(gè)狀態(tài)之間轉(zhuǎn)變時(shí)的事件,并完成相應(yīng)
94、的處理。 </p><p> 3.2.4偽代碼設(shè)計(jì)</p><p> 前面我們了解了構(gòu)成視頻播放器GUI的各個(gè)部件,下面要開(kāi)始“設(shè)想”一下這個(gè)程序的具體構(gòu)造。在正式編寫(xiě)代碼之前,我們先用偽代碼的形式寫(xiě)出這個(gè)程序的運(yùn)行過(guò)程,以后正式編寫(xiě)代碼時(shí)只需把偽代碼翻譯成Java代碼即可。下面給出了視頻播放器的偽代碼描述:</p><p> 應(yīng)用的類(lèi)名稱(chēng):Media,超類(lèi):
95、Frame</p><p> 監(jiān)聽(tīng)器分類(lèi):動(dòng)作事件,控制器事件,菜單項(xiàng)事件,繪圖事件,窗口事件 </p><p><b> main: </b></p><p> * 為Media對(duì)象分配內(nèi)存。調(diào)用Media構(gòu)造函數(shù),創(chuàng)建主窗口(同時(shí),隱含地創(chuàng)建/啟動(dòng)了AWT后臺(tái)線程)</p><p> * 結(jié)束主程序線程。此時(shí)
96、AWT線程繼續(xù)運(yùn)行。</p><p> Media構(gòu)造函數(shù):</p><p> * 設(shè)置主窗口的標(biāo)題 * 注冊(cè)窗口監(jiān)聽(tīng)器,以處理窗口關(guān)閉事件 * 創(chuàng)建“File”菜單 * 創(chuàng)建“Open”菜單項(xiàng)* 把Media對(duì)象注冊(cè)成為“Open”菜單項(xiàng)動(dòng)作事件的監(jiān)聽(tīng)器 * 把“Open”菜單項(xiàng)加入“File”菜單。 * 在“File”菜單中加入一條水平分隔線 * 按照創(chuàng)建“Open”
97、菜單項(xiàng)的過(guò)程,創(chuàng)建“Exit”菜單項(xiàng) * 創(chuàng)建一個(gè)菜單條(MenuBar) </p><p> * 把“File”菜單加入到菜單條 </p><p> * 創(chuàng)建“Action”菜單 * 創(chuàng)建“Play”菜單項(xiàng)* 把Media對(duì)象注冊(cè)成為“Play”菜單項(xiàng)動(dòng)作事件的監(jiān)聽(tīng)器 * 把“Play”菜單項(xiàng)加入“Action”菜單。 * 在“Action”菜單中加入一條水平分隔線 *
98、按照創(chuàng)建“Play”菜單項(xiàng)的過(guò)程,創(chuàng)建“Stop”菜單項(xiàng) * 創(chuàng)建一個(gè)菜單條(MenuBar) </p><p> * 把“File”“Action”菜單加入到菜單條* 把新創(chuàng)建的菜單條設(shè)置為主窗口的菜單條 * 把主窗口的大小設(shè)置為500*350像素 * 顯示主窗口 * 結(jié)束構(gòu)造函數(shù) 動(dòng)作監(jiān)聽(tīng)器: 當(dāng)出現(xiàn)動(dòng)作時(shí): * 如果動(dòng)作事件起源于“Exit”菜單項(xiàng), * 觸發(fā)一個(gè)給窗口監(jiān)聽(tīng)器的窗口關(guān)閉事
99、件 * 返回 * 創(chuàng)建一個(gè)“Choose Video”對(duì)話框 * 把對(duì)話框的當(dāng)前目錄設(shè)置為上次關(guān)閉時(shí)的目錄 * 顯示對(duì)話框。這個(gè)對(duì)話框是一個(gè)模式對(duì)話框 * 如果用戶沒(méi)有通過(guò)對(duì)話框選擇媒體文件 * 返回 * 保存用戶在對(duì)話框中選擇的目錄 * 如果以前已經(jīng)創(chuàng)建JMF播放器對(duì)象 * 關(guān)閉該對(duì)象 * 根據(jù)指定的目錄和名字,創(chuàng)建一個(gè)使用file:協(xié)議的媒體定位器(MediaLocator)對(duì)象,再利用該對(duì)象創(chuàng)建一個(gè)JMF播放器
100、對(duì)象 * 如果出現(xiàn)異常 * 顯示錯(cuò)誤信息,然后返回 * 把主窗口的標(biāo)題設(shè)置為媒體文件的名字 </p><p> * 把Media對(duì)象注冊(cè)為來(lái)自JMF播放器對(duì)象的控制器事件的監(jiān)聽(tīng)器</p><p> * 讓JMF播放器對(duì)象預(yù)先提取媒體內(nèi)容 * 返回 控制器監(jiān)聽(tīng)器: 當(dāng)控制器被關(guān)閉: * 如果JMF播放器的視覺(jué)部件存在,從Media容器拆除視覺(jué)部件 * 如果JMF播放器的控
101、制面板部件存在,從Media容器拆除控制面板部件 * 返回 當(dāng)預(yù)提取媒體內(nèi)容結(jié)束: * JMF播放器對(duì)象開(kāi)始播放媒體 * 返回 當(dāng)實(shí)例化(realize)完成: * 獲取JMF播放器對(duì)象的視覺(jué)部件 * 如果視覺(jué)部件存在,則把它加入到Media容器的中間 * 獲取JMF播放器對(duì)象的控制面板部件 * 如果控制面板部件存在,則把它加入到Media容器的南方 * 執(zhí)行pack()操作* 返回 窗口監(jiān)聽(tīng)器: window
102、Closing: * 調(diào)用dispose以執(zhí)行windowClosed * 返回 windowClosed: * 如果已經(jīng)創(chuàng)建JMF播放器對(duì)象 * 關(guān)閉JMF播放器對(duì)象 * 結(jié)束程序 </p><p> 偽代碼的前面三行聲明了媒體播放器的類(lèi)名稱(chēng)、超類(lèi)的名稱(chēng)和Media類(lèi)實(shí)現(xiàn)的監(jiān)聽(tīng)器。帶有main:前綴的行表示Media的main()方法。類(lèi)似地,帶有“構(gòu)造函數(shù):”前綴的行屬于Media的構(gòu)造函數(shù)。偽
103、代碼的其余內(nèi)容分成五個(gè)監(jiān)聽(tīng)器分區(qū):動(dòng)作監(jiān)聽(tīng)器,控制器監(jiān)聽(tīng)器,菜單項(xiàng)監(jiān)聽(tīng)器,窗口監(jiān)聽(tīng)器。每一個(gè)分區(qū)分別包含一個(gè)或多個(gè)方法。</p><p><b> 4 系統(tǒng)的實(shí)現(xiàn)</b></p><p> 4.1自定義類(lèi)的說(shuō)明</p><p> 類(lèi)名: MediaPlayer 作用: 主類(lèi) 繼承的父類(lèi): JFrame類(lèi) 實(shí)現(xiàn)的接口: Action
104、Listener, ControllerListener 主要方法說(shuō)明: MediaPlayer構(gòu)造方法,設(shè)置對(duì)象的數(shù)據(jù)成員,完成窗口(包括菜單)的設(shè)置等。</p><p> SetupMenu方法,用于構(gòu)造程序窗口的菜單,被MediaPlayer調(diào)用。</p><p> ActionPerformed方法監(jiān)聽(tīng)來(lái)對(duì)象的菜單事件,根據(jù)相應(yīng)命令做出相應(yīng)的反映。</p>&
105、lt;p> ControllerUpdate方法用于處理JMF傳出的關(guān)于播放器的事件。要進(jìn)行正常播放,必須利用這個(gè)方法捕捉合適的事件并調(diào)用Player相應(yīng)的方法來(lái)實(shí)現(xiàn)。</p><p><b> 4.2 程序代碼</b></p><p> 4.2.1 代碼編寫(xiě)</p><p> 我們把3.2.3的偽代碼轉(zhuǎn)換成jav代碼:</
106、p><p> import java.awt.*;</p><p> import java.awt.event.ActionEvent;</p><p> import java.awt.event.ActionListener;</p><p> import java.awt.event.WindowAdapter;</p&g
107、t;<p> import java.awt.event.WindowEvent;</p><p> import javax.media.ControllerEvent;</p><p> import javax.media.ControllerListener;</p><p> import javax.media.MediaLocat
108、or;</p><p> import javax.media.RealizeCompleteEvent;</p><p> import javax.media.bean.playerbean.MediaPlayer;</p><p> import javax.swing.JPanel;</p><p> import javax
109、.swing.JFrame;</p><p> import javax.swing.SwingUtilities;</p><p> import javax.swing.JList;</p><p> import java.awt.BorderLayout;</p><p> import javax.swing.JSplitP
110、ane;</p><p> import java.awt.Component;</p><p> import java.util.Vector;</p><p> public class JMF_MC extends JFrame implements ControllerListener, ActionListener {</p><
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 音樂(lè)播放器畢業(yè)設(shè)計(jì)
- 音樂(lè)播放器畢業(yè)設(shè)計(jì)論文
- ios音樂(lè)播放器畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)論文 音樂(lè)播放器設(shè)計(jì)
- 視頻播放器設(shè)計(jì)開(kāi)題報(bào)告
- directshow視頻播放器
- ios_音樂(lè)播放器畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)--基于ios平臺(tái)的視頻播放器的設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)設(shè)計(jì)----播放器的設(shè)計(jì)與實(shí)現(xiàn)
- android視頻播放器課程設(shè)計(jì)
- 利用vc++設(shè)計(jì)視頻播放器
- 可編程音樂(lè)播放器 畢業(yè)設(shè)計(jì)
- 可編程音樂(lè)播放器畢業(yè)設(shè)計(jì)
- 手機(jī)視頻播放器開(kāi)發(fā)【畢業(yè)論文】
- vc視頻播放器的設(shè)計(jì)與實(shí)現(xiàn)
- 媒體播放器的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)-單片機(jī)音樂(lè)播放器設(shè)計(jì)
- 基于android平臺(tái)的視頻播放器(論文范文+畢業(yè)設(shè)計(jì)源代碼)
- 基于SoC FPGA的視頻播放器設(shè)計(jì).pdf
- 畢業(yè)設(shè)計(jì)---基于單片機(jī)的音樂(lè)播放器
評(píng)論
0/150
提交評(píng)論