視頻播放器畢業(yè)設(shè)計_第1頁
已閱讀1頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  畢 業(yè) 論 文(設(shè)計)</p><p>  題 目:基于JMF的視頻播放器設(shè)計和實現(xiàn) </p><p>  學 號: </p><p>  姓 名: </p><p>  年 級: 2008

2、級 </p><p>  學 院: 信息科學技術(shù)學院 </p><p>  系 別: 計算機科學與技術(shù) </p><p>  專 業(yè): 計算機科學與技術(shù) </p><p>  指導教師:

3、 </p><p>  完成日期: </p><p><b>  摘 要</b></p><p>  隨著多媒體技術(shù)的發(fā)展和人們對視頻,音頻數(shù)據(jù)的需求,越來越多的軟件加入了多媒體功能。</p><p>  JMF(Java Media Framework API)是

4、一種采用Java語言開發(fā)流式媒體應(yīng)用應(yīng)用程序接口。它作為Java Media API技術(shù)家族的一個重要組成部分,對Java平臺進行了擴展,為媒體應(yīng)用開發(fā)人員提供了增強的媒體開發(fā)能力。Java多媒體框架中包含了許多用于處理多媒體的API,所支持的功能包括:可以在Java Applet和應(yīng)用程序中播放各種媒體文件,例如AU、AVI、MIDI、MPEG、QuickTime和WAV等文件;可以播放從互聯(lián)網(wǎng)上下載的媒體流;可以利用麥克風和攝像機一

5、類的設(shè)備截取音頻和視頻,并保存成多媒體文件;處理多媒體文件,轉(zhuǎn)換文件格式;向互聯(lián)網(wǎng)上傳音頻和視頻數(shù)據(jù)流;在互聯(lián)網(wǎng)上廣播音頻和視頻數(shù)據(jù)等。 </p><p>  當前的視頻播放器有用各種不同的語言和技術(shù)實現(xiàn)的,使用JAVA語言編寫的視頻播放器有其獨特的優(yōu)勢:Java跨平臺,使得通過JMF API開發(fā)的多媒體應(yīng)用同其他Java應(yīng)用一樣,擁有“一次開發(fā),到處運行”(write once, run anywhere)的

6、特點。</p><p>  本系統(tǒng)旨在使用JMF編寫一個視頻播放器,首先通過GUI設(shè)計出視頻播放器的界面,然后通過偽代碼設(shè)計,最后將偽代碼翻譯為JAVA代碼。最終播放器實現(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項目背景1</b></p><p>  1.2技術(shù)現(xiàn)狀與發(fā)展趨勢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)簡介3</p><p>  2.1.3時間模型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對象7</p><p>  3系統(tǒng)分析與設(shè)計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è)計17</p><p>  3.2.1初步設(shè)計17</p><p>  3.2.2GUI設(shè)計17</p><p>  3.2.3視頻播放器原理20</p><p>  

17、3.2.4偽代碼設(shè)計20</p><p><b>  4系統(tǒng)的實現(xiàn)24</b></p><p>  4.1定義類的說明24</p><p>  4.2程序代碼24</p><p>  4.2.1代碼編寫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>  參考文獻42</b></p><p><b>  1引言</b></p><p><b>  項目背景 </b></p><p>  隨著互聯(lián)網(wǎng)和帶寬的日益發(fā)展,視頻播放已經(jīng)不再是單純個人行為,同時也不僅局限在本地電腦。從2006年開始,網(wǎng)絡(luò)視頻發(fā)展日

20、新月益,出現(xiàn)了很多網(wǎng)絡(luò)視頻播放器,許多著名網(wǎng)站都提供視頻文件的搜索,還有很多的視頻網(wǎng)站提供視頻文件的免費下載,視頻在互聯(lián)網(wǎng)上的共享已經(jīng)是大勢所趨,在授權(quán)的情況下,世界任何地方的任何視頻進入網(wǎng)絡(luò)可以得到迅速的共享。</p><p>  另一方面,使用網(wǎng)絡(luò)下載視頻文件的用戶日益增加,互聯(lián)網(wǎng)上的視頻共享是網(wǎng)絡(luò)時代的一個非常重要的應(yīng)用,擁有非常大的用戶群。下載視頻文件要播放則必須使用視頻播放軟件,因此編制好的視頻播放軟件

21、有非常實際的現(xiàn)實意義。</p><p>  當前的視頻播放器有用各種不同的語言和技術(shù)實現(xiàn)的,使用JAVA語言編寫的視頻播放器有獨特的優(yōu)勢:Java跨平臺,使得通過JMF API開發(fā)的多媒體應(yīng)用同其他Java應(yīng)用一樣,擁有“一次開發(fā),到處運行”(write once, run anywhere)的特點。JMF為多媒體的獲取、播放、處理和傳輸定義了統(tǒng)一的體系結(jié)構(gòu)、消息處理機制和程序設(shè)計接口,提供給開發(fā)者一個可以擴展的

22、并且跨平臺的強大的媒體工具,并完全支持RTP/RTCP協(xié)議。因此使用Java 語言開發(fā)視頻播放器是理所當然的。</p><p>  1.2 技術(shù)現(xiàn)狀與發(fā)展趨勢</p><p>  Java是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計語言(以下簡稱Java語言)和Java平臺的總稱。Java平臺由Java虛擬機(Java Virtual Machine)和

23、Java 應(yīng)用編程接口(Application Programming Interface、簡稱API)構(gòu)成。Java 應(yīng)用編程接口為Java應(yīng)用提供了一個獨立于操作系統(tǒng)的標準接口,可分為基本部分和擴展部分。在硬件或操作系統(tǒng)平臺上安裝一個Java平臺之后,Java應(yīng)用程序就可運行?,F(xiàn)在Java平臺已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運行。Java語言吸收了Smalltalk語言和C++語言的優(yōu)

24、點,并增加了其它特性,如支持并發(fā)程序設(shè)計、網(wǎng)絡(luò)通信、和多媒體數(shù)據(jù)控制等。</p><p>  Java媒體架構(gòu)(JMF)是一個令人激動的通用的API,它允許Java開發(fā)者用許多不同的方法處理媒體。該核心框架支持不同媒體(如:音頻輸出和視頻輸出)間的時鐘同步。它是一個標準的擴展框架,允許用戶制作純音頻流和視頻流。</p><p>  Sun以四種不同的專用版本提供JMF 2.1.1技術(shù),滿足

25、專業(yè)開發(fā)人員的各類需求,第一個是一個輕便型版本,它完全采用Java語言編寫,適用于任何Java兼容系統(tǒng)。此外,開發(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,軟件開發(fā)商人員就能容易、快速地為他們已有的各種應(yīng)用程序和客戶端Java小程序增添豐富的媒體功能,如流式視頻、3D圖像和影像處理等。就是說,各種Java Media API發(fā)揮了Java平臺的固有優(yōu)勢,將"編寫一次,到處運行"的能力擴展到了圖像、影像和數(shù)字媒體等各種應(yīng)用領(lǐng)域,從而大大縮減了開發(fā)時間和降低了開發(fā)成本。</p><

27、;p>  1.3 論文組織結(jié)構(gòu)</p><p>  第一部分 引言 描述項目背景,闡述了Java和JMF技術(shù)的現(xiàn)狀和發(fā)展趨勢。</p><p>  第二部分 技術(shù)背景 詳細的介紹系統(tǒng)中使用的JMF技術(shù)。</p><p>  第三部分 系統(tǒng)設(shè)計 闡述系統(tǒng)設(shè)計的思想以及采用的一些方法。</p><p>  第四部分 系統(tǒng)實現(xiàn) 對在系統(tǒng)開發(fā)

28、的相關(guā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實際上是Java的一個類包。JMF 2.1.1技術(shù)提供了先進的媒體處理能

29、力,從而擴展了Java平臺的功能。這些功能包括:媒體捕獲、壓縮、流轉(zhuǎn)、回放,以及對各種主要媒體形式和編碼的支 持,如M-JPEG、H.263、MP3、RTP/RTSP (實時傳送協(xié)議和實時流轉(zhuǎn)協(xié)議)、Macromedias Flash、IBM的HotMedia和Beatniks的Rich Media Format (RMF)等。JMF 2.1.1還支持廣受歡迎的媒體類型,如Quicktime、Microsofts AVI和MPEG-1等

30、。此外,JMF 2.1.1軟件中包括了一個開放的媒體架構(gòu),可使開發(fā)人員靈活采用各種媒體回放、捕獲組件,或采用他們自己的定制的內(nèi)插組件。</p><p>  2.1.2 JMF體系結(jié)構(gòu)簡介</p><p>  在開發(fā)JMF 應(yīng)用程序之前要完全理解JMF 的體系架構(gòu)、接口和類。就拿我們的家用攝像機系統(tǒng)作個例子。首先用攝像機拍攝內(nèi)容,拍攝下來的內(nèi)容錄制在DV帶中。DV帶可以放在放像機里播放、放像

31、機提供視頻信號給電視機,提供音頻信號給音箱,這樣我們就可以在電視機上看到畫面,從音箱里聽到聲音。JMF API 提供的也是同樣的模型。</p><p>  JMF 提供的模型可大致分為七類 </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一樣的機制處理和控制數(shù)據(jù)。</p><p>  2..1.3時間模型</p><p>  圖2-2 JMF時間模型</p><p>  JMF的時間精準到納秒級,雖然在Java中其他的類也支持納秒級的時間,但是在JMF中,一個時間點一般用Ti

34、me對象來表示。</p><p>  支持JMF時間模型的類必須實現(xiàn)Clock才能追蹤媒體數(shù)據(jù)流。Clock接口定義了基本的時間定位盒同步操作,而這些操作在表現(xiàn)媒體數(shù)據(jù)時是必須的。</p><p>  Clock中的數(shù)據(jù)media time表示在媒體流中的當前的位置。流的開頭是媒體時間0,流的最后是媒體時間的最大時間。媒體流的持續(xù)時間(Duration)是媒體數(shù)據(jù)流的從開始到結(jié)束的經(jīng)歷的時

35、間。</p><p><b>  2.1.4 管理器</b></p><p>  通過使用管理器(Manager)這個對象,JMF使得用戶實現(xiàn)的新的關(guān)鍵接口與已存在的類無縫對接。管理器模型使用了工廠模式。</p><p>  使用JMF來完成程序時,我們需要使用Manager的create方法來構(gòu)造Player,Processors,DataS

36、ink,DataSource來為你的應(yīng)用程序服務(wù)。例如如果你式通過一個輸入設(shè)備捕獲媒體數(shù)據(jù),你將會使用CapturtDeviceManager來找出哪些設(shè)備是可用的,并且通過這些對象來獲取相關(guān)信息。</p><p>  2.1.5 事件模型</p><p>  圖 2-3 JMF事件模型</p><p>  JMF使用一個結(jié)構(gòu)化的事件報告機制來使得應(yīng)用程序來與當前

37、的媒體的狀態(tài)來保持通信。同時它還使得基于JMF的程序能夠響應(yīng)媒體驅(qū)動的錯誤狀況,比如說資源部可獲得這種情況。當JMF對象需要報告當前的情況時,它會拋出MediaEvent。MediaEvent由許多特定類型的事件。對于每一個可以拋出MediaEvent的對象,JMF定義了相應(yīng)的監(jiān)聽者對象。</p><p>  2.1.6 數(shù)據(jù)模型</p><p>  圖 2-4 JMF數(shù)據(jù)模型</p

38、><p>  JMF媒體播放器經(jīng)常使用DataSource來管理媒體內(nèi)容的轉(zhuǎn)移。DataSource封裝了媒體位置,使用的協(xié)議等信息,這些信息式用來傳輸媒體的。</p><p>  DataSource是通過JMF中的MediaLocator或者URL來指明的。MediaLocator與URL相似并且能通過一個URL構(gòu)造,但是它與URL的區(qū)別是即使在相應(yīng)的協(xié)議處理沒被安裝的情況下它也能被構(gòu)造,

39、而URL不行。</p><p><b>  2.1.7 控制</b></p><p>  圖 2-6 JMF控制</p><p>  JMF控制提供了一種機制來設(shè)置和查詢對象的屬性??刂破饕话闾峁┫鄳?yīng)的用戶接口的訪問,通過訪問來改變對象的屬性。許多JMF對象都可獲得控制器接口,包括DataSource對象,DataSink對象和JMF plug

40、-ins。</p><p>  2.2 Player 對象</p><p>  1.創(chuàng)建一個Player對象</p><p>  通過使用媒體Manager 來直接創(chuàng)建一個Player對象,要顯示這個Player對象,你獲取這個對象的組件并且將這些組件加到你的applet的外觀或者應(yīng)用程序的窗口中。</p><p>  當你想創(chuàng)建一

41、個新的Player對象時,你通過Manager的createPlayer或者createProcessor的方法創(chuàng)建它。Manager通過使用你指定的媒體的URL對象或者MediaLocator對象來創(chuàng)建一個合適的對象。URL對象只有在相關(guān)的URLSteeamHandler被安裝的情況下才能被正確的構(gòu)造,而MediaLocator則沒有這個限制。</p><p>  2.在Player對象未識別(Realized

42、)前阻塞</p><p>  許多可以被Player對象調(diào)用的方法要求Player對象在已被識別(Realized)的狀態(tài)。保證當你調(diào)用這些方法之前Player對象已經(jīng)被識別的方法是使用Manager提供的createRealizedPlayer方法來創(chuàng)建Player對象。這個方法提供了一個便捷的方式在一步就創(chuàng)建并且識別(Realize)一個Player對象。當這個方法被調(diào)用時,它會阻塞直到這個Player對象被

43、識別。Manager也提供了一個相同的createRealizedProcessor方法來創(chuàng)建一個已識別的Processor對象。</p><p>  注意:阻塞Player對象或者Processor對象直到被識別可能引起不好的結(jié)果。比如,如果createRealizedPlayer在一個applet中被調(diào)用,Applet.start和Applet.stop將不能打斷Player對象的構(gòu)造過程。</p>

44、;<p>  3.顯示媒體接口組件</p><p>  Player對象一般有兩種類型的用戶接口組件,一個可視化組件和一個控制板組件。有些Player實現(xiàn)可以顯示額外的組件,比如說音量控制和下載進度條。</p><p>  4.顯示一個可視化組件</p><p>  如果有,一個可視化組件就是Player對象表現(xiàn)媒體的可視化表示。即使一個音頻播放器也有

45、可能有一個可視化組件,比如說波形顯示或者其它生動的特性。</p><p>  要顯示Player對象的可視化組件:</p><p>  (1)通過調(diào)用getVisualComponent得到組件。</p><p>  (2)將它加到applet的外觀表示或者應(yīng)用程序的窗口中。</p><p>  你可以通過它的可視化組件訪問Player對象的

46、的顯示屬性,如它的x,y坐標。Player組件的布局受到AWT布局管理器的控制。</p><p>  5.顯示控制面板組件</p><p>  Player對象通常有一個控制板允許用戶控制媒體的表示。比如說,一個Player對象可能一個有開始按鈕,結(jié)束按鈕,暫停按鈕和一個用來調(diào)控音量的滑動條與其關(guān)聯(lián)。</p><p>  每一個Player對象提供一個默認的控制板。

47、要顯示這個默認的控制板:</p><p>  (1)調(diào)用getControlPanelComponent得到組件。</p><p>  (2)將返回的組件加到applet的外觀表示和應(yīng)用程序的窗口。</p><p>  如果你選擇定義一個定制的用戶接口,你可以實現(xiàn)GUI 組件并且調(diào)用正確的Player方法來響應(yīng)用戶的動作。如果你將這個定制組件注冊成Controlle

48、rListener,當Player對象的狀態(tài)改變時,你也可以更新這個組件。</p><p>  6.顯示一個增益控制組件</p><p>  Player對象的實現(xiàn)支持音頻增益調(diào)節(jié)的GainControl接口。GainControl提供方法調(diào)節(jié)有尿頻的音量,如setLevel和setMute。如果Player對象提供了GainControl組件要顯示它。</p><p&

49、gt;  (1)調(diào)用getGainControl從Player對象獲得GainControl,如果返回為空,則Player不支持GainControl接口。</p><p>  (2)在返回的GainControl上調(diào)用getControlComponent。</p><p>  (3)將返回的組件加到applet的外觀表示或者應(yīng)用程序的窗口上。</p><p> 

50、 注意getControls方法不返回Player對象的GainControl。你只能通過調(diào)用getGainControl來訪問GainControl。</p><p>  7.顯示一般的控制組件</p><p>  許多Player對象有可以被用戶控制的其他的屬性。比如說,一個視頻Player對象可能允許用戶調(diào)整亮度和對比度,但是他們不是通過Player接口來管理。你可以通過調(diào)用getC

51、ontrols來得知一個Player對象支持哪些一般的控制。</p><p>  比如說,你可以調(diào)用getControls來得知一個Player對象是否支持CachingControl接口。</p><p>  8.顯示一個下載進度組件</p><p>  CachingControl接口是控制的特殊類型,它被Player對象實現(xiàn),能夠報告它的下載進度。Cachin

52、gControl提供了一個默認的進度條組件。這個組件會自動的隨著下載進度而更新。要在applet中使用默認的進度條:</p><p>  實現(xiàn)ControllerListener接口,并且在ControllerUpdate方法中監(jiān)聽CachingControlEvent。</p><p>  當你第一次收到一個CachingControlEvent:</p><p>

53、;  (1)當事件到達時調(diào)用getCachingControl方法得到緩沖控制。</p><p>  (2)在CachingControl上調(diào)用getProgressBar以得到默認的進度條組件。</p><p>  (3)將進度條組件加入到你的applet外觀組件上。</p><p>  每次你收到一個CachingControlEvert,檢查下載是否已經(jīng)完成。

54、當getContentProgress返回的值與getContentLength一樣,移除進度條。</p><p>  當進度條需要更新時,Player對象拋出一個CachingControlEvent。如果你實現(xiàn)你自己的進度條組件,當CachingControlEvent被拋出時,你應(yīng)該能監(jiān)聽這個事件并且更新進度條。</p><p><b>  9.設(shè)置播放速率</b&g

55、t;</p><p>  Player對象的速率決定媒體時間相對時間基線怎樣變化,它定義了當時間基線的一個單位前進的時候,媒體時間遷移幾個單位。Player對象的速率可以被認為是一個暫時的刻度因素。比如說,當Player開始后,速率為2.0代表媒體時間的前進速度是時間基線時間前進的兩倍。</p><p>  理論上,一個Player對象的速率可以被設(shè)置為任何值,負值代表反向的播放媒體。然而

56、,有些媒體的格式依賴于幀,所以反向的播放或者在非標準的速率上播放它是不可能的,也是不實際的。</p><p>  要設(shè)置速率,你調(diào)用setRate并且傳入一個浮點類型的值作為這個暫時的刻度因素。當setRate被調(diào)用時,這個方法返回當前的設(shè)置,即使它沒被改變。Player對象僅保證支持1.0的速率。</p><p><b>  10.設(shè)置開始位置</b></p&

57、gt;<p>  設(shè)置Player對象的媒體時間相當于在一個媒體流中設(shè)置讀取的位置。對于象文件這樣的媒體數(shù)據(jù)源,媒體時間是有界限的,最大的媒體時間定義為媒體流結(jié)束的時間。</p><p>  要設(shè)置媒體時間,你調(diào)用setMediaTime并且傳入一個Time對象,這個對象代表你想設(shè)置的時間。</p><p><b>  11.幀定位</b></p&

58、gt;<p>  有些Player對象允許你定位到一個視頻的特殊幀。這使得你可以簡單的找到開始位置的特殊幀而不必指明這個位置的精確的時間。支持幀定位的Player對象實現(xiàn)了FramePositioningControl。</p><p>  要設(shè)置幀的位置,你調(diào)用FranePositioningControl的seek方法。當你查找一幀時,Player對象的媒體時間的值將會設(shè)置成那一幀的開始時間,同

59、時一個MediaTimeEvent將會被拋出。</p><p>  有些Player對象可以將媒體時間和幀的位置進行轉(zhuǎn)換。如果支持轉(zhuǎn)換,你可以使用FramePositioningControl的mapFrameToTime和mapTimeToFrame方法來獲得這些信息。(支持FramePositioningControl的Player對象不需要導出這個信息。)注意在媒體時間和幀之間不存在一一對應(yīng)的關(guān)系—幀是一段

60、持續(xù)的時間,所以一些不同的媒體時間可能會對應(yīng)同一幀。</p><p><b>  12.準備開始</b></p><p>  大多數(shù)Player對象不能立即開始。在播放開始前,某些硬件和軟件的狀況需要被滿足。比如說,如果一Player對象之前從未開始過,則它需要分配緩存來存儲媒體數(shù)據(jù)?;蛘呷绻襟w數(shù)據(jù)在網(wǎng)絡(luò)設(shè)備上,Player對象可能需要在下載數(shù)據(jù)之前建立一個網(wǎng)絡(luò)連接

61、。即使Player對象以前曾經(jīng)播放過,緩存區(qū)在當前的媒體位置也可能包含無效的數(shù)據(jù)。</p><p>  13.識別(Realizing)和預?。≒refetching)Player對象</p><p>  JMF將一個Player對象的準備過程分成兩個階段,識別(Realizing)和預?。≒refetching)。在開始一個Player對象之前進行識別和預取使得當你調(diào)用start方法時能

62、最小化開始播放媒體的時間,并且為用戶幫助創(chuàng)建一個響應(yīng)迅速,具有交互性的Player對象。實現(xiàn)ControllerListener接口使得當這些操作發(fā)生時你能夠控制它。</p><p>  注意:Processor在準備過程中引入了第三個階段,稱為配置(Configuring)。在這個階段中,Processor的選項能夠被選擇以指定Processor怎樣來操縱媒體數(shù)據(jù)。要得到更多的信息,請查閱選擇跟蹤處理選項。&l

63、t;/p><p>  你調(diào)用realize方法將Player對象進入識別(Realizing)狀態(tài)并且開始識別過程。你調(diào)用prefetch方法將Player對象進入預取中(prefetching)狀態(tài)并初始化預取過程。Realize和prefetch方法都是異步的并且會立即返回。當Player對象完成了要求的動作時,它會拋出RealizeCompleteEvent或者PrefetchCompleteEvent。Pla

64、yer對象的狀態(tài)描述了Player對象在這些狀態(tài)下的動作。</p><p>  Player對象在預取狀態(tài)下準備開始播放,而且它啟動反應(yīng)時間不能再被減少。然而通過setMediaTime設(shè)定媒體時間可能使Player對象返回到被識別(Realized)狀態(tài)并且同時使得啟動時延增加。</p><p>  記住一個在預取完畢的Player對象與系統(tǒng)資源相關(guān)。因為有些資源,比如說聲卡,可能一次僅

65、僅能被一個程序使用,有一個在預取完畢的Player對象生存時可能會阻止其它Player對象開始。</p><p><b>  14.獲取開始時延</b></p><p>  要得到需要多少時間啟動Player對象,你可以調(diào)用getStartLatency。對于有可變開始時延的Player對象,getStartLatency的返回時間將會是最大的可能開始時延。對于某些媒

66、體類型,getStartLatency可能會返回LATENCY_UNKNOWN。</p><p>  getStartLatency返回的開始時延可能會因為Player對象當前的狀態(tài)不同而不同。比如說,在完成了一個預取的動作后,由getStartLatency返回的值通常會更小。一個可以被加入到Player對象的Controller對象將會返回一個有用的值一旦它被預取后。</p><p>

67、<b>  15.開始表現(xiàn)</b></p><p>  一般你會通過調(diào)用start方法來開始表現(xiàn)一個媒體流。Start方法通知Player對象盡可能快的開始表現(xiàn)媒體數(shù)據(jù)。如果必須,start方法通過完成識別和預取的操作使得Player對象開始播放。如果start方法是被一個已被開始(started)的Player對象調(diào)用,唯一的效果是一個StartEvent將被拋出。</p>

68、<p>  時鐘定義了syncStart方法以用來同步化。請查閱同步多個媒體流獲取更多的信息。</p><p>  要使得Player對象在指明點開始媒體流:</p><p>  (1)通過調(diào)用setMeidaTime指明你想開始的媒體流的點。</p><p>  (2)在Player對象上調(diào)用start方法。</p><p>&l

69、t;b>  16.停止表現(xiàn)</b></p><p>  有四種情況媒體的表現(xiàn)將會停止:</p><p>  (1)當stop方法被調(diào)用時。</p><p>  (2)當指定的停止的時間到達時。</p><p>  (3)當沒有更多的媒體數(shù)據(jù)時。</p><p>  (4)當被接收的媒體數(shù)據(jù)相對于可接受

70、的播放速率說太慢時。</p><p>  當Player對象停止時,如果媒體源能被控制,它的媒體時間將被凍結(jié)。如果Player對象在表現(xiàn)流式媒體,則可能不能凍結(jié)媒體時間。在這種情況下,僅僅是媒體數(shù)據(jù)的接收被停止—數(shù)據(jù)繼續(xù)被流式化,媒體時間繼續(xù)前進。</p><p>  要立即停止一個Player對象,你調(diào)用stop方法。如果你在一個處于停止(Stopeed)狀態(tài)的Player對象調(diào)用sto

71、p方法,唯一的效果是StopByRequestEvent被拋出。</p><p>  17.在一個指定的時間停止表現(xiàn)</p><p>  你可以調(diào)用setStopTime方法來指明什么時候該停止Player對象。Player對象在到達指定的停止時間將停止。如果Player對象的速率是正值,Player對象將在媒體時間大于或者等于停止時間時停止。如果Player對象的速率是負值,Player

72、對象將在媒體時間小于或者等于停止時間時停止。如果當前的媒體時間已經(jīng)大于指定的停止時間,Player對象將立即停止。</p><p>  比如說,假定一個Player對象的媒體時間是5.0并且setStopTime設(shè)定停止時間是6.0、如果Player對象的速率是正值,媒體時間正在增加,Player對象在媒體時間大于或者等于6.0的時候?qū)⑼V?。然而如果Player對象的速率是負值,它將反向播放,這時Player對象

73、將會立即停止,因為媒體時間已經(jīng)超過了停止時間。</p><p>  你也可以在一個停止(Stopped)狀態(tài)的Player對象上調(diào)用setStopTime方法。然而你只能設(shè)置停止時間在處于已開始(Started)的Player對象上,如果停止時間當前還沒有設(shè)定。如果已開始(Started)的Player對象已經(jīng)有一個停止時間,setStopTime拋出一個錯誤。</p><p>  你可以

74、調(diào)用getStopTime來得到當前已安排的停止時間。如果時鐘沒有安排的停止時間,getStopTime方法將返回Clock.RESET。要移除停止時間以讓Player對象持續(xù)的播放直到它到達媒體結(jié)束,調(diào)用setStopTime(Clock.RESET)。</p><p>  18.釋放Player對象的資源</p><p>  Deallocate方法使得Player對象釋放所有的獨占資

75、源并且最小化非獨占資源。雖然對于Player對象的緩存和存儲管理未被指明,大多數(shù)Player按照Java對象的標準分配那么大的緩存。當deallocate方法調(diào)用時一個較好實現(xiàn)的Player對象盡量釋放多的內(nèi)部存儲。</p><p>  Deallocate方法只能被處于已停止(Stopped)狀態(tài)的Player對象調(diào)用。為了避免ClockStartedErrors,你應(yīng)該在調(diào)用deallocate方法前調(diào)用st

76、op方法。在正在預?。╬refetching)和預取完畢(prefetched)狀態(tài)下的Player對象上調(diào)用deallocate方法使得這個Player會返回到被識別(Realized)狀態(tài)。如果在Player對象在正在識別(Realizing)狀態(tài)下調(diào)用deallocate方法,Player對象將會拋出DeallocateEvent并且返回到未被識別(Unrealized)狀態(tài)下。(一旦一個Player對象被識別,它將不能返回到未被

77、識別(Unrealized)狀態(tài)。)</p><p>  一般情況下你在Player對象現(xiàn)在未被使用的時候調(diào)用deallocate方法。比如說,一個applet應(yīng)該調(diào)用deallocate方法作為它的stop方法的一部分。通過調(diào)用deallocate方法,當釋放其它資源為系統(tǒng)整體來使用時,程序?qū)⒕S護一個指向Player對象的引用。(JMF不會限制一個以前被預取完畢(Prefetched)或者開始(Started)

78、的現(xiàn)處于已識別(Realized)狀態(tài)的Player對象維護信息,而這些信息將使得Player對象在未來某個時刻會更快的開始。)</p><p>  當你使用完一個Player對象(或者其他的控制器)并不打算在以后用到,你應(yīng)該調(diào)用close方法。Close方法暗示控制器(controller)將不會再被用到并能被自己關(guān)閉。調(diào)用colse方法會使得控制器(controller)釋放所有占用的資源,導致它停止所有的活

79、動。當一個控制器(Controller)被關(guān)閉后,它會拋出ControllrClosedEvent。一個已經(jīng)關(guān)閉的控制器(Controller)不能被重新打開,在一個已經(jīng)關(guān)閉的控制器(Controller)調(diào)用方法將會產(chǎn)生錯誤。</p><p>  19.查詢Player對象</p><p>  Player對象可以提供關(guān)于它當前的參數(shù)的信息,這些參數(shù)包括速率,媒體時間,持續(xù)時間。<

80、/p><p><b>  20.獲得播放速率</b></p><p>  要獲得Player對象當前的速率,你調(diào)用getRate方法。調(diào)用這個方法將會返回一個浮點型數(shù)據(jù)作為速率的值。</p><p><b>  21.獲得媒體時間</b></p><p>  要獲得Player對象當前的媒體時間,你調(diào)用

81、getMediaTime。調(diào)用getMeidaTime返回一個Time類型的對象作為當前的媒體時間。如果player對象沒有在表現(xiàn)媒體數(shù)據(jù),返回媒體表現(xiàn)開始的時間點。</p><p>  注意媒體時間和幀之間不存在一對一的關(guān)系。每個幀表現(xiàn)的是一段時間,而媒體時間在這個期間仍然會繼續(xù)前進。</p><p>  22.獲取時間基線的時間</p><p>  通過得到Ti

82、meBase對象再調(diào)用getTime方法,你可以得到一個Player對象的當前時間基線時間:</p><p>  myCurrentTBTime = player1.getTimeBase().getTime();</p><p>  當一個Player正在運行時,通過調(diào)用mapToTimeBase方法,你可以得到相對于一個特殊的媒體時間的時間基線的時間。 </p><

83、;p>  23.取媒體流的持續(xù)時間</p><p>  因為程序經(jīng)常需要得知一個特定的媒體流要運行多久時間,所有的控制器(Controller)都實現(xiàn)了Duration接口。這個接口定義了一個單一的方法,getDuration。如果速率是1.0,持續(xù)時間代表了一個媒體對象將會運行的時間長度。一個媒體流的持續(xù)時間僅能通過Player對象得到。</p><p>  如果持續(xù)時間不能通過g

84、etDuration調(diào)用返回,將會返回DURATION_UNKNOWN。如果Player對象還沒有達到一個可以得到媒體源的持續(xù)時間的狀態(tài)時,就會出現(xiàn)這種情況。在稍后的時間,持續(xù)時間可能會能得到,此時調(diào)用getDuration將會返回持續(xù)時間。如果媒體源沒有一個已定義的持續(xù)時間,比如說一個直播的廣播,getDuration返回DURATION_UNBOUNDED。</p><p><b>  3 系統(tǒng)分析

85、與設(shè)計</b></p><p><b>  3.1需求分析</b></p><p><b>  3.1.1功能分析</b></p><p>  首先我們來看看構(gòu)造這個視頻播放器要達到什么樣的目標,確定了目標也就確定了代碼量和程序的復雜程度。視頻播放器是一個菜單驅(qū)動的簡單AWT應(yīng)用,我用JMF所做的視頻播放器要達

86、到如下目標:</p><p>  視頻播放器包含“File” “Action” 兩個菜單。</p><p>  “File”文件菜單包含兩個子菜單項:“Open”“Exit”。</p><p>  “Open”,用來打開本地硬盤中的媒體文件。</p><p>  “Exit”,退出播放程序。 </p><p>  “A

87、ction”文件菜單包含兩個子菜單項:“Play”“Stop”。</p><p>  “Play”,開始播放視頻。</p><p>  “Stop”,停止播放當前視頻。</p><p>  3.1.2 軟硬件環(huán)境分析</p><p>  視頻播放器可以在多種平臺上運行。</p><p>  視頻播放器的核心功能通過JM

88、F(Java Media Framework)API實現(xiàn)。JMF擴展了J2SE平臺的多媒體能力,允許Java應(yīng)用和Applet截取、回放、轉(zhuǎn)換包括音頻和視頻在內(nèi)的多種媒體。</p><p><b>  3.2概要設(shè)計</b></p><p>  3.2.1 初步設(shè)計</p><p>  我們把這個媒體播放器的設(shè)計分成兩個部分:GUI設(shè)計,偽代碼

89、設(shè)計。在GUI設(shè)計中,我們要了解構(gòu)成程序的各個GUI部件。在偽代碼設(shè)計中,我們用自然語言寫出程序運行原理。</p><p>  3.2.2 GUI設(shè)計 </p><p>  視頻播放器的用戶界面包含一個主窗口、兩個菜單和一個打開文件的對話框。首先我們來看看主窗口的設(shè)計。主窗口把窗口標題顯示為“08計算機-MC視頻播放器”,顯示“File”“Action” 菜單。下圖顯示了程序剛啟動時的主窗

90、口。</p><p>  圖 3-1 視頻播放器啟動時主窗口</p><p>  “File”菜單包含兩個子菜單項?!癘pen”菜單顯示一個對話框,用來選擇本地媒體文件的位置?!癊xit”菜單關(guān)閉視頻播放程序。另外,點擊主窗口右上角的關(guān)閉按鈕也可以關(guān)閉程序。</p><p>  圖 3-2“File”菜單</p><p>  “Action”

91、菜單包含兩個子菜單項?!癙lay”菜單開始播放當前視頻?!癝top”菜單暫停播放當前視頻。</p><p>  圖 3-3“Action”菜單</p><p>  點擊“File/Open”菜單時,“Choose Video”對話框出現(xiàn)。選中媒體文件之后,點擊“打開”按鈕即可打開媒體文件;點擊“取消”按鈕中止文件打開操作。</p><p>  圖 3-4 “Choo

92、se Video”窗口</p><p>  除了上面提到的部件之外,視頻播放器還包含一個視覺部件、一個控制面板部件。視覺部件順序播放媒體文件包含的各幀圖像;控制面板部件允許用戶調(diào)整媒體音量高低,或進行其他控制操作,例如查看媒體文件信息。</p><p>  3.2.3 視頻播放器原理</p><p>  為了播放媒體,首先需要一個媒體播放器Player對象,這可以通

93、過“Open”菜單獲得。播放器完成從數(shù)據(jù)源接受數(shù)據(jù),申請播放資源,并以精確的時間順序根據(jù)每一道的數(shù)據(jù)格式分別提交到各自的資源目標,揚聲器、顯示器,整個過程和關(guān)系如下圖所示:</p><p>  播放器對象Player具有若干種狀態(tài),大致可以分成創(chuàng)建播放器、判定請求資源、提交數(shù)據(jù)、播放媒體數(shù)據(jù)等狀態(tài) ,Java提供了ControllerListener接口來監(jiān)聽Player對象的各個狀態(tài)之間轉(zhuǎn)變時的事件,并完成相應(yīng)

94、的處理。 </p><p>  3.2.4偽代碼設(shè)計</p><p>  前面我們了解了構(gòu)成視頻播放器GUI的各個部件,下面要開始“設(shè)想”一下這個程序的具體構(gòu)造。在正式編寫代碼之前,我們先用偽代碼的形式寫出這個程序的運行過程,以后正式編寫代碼時只需把偽代碼翻譯成Java代碼即可。下面給出了視頻播放器的偽代碼描述:</p><p>  應(yīng)用的類名稱:Media,超類:

95、Frame</p><p>  監(jiān)聽器分類:動作事件,控制器事件,菜單項事件,繪圖事件,窗口事件 </p><p><b>  main: </b></p><p>  * 為Media對象分配內(nèi)存。調(diào)用Media構(gòu)造函數(shù),創(chuàng)建主窗口(同時,隱含地創(chuàng)建/啟動了AWT后臺線程)</p><p>  * 結(jié)束主程序線程。此時

96、AWT線程繼續(xù)運行。</p><p>  Media構(gòu)造函數(shù):</p><p>  * 設(shè)置主窗口的標題 * 注冊窗口監(jiān)聽器,以處理窗口關(guān)閉事件 * 創(chuàng)建“File”菜單 * 創(chuàng)建“Open”菜單項* 把Media對象注冊成為“Open”菜單項動作事件的監(jiān)聽器 * 把“Open”菜單項加入“File”菜單。 * 在“File”菜單中加入一條水平分隔線 * 按照創(chuàng)建“Open”

97、菜單項的過程,創(chuàng)建“Exit”菜單項 * 創(chuàng)建一個菜單條(MenuBar) </p><p>  * 把“File”菜單加入到菜單條 </p><p>  * 創(chuàng)建“Action”菜單 * 創(chuàng)建“Play”菜單項* 把Media對象注冊成為“Play”菜單項動作事件的監(jiān)聽器 * 把“Play”菜單項加入“Action”菜單。 * 在“Action”菜單中加入一條水平分隔線 *

98、按照創(chuàng)建“Play”菜單項的過程,創(chuàng)建“Stop”菜單項 * 創(chuàng)建一個菜單條(MenuBar) </p><p>  * 把“File”“Action”菜單加入到菜單條* 把新創(chuàng)建的菜單條設(shè)置為主窗口的菜單條 * 把主窗口的大小設(shè)置為500*350像素 * 顯示主窗口 * 結(jié)束構(gòu)造函數(shù) 動作監(jiān)聽器: 當出現(xiàn)動作時: * 如果動作事件起源于“Exit”菜單項, * 觸發(fā)一個給窗口監(jiān)聽器的窗口關(guān)閉事

99、件 * 返回 * 創(chuàng)建一個“Choose Video”對話框 * 把對話框的當前目錄設(shè)置為上次關(guān)閉時的目錄 * 顯示對話框。這個對話框是一個模式對話框 * 如果用戶沒有通過對話框選擇媒體文件 * 返回 * 保存用戶在對話框中選擇的目錄 * 如果以前已經(jīng)創(chuàng)建JMF播放器對象 * 關(guān)閉該對象 * 根據(jù)指定的目錄和名字,創(chuàng)建一個使用file:協(xié)議的媒體定位器(MediaLocator)對象,再利用該對象創(chuàng)建一個JMF播放器

100、對象 * 如果出現(xiàn)異常 * 顯示錯誤信息,然后返回 * 把主窗口的標題設(shè)置為媒體文件的名字 </p><p>  * 把Media對象注冊為來自JMF播放器對象的控制器事件的監(jiān)聽器</p><p>  * 讓JMF播放器對象預先提取媒體內(nèi)容 * 返回 控制器監(jiān)聽器: 當控制器被關(guān)閉: * 如果JMF播放器的視覺部件存在,從Media容器拆除視覺部件 * 如果JMF播放器的控

101、制面板部件存在,從Media容器拆除控制面板部件 * 返回 當預提取媒體內(nèi)容結(jié)束: * JMF播放器對象開始播放媒體 * 返回 當實例化(realize)完成: * 獲取JMF播放器對象的視覺部件 * 如果視覺部件存在,則把它加入到Media容器的中間 * 獲取JMF播放器對象的控制面板部件 * 如果控制面板部件存在,則把它加入到Media容器的南方 * 執(zhí)行pack()操作* 返回 窗口監(jiān)聽器: window

102、Closing: * 調(diào)用dispose以執(zhí)行windowClosed * 返回 windowClosed: * 如果已經(jīng)創(chuàng)建JMF播放器對象 * 關(guān)閉JMF播放器對象 * 結(jié)束程序 </p><p>  偽代碼的前面三行聲明了媒體播放器的類名稱、超類的名稱和Media類實現(xiàn)的監(jiān)聽器。帶有main:前綴的行表示Media的main()方法。類似地,帶有“構(gòu)造函數(shù):”前綴的行屬于Media的構(gòu)造函數(shù)。偽

103、代碼的其余內(nèi)容分成五個監(jiān)聽器分區(qū):動作監(jiān)聽器,控制器監(jiān)聽器,菜單項監(jiān)聽器,窗口監(jiān)聽器。每一個分區(qū)分別包含一個或多個方法。</p><p><b>  4 系統(tǒng)的實現(xiàn)</b></p><p>  4.1自定義類的說明</p><p>  類名: MediaPlayer 作用: 主類 繼承的父類: JFrame類 實現(xiàn)的接口: Action

104、Listener, ControllerListener 主要方法說明: MediaPlayer構(gòu)造方法,設(shè)置對象的數(shù)據(jù)成員,完成窗口(包括菜單)的設(shè)置等。</p><p>  SetupMenu方法,用于構(gòu)造程序窗口的菜單,被MediaPlayer調(diào)用。</p><p>  ActionPerformed方法監(jiān)聽來對象的菜單事件,根據(jù)相應(yīng)命令做出相應(yīng)的反映。</p>&

105、lt;p>  ControllerUpdate方法用于處理JMF傳出的關(guān)于播放器的事件。要進行正常播放,必須利用這個方法捕捉合適的事件并調(diào)用Player相應(yīng)的方法來實現(xiàn)。</p><p><b>  4.2 程序代碼</b></p><p>  4.2.1 代碼編寫</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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論