

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 畢 業(yè) 論 文(設計)</p><p> 題 目:基于JMF的視頻播放器設計和實現(xiàn) </p><p> 學 號: </p><p> 姓 名: </p><p> 年 級: 2008
2、級 </p><p> 學 院: 信息科學技術學院 </p><p> 系 別: 計算機科學與技術 </p><p> 專 業(yè): 計算機科學與技術 </p><p> 指導教師:
3、 </p><p> 完成日期: </p><p><b> 摘 要</b></p><p> 隨著多媒體技術的發(fā)展和人們對視頻,音頻數(shù)據(jù)的需求,越來越多的軟件加入了多媒體功能。</p><p> JMF(Java Media Framework API)是
4、一種采用Java語言開發(fā)流式媒體應用應用程序接口。它作為Java Media API技術家族的一個重要組成部分,對Java平臺進行了擴展,為媒體應用開發(fā)人員提供了增強的媒體開發(fā)能力。Java多媒體框架中包含了許多用于處理多媒體的API,所支持的功能包括:可以在Java Applet和應用程序中播放各種媒體文件,例如AU、AVI、MIDI、MPEG、QuickTime和WAV等文件;可以播放從互聯(lián)網(wǎng)上下載的媒體流;可以利用麥克風和攝像機一
5、類的設備截取音頻和視頻,并保存成多媒體文件;處理多媒體文件,轉換文件格式;向互聯(lián)網(wǎng)上傳音頻和視頻數(shù)據(jù)流;在互聯(lián)網(wǎng)上廣播音頻和視頻數(shù)據(jù)等。 </p><p> 當前的視頻播放器有用各種不同的語言和技術實現(xiàn)的,使用JAVA語言編寫的視頻播放器有其獨特的優(yōu)勢:Java跨平臺,使得通過JMF API開發(fā)的多媒體應用同其他Java應用一樣,擁有“一次開發(fā),到處運行”(write once, run anywhere)的
6、特點。</p><p> 本系統(tǒng)旨在使用JMF編寫一個視頻播放器,首先通過GUI設計出視頻播放器的界面,然后通過偽代碼設計,最后將偽代碼翻譯為JAVA代碼。最終播放器實現(xiàn)本地視頻,音頻播放,以及視頻音頻信息,音量調節(jié),暫停等一般播放器功能。</p><p> 關鍵詞: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技術現(xiàn)狀與發(fā)展趨勢1</p><p> 1.3論文組織結構2</p><p
14、><b> 2技術背景3</b></p><p> 2.1 JMF結構3</p><p> 2.1.1定義JMF3</p><p> 2.1.2JMF體系結構簡介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)分析與設計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概要設計17</p><p> 3.2.1初步設計17</p><p> 3.2.2GUI設計17</p><p> 3.2.3視頻播放器原理20</p><p>
17、3.2.4偽代碼設計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構造函數(shù)33</p><p> 4.2.4SetupMenu構造程序菜單34</p><p> 4.3系統(tǒng)操作演示36</p><p><b> 5總結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)絡視頻發(fā)展日
20、新月益,出現(xiàn)了很多網(wǎng)絡視頻播放器,許多著名網(wǎng)站都提供視頻文件的搜索,還有很多的視頻網(wǎng)站提供視頻文件的免費下載,視頻在互聯(lián)網(wǎng)上的共享已經(jīng)是大勢所趨,在授權的情況下,世界任何地方的任何視頻進入網(wǎng)絡可以得到迅速的共享。</p><p> 另一方面,使用網(wǎng)絡下載視頻文件的用戶日益增加,互聯(lián)網(wǎng)上的視頻共享是網(wǎng)絡時代的一個非常重要的應用,擁有非常大的用戶群。下載視頻文件要播放則必須使用視頻播放軟件,因此編制好的視頻播放軟件
21、有非常實際的現(xiàn)實意義。</p><p> 當前的視頻播放器有用各種不同的語言和技術實現(xiàn)的,使用JAVA語言編寫的視頻播放器有獨特的優(yōu)勢:Java跨平臺,使得通過JMF API開發(fā)的多媒體應用同其他Java應用一樣,擁有“一次開發(fā),到處運行”(write once, run anywhere)的特點。JMF為多媒體的獲取、播放、處理和傳輸定義了統(tǒng)一的體系結構、消息處理機制和程序設計接口,提供給開發(fā)者一個可以擴展的
22、并且跨平臺的強大的媒體工具,并完全支持RTP/RTCP協(xié)議。因此使用Java 語言開發(fā)視頻播放器是理所當然的。</p><p> 1.2 技術現(xiàn)狀與發(fā)展趨勢</p><p> Java是由Sun Microsystems公司于1995年5月推出的Java程序設計語言(以下簡稱Java語言)和Java平臺的總稱。Java平臺由Java虛擬機(Java Virtual Machine)和
23、Java 應用編程接口(Application Programming Interface、簡稱API)構成。Java 應用編程接口為Java應用提供了一個獨立于操作系統(tǒng)的標準接口,可分為基本部分和擴展部分。在硬件或操作系統(tǒng)平臺上安裝一個Java平臺之后,Java應用程序就可運行?,F(xiàn)在Java平臺已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。這樣Java程序可以只編譯一次,就可以在各種系統(tǒng)中運行。Java語言吸收了Smalltalk語言和C++語言的優(yōu)
24、點,并增加了其它特性,如支持并發(fā)程序設計、網(wǎng)絡通信、和多媒體數(shù)據(jù)控制等。</p><p> Java媒體架構(JMF)是一個令人激動的通用的API,它允許Java開發(fā)者用許多不同的方法處理媒體。該核心框架支持不同媒體(如:音頻輸出和視頻輸出)間的時鐘同步。它是一個標準的擴展框架,允許用戶制作純音頻流和視頻流。</p><p> Sun以四種不同的專用版本提供JMF 2.1.1技術,滿足
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ā)商人員就能容易、快速地為他們已有的各種應用程序和客戶端Java小程序增添豐富的媒體功能,如流式視頻、3D圖像和影像處理等。就是說,各種Java Media API發(fā)揮了Java平臺的固有優(yōu)勢,將"編寫一次,到處運行"的能力擴展到了圖像、影像和數(shù)字媒體等各種應用領域,從而大大縮減了開發(fā)時間和降低了開發(fā)成本。</p><
27、;p> 1.3 論文組織結構</p><p> 第一部分 引言 描述項目背景,闡述了Java和JMF技術的現(xiàn)狀和發(fā)展趨勢。</p><p> 第二部分 技術背景 詳細的介紹系統(tǒng)中使用的JMF技術。</p><p> 第三部分 系統(tǒng)設計 闡述系統(tǒng)設計的思想以及采用的一些方法。</p><p> 第四部分 系統(tǒng)實現(xiàn) 對在系統(tǒng)開發(fā)
28、的相關成果和問題進行總結,并給出了重要的相關代碼。</p><p><b> 2 技術背景</b></p><p><b> 2.1 JMF結構</b></p><p> 2.1.1 定義JMF</p><p> JMF實際上是Java的一個類包。JMF 2.1.1技術提供了先進的媒體處理能
29、力,從而擴展了Java平臺的功能。這些功能包括:媒體捕獲、壓縮、流轉、回放,以及對各種主要媒體形式和編碼的支 持,如M-JPEG、H.263、MP3、RTP/RTSP (實時傳送協(xié)議和實時流轉協(xié)議)、Macromedias Flash、IBM的HotMedia和Beatniks的Rich Media Format (RMF)等。JMF 2.1.1還支持廣受歡迎的媒體類型,如Quicktime、Microsofts AVI和MPEG-1等
30、。此外,JMF 2.1.1軟件中包括了一個開放的媒體架構,可使開發(fā)人員靈活采用各種媒體回放、捕獲組件,或采用他們自己的定制的內插組件。</p><p> 2.1.2 JMF體系結構簡介</p><p> 在開發(fā)JMF 應用程序之前要完全理解JMF 的體系架構、接口和類。就拿我們的家用攝像機系統(tǒng)作個例子。首先用攝像機拍攝內容,拍攝下來的內容錄制在DV帶中。DV帶可以放在放像機里播放、放像
31、機提供視頻信號給電視機,提供音頻信號給音箱,這樣我們就可以在電視機上看到畫面,從音箱里聽到聲音。JMF API 提供的也是同樣的模型。</p><p> JMF 提供的模型可大致分為七類 </p><p> 數(shù)據(jù)源(Data source)</p><p> 截取設備(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ù)處理設備與JMF的比較</p><p> JMF
33、高層結構正如圖所示,數(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ù)流的從開始到結束的經(jīng)歷的時
35、間。</p><p><b> 2.1.4 管理器</b></p><p> 通過使用管理器(Manager)這個對象,JMF使得用戶實現(xiàn)的新的關鍵接口與已存在的類無縫對接。管理器模型使用了工廠模式。</p><p> 使用JMF來完成程序時,我們需要使用Manager的create方法來構造Player,Processors,DataS
36、ink,DataSource來為你的應用程序服務。例如如果你式通過一個輸入設備捕獲媒體數(shù)據(jù),你將會使用CapturtDeviceManager來找出哪些設備是可用的,并且通過這些對象來獲取相關信息。</p><p> 2.1.5 事件模型</p><p> 圖 2-3 JMF事件模型</p><p> JMF使用一個結構化的事件報告機制來使得應用程序來與當前
37、的媒體的狀態(tài)來保持通信。同時它還使得基于JMF的程序能夠響應媒體驅動的錯誤狀況,比如說資源部可獲得這種情況。當JMF對象需要報告當前的情況時,它會拋出MediaEvent。MediaEvent由許多特定類型的事件。對于每一個可以拋出MediaEvent的對象,JMF定義了相應的監(jiān)聽者對象。</p><p> 2.1.6 數(shù)據(jù)模型</p><p> 圖 2-4 JMF數(shù)據(jù)模型</p
38、><p> JMF媒體播放器經(jīng)常使用DataSource來管理媒體內容的轉移。DataSource封裝了媒體位置,使用的協(xié)議等信息,這些信息式用來傳輸媒體的。</p><p> DataSource是通過JMF中的MediaLocator或者URL來指明的。MediaLocator與URL相似并且能通過一個URL構造,但是它與URL的區(qū)別是即使在相應的協(xié)議處理沒被安裝的情況下它也能被構造,
39、而URL不行。</p><p><b> 2.1.7 控制</b></p><p> 圖 2-6 JMF控制</p><p> JMF控制提供了一種機制來設置和查詢對象的屬性??刂破饕话闾峁┫鄳挠脩艚涌诘脑L問,通過訪問來改變對象的屬性。許多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的外觀或者應用程序的窗口中。</p><p> 當你想創(chuàng)建一
41、個新的Player對象時,你通過Manager的createPlayer或者createProcessor的方法創(chuàng)建它。Manager通過使用你指定的媒體的URL對象或者MediaLocator對象來創(chuàng)建一個合適的對象。URL對象只有在相關的URLSteeamHandler被安裝的情況下才能被正確的構造,而MediaLocator則沒有這個限制。</p><p> 2.在Player對象未識別(Realized
42、)前阻塞</p><p> 許多可以被Player對象調用的方法要求Player對象在已被識別(Realized)的狀態(tài)。保證當你調用這些方法之前Player對象已經(jīng)被識別的方法是使用Manager提供的createRealizedPlayer方法來創(chuàng)建Player對象。這個方法提供了一個便捷的方式在一步就創(chuàng)建并且識別(Realize)一個Player對象。當這個方法被調用時,它會阻塞直到這個Player對象被
43、識別。Manager也提供了一個相同的createRealizedProcessor方法來創(chuàng)建一個已識別的Processor對象。</p><p> 注意:阻塞Player對象或者Processor對象直到被識別可能引起不好的結果。比如,如果createRealizedPlayer在一個applet中被調用,Applet.start和Applet.stop將不能打斷Player對象的構造過程。</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)通過調用getVisualComponent得到組件。</p><p> (2)將它加到applet的外觀表示或者應用程序的窗口中。</p><p> 你可以通過它的可視化組件訪問Player對象的
46、的顯示屬性,如它的x,y坐標。Player組件的布局受到AWT布局管理器的控制。</p><p> 5.顯示控制面板組件</p><p> Player對象通常有一個控制板允許用戶控制媒體的表示。比如說,一個Player對象可能一個有開始按鈕,結束按鈕,暫停按鈕和一個用來調控音量的滑動條與其關聯(lián)。</p><p> 每一個Player對象提供一個默認的控制板。
47、要顯示這個默認的控制板:</p><p> (1)調用getControlPanelComponent得到組件。</p><p> (2)將返回的組件加到applet的外觀表示和應用程序的窗口。</p><p> 如果你選擇定義一個定制的用戶接口,你可以實現(xiàn)GUI 組件并且調用正確的Player方法來響應用戶的動作。如果你將這個定制組件注冊成Controlle
48、rListener,當Player對象的狀態(tài)改變時,你也可以更新這個組件。</p><p> 6.顯示一個增益控制組件</p><p> Player對象的實現(xiàn)支持音頻增益調節(jié)的GainControl接口。GainControl提供方法調節(jié)有尿頻的音量,如setLevel和setMute。如果Player對象提供了GainControl組件要顯示它。</p><p&
49、gt; (1)調用getGainControl從Player對象獲得GainControl,如果返回為空,則Player不支持GainControl接口。</p><p> (2)在返回的GainControl上調用getControlComponent。</p><p> (3)將返回的組件加到applet的外觀表示或者應用程序的窗口上。</p><p>
50、 注意getControls方法不返回Player對象的GainControl。你只能通過調用getGainControl來訪問GainControl。</p><p> 7.顯示一般的控制組件</p><p> 許多Player對象有可以被用戶控制的其他的屬性。比如說,一個視頻Player對象可能允許用戶調整亮度和對比度,但是他們不是通過Player接口來管理。你可以通過調用getC
51、ontrols來得知一個Player對象支持哪些一般的控制。</p><p> 比如說,你可以調用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)當事件到達時調用getCachingControl方法得到緩沖控制。</p><p> (2)在CachingControl上調用getProgressBar以得到默認的進度條組件。</p><p> (3)將進度條組件加入到你的applet外觀組件上。</p><p> 每次你收到一個CachingControlEvert,檢查下載是否已經(jīng)完成。
54、當getContentProgress返回的值與getContentLength一樣,移除進度條。</p><p> 當進度條需要更新時,Player對象拋出一個CachingControlEvent。如果你實現(xiàn)你自己的進度條組件,當CachingControlEvent被拋出時,你應該能監(jiān)聽這個事件并且更新進度條。</p><p><b> 9.設置播放速率</b&g
55、t;</p><p> Player對象的速率決定媒體時間相對時間基線怎樣變化,它定義了當時間基線的一個單位前進的時候,媒體時間遷移幾個單位。Player對象的速率可以被認為是一個暫時的刻度因素。比如說,當Player開始后,速率為2.0代表媒體時間的前進速度是時間基線時間前進的兩倍。</p><p> 理論上,一個Player對象的速率可以被設置為任何值,負值代表反向的播放媒體。然而
56、,有些媒體的格式依賴于幀,所以反向的播放或者在非標準的速率上播放它是不可能的,也是不實際的。</p><p> 要設置速率,你調用setRate并且傳入一個浮點類型的值作為這個暫時的刻度因素。當setRate被調用時,這個方法返回當前的設置,即使它沒被改變。Player對象僅保證支持1.0的速率。</p><p><b> 10.設置開始位置</b></p&
57、gt;<p> 設置Player對象的媒體時間相當于在一個媒體流中設置讀取的位置。對于象文件這樣的媒體數(shù)據(jù)源,媒體時間是有界限的,最大的媒體時間定義為媒體流結束的時間。</p><p> 要設置媒體時間,你調用setMediaTime并且傳入一個Time對象,這個對象代表你想設置的時間。</p><p><b> 11.幀定位</b></p&
58、gt;<p> 有些Player對象允許你定位到一個視頻的特殊幀。這使得你可以簡單的找到開始位置的特殊幀而不必指明這個位置的精確的時間。支持幀定位的Player對象實現(xiàn)了FramePositioningControl。</p><p> 要設置幀的位置,你調用FranePositioningControl的seek方法。當你查找一幀時,Player對象的媒體時間的值將會設置成那一幀的開始時間,同
59、時一個MediaTimeEvent將會被拋出。</p><p> 有些Player對象可以將媒體時間和幀的位置進行轉換。如果支持轉換,你可以使用FramePositioningControl的mapFrameToTime和mapTimeToFrame方法來獲得這些信息。(支持FramePositioningControl的Player對象不需要導出這個信息。)注意在媒體時間和幀之間不存在一一對應的關系—幀是一段
60、持續(xù)的時間,所以一些不同的媒體時間可能會對應同一幀。</p><p><b> 12.準備開始</b></p><p> 大多數(shù)Player對象不能立即開始。在播放開始前,某些硬件和軟件的狀況需要被滿足。比如說,如果一Player對象之前從未開始過,則它需要分配緩存來存儲媒體數(shù)據(jù)?;蛘呷绻襟w數(shù)據(jù)在網(wǎng)絡設備上,Player對象可能需要在下載數(shù)據(jù)之前建立一個網(wǎng)絡連接
61、。即使Player對象以前曾經(jīng)播放過,緩存區(qū)在當前的媒體位置也可能包含無效的數(shù)據(jù)。</p><p> 13.識別(Realizing)和預取(Prefetching)Player對象</p><p> JMF將一個Player對象的準備過程分成兩個階段,識別(Realizing)和預取(Prefetching)。在開始一個Player對象之前進行識別和預取使得當你調用start方法時能
62、最小化開始播放媒體的時間,并且為用戶幫助創(chuàng)建一個響應迅速,具有交互性的Player對象。實現(xiàn)ControllerListener接口使得當這些操作發(fā)生時你能夠控制它。</p><p> 注意:Processor在準備過程中引入了第三個階段,稱為配置(Configuring)。在這個階段中,Processor的選項能夠被選擇以指定Processor怎樣來操縱媒體數(shù)據(jù)。要得到更多的信息,請查閱選擇跟蹤處理選項。&l
63、t;/p><p> 你調用realize方法將Player對象進入識別(Realizing)狀態(tài)并且開始識別過程。你調用prefetch方法將Player對象進入預取中(prefetching)狀態(tài)并初始化預取過程。Realize和prefetch方法都是異步的并且會立即返回。當Player對象完成了要求的動作時,它會拋出RealizeCompleteEvent或者PrefetchCompleteEvent。Pla
64、yer對象的狀態(tài)描述了Player對象在這些狀態(tài)下的動作。</p><p> Player對象在預取狀態(tài)下準備開始播放,而且它啟動反應時間不能再被減少。然而通過setMediaTime設定媒體時間可能使Player對象返回到被識別(Realized)狀態(tài)并且同時使得啟動時延增加。</p><p> 記住一個在預取完畢的Player對象與系統(tǒng)資源相關。因為有些資源,比如說聲卡,可能一次僅
65、僅能被一個程序使用,有一個在預取完畢的Player對象生存時可能會阻止其它Player對象開始。</p><p><b> 14.獲取開始時延</b></p><p> 要得到需要多少時間啟動Player對象,你可以調用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> 一般你會通過調用start方法來開始表現(xiàn)一個媒體流。Start方法通知Player對象盡可能快的開始表現(xiàn)媒體數(shù)據(jù)。如果必須,start方法通過完成識別和預取的操作使得Player對象開始播放。如果start方法是被一個已被開始(started)的Player對象調用,唯一的效果是一個StartEvent將被拋出。</p>
68、<p> 時鐘定義了syncStart方法以用來同步化。請查閱同步多個媒體流獲取更多的信息。</p><p> 要使得Player對象在指明點開始媒體流:</p><p> (1)通過調用setMeidaTime指明你想開始的媒體流的點。</p><p> (2)在Player對象上調用start方法。</p><p>&l
69、t;b> 16.停止表現(xiàn)</b></p><p> 有四種情況媒體的表現(xiàn)將會停止:</p><p> (1)當stop方法被調用時。</p><p> (2)當指定的停止的時間到達時。</p><p> (3)當沒有更多的媒體數(shù)據(jù)時。</p><p> (4)當被接收的媒體數(shù)據(jù)相對于可接受
70、的播放速率說太慢時。</p><p> 當Player對象停止時,如果媒體源能被控制,它的媒體時間將被凍結。如果Player對象在表現(xiàn)流式媒體,則可能不能凍結媒體時間。在這種情況下,僅僅是媒體數(shù)據(jù)的接收被停止—數(shù)據(jù)繼續(xù)被流式化,媒體時間繼續(xù)前進。</p><p> 要立即停止一個Player對象,你調用stop方法。如果你在一個處于停止(Stopeed)狀態(tài)的Player對象調用sto
71、p方法,唯一的效果是StopByRequestEvent被拋出。</p><p> 17.在一個指定的時間停止表現(xiàn)</p><p> 你可以調用setStopTime方法來指明什么時候該停止Player對象。Player對象在到達指定的停止時間將停止。如果Player對象的速率是正值,Player對象將在媒體時間大于或者等于停止時間時停止。如果Player對象的速率是負值,Player
72、對象將在媒體時間小于或者等于停止時間時停止。如果當前的媒體時間已經(jīng)大于指定的停止時間,Player對象將立即停止。</p><p> 比如說,假定一個Player對象的媒體時間是5.0并且setStopTime設定停止時間是6.0、如果Player對象的速率是正值,媒體時間正在增加,Player對象在媒體時間大于或者等于6.0的時候將停止。然而如果Player對象的速率是負值,它將反向播放,這時Player對象
73、將會立即停止,因為媒體時間已經(jīng)超過了停止時間。</p><p> 你也可以在一個停止(Stopped)狀態(tài)的Player對象上調用setStopTime方法。然而你只能設置停止時間在處于已開始(Started)的Player對象上,如果停止時間當前還沒有設定。如果已開始(Started)的Player對象已經(jīng)有一個停止時間,setStopTime拋出一個錯誤。</p><p> 你可以
74、調用getStopTime來得到當前已安排的停止時間。如果時鐘沒有安排的停止時間,getStopTime方法將返回Clock.RESET。要移除停止時間以讓Player對象持續(xù)的播放直到它到達媒體結束,調用setStopTime(Clock.RESET)。</p><p> 18.釋放Player對象的資源</p><p> Deallocate方法使得Player對象釋放所有的獨占資
75、源并且最小化非獨占資源。雖然對于Player對象的緩存和存儲管理未被指明,大多數(shù)Player按照Java對象的標準分配那么大的緩存。當deallocate方法調用時一個較好實現(xiàn)的Player對象盡量釋放多的內部存儲。</p><p> Deallocate方法只能被處于已停止(Stopped)狀態(tài)的Player對象調用。為了避免ClockStartedErrors,你應該在調用deallocate方法前調用st
76、op方法。在正在預取(prefetching)和預取完畢(prefetched)狀態(tài)下的Player對象上調用deallocate方法使得這個Player會返回到被識別(Realized)狀態(tài)。如果在Player對象在正在識別(Realizing)狀態(tài)下調用deallocate方法,Player對象將會拋出DeallocateEvent并且返回到未被識別(Unrealized)狀態(tài)下。(一旦一個Player對象被識別,它將不能返回到未被
77、識別(Unrealized)狀態(tài)。)</p><p> 一般情況下你在Player對象現(xiàn)在未被使用的時候調用deallocate方法。比如說,一個applet應該調用deallocate方法作為它的stop方法的一部分。通過調用deallocate方法,當釋放其它資源為系統(tǒng)整體來使用時,程序將維護一個指向Player對象的引用。(JMF不會限制一個以前被預取完畢(Prefetched)或者開始(Started)
78、的現(xiàn)處于已識別(Realized)狀態(tài)的Player對象維護信息,而這些信息將使得Player對象在未來某個時刻會更快的開始。)</p><p> 當你使用完一個Player對象(或者其他的控制器)并不打算在以后用到,你應該調用close方法。Close方法暗示控制器(controller)將不會再被用到并能被自己關閉。調用colse方法會使得控制器(controller)釋放所有占用的資源,導致它停止所有的活
79、動。當一個控制器(Controller)被關閉后,它會拋出ControllrClosedEvent。一個已經(jīng)關閉的控制器(Controller)不能被重新打開,在一個已經(jīng)關閉的控制器(Controller)調用方法將會產生錯誤。</p><p> 19.查詢Player對象</p><p> Player對象可以提供關于它當前的參數(shù)的信息,這些參數(shù)包括速率,媒體時間,持續(xù)時間。<
80、/p><p><b> 20.獲得播放速率</b></p><p> 要獲得Player對象當前的速率,你調用getRate方法。調用這個方法將會返回一個浮點型數(shù)據(jù)作為速率的值。</p><p><b> 21.獲得媒體時間</b></p><p> 要獲得Player對象當前的媒體時間,你調用
81、getMediaTime。調用getMeidaTime返回一個Time類型的對象作為當前的媒體時間。如果player對象沒有在表現(xiàn)媒體數(shù)據(jù),返回媒體表現(xiàn)開始的時間點。</p><p> 注意媒體時間和幀之間不存在一對一的關系。每個幀表現(xiàn)的是一段時間,而媒體時間在這個期間仍然會繼續(xù)前進。</p><p> 22.獲取時間基線的時間</p><p> 通過得到Ti
82、meBase對象再調用getTime方法,你可以得到一個Player對象的當前時間基線時間:</p><p> myCurrentTBTime = player1.getTimeBase().getTime();</p><p> 當一個Player正在運行時,通過調用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調用返回,將會返回DURATION_UNKNOWN。如果Player對象還沒有達到一個可以得到媒體源的持續(xù)時間的狀態(tài)時,就會出現(xiàn)這種情況。在稍后的時間,持續(xù)時間可能會能得到,此時調用getDuration將會返回持續(xù)時間。如果媒體源沒有一個已定義的持續(xù)時間,比如說一個直播的廣播,getDuration返回DURATION_UNBOUNDED。</p><p><b> 3 系統(tǒng)分析
85、與設計</b></p><p><b> 3.1需求分析</b></p><p><b> 3.1.1功能分析</b></p><p> 首先我們來看看構造這個視頻播放器要達到什么樣的目標,確定了目標也就確定了代碼量和程序的復雜程度。視頻播放器是一個菜單驅動的簡單AWT應用,我用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應用和Applet截取、回放、轉換包括音頻和視頻在內的多種媒體。</p><p><b> 3.2概要設計</b></p><p> 3.2.1 初步設計</p><p> 我們把這個媒體播放器的設計分成兩個部分:GUI設計,偽代碼
89、設計。在GUI設計中,我們要了解構成程序的各個GUI部件。在偽代碼設計中,我們用自然語言寫出程序運行原理。</p><p> 3.2.2 GUI設計 </p><p> 視頻播放器的用戶界面包含一個主窗口、兩個菜單和一個打開文件的對話框。首先我們來看看主窗口的設計。主窗口把窗口標題顯示為“08計算機-MC視頻播放器”,顯示“File”“Action” 菜單。下圖顯示了程序剛啟動時的主窗
90、口。</p><p> 圖 3-1 視頻播放器啟動時主窗口</p><p> “File”菜單包含兩個子菜單項。“Open”菜單顯示一個對話框,用來選擇本地媒體文件的位置?!癊xit”菜單關閉視頻播放程序。另外,點擊主窗口右上角的關閉按鈕也可以關閉程序。</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> 除了上面提到的部件之外,視頻播放器還包含一個視覺部件、一個控制面板部件。視覺部件順序播放媒體文件包含的各幀圖像;控制面板部件允許用戶調整媒體音量高低,或進行其他控制操作,例如查看媒體文件信息。</p><p> 3.2.3 視頻播放器原理</p><p> 為了播放媒體,首先需要一個媒體播放器Player對象,這可以通
93、過“Open”菜單獲得。播放器完成從數(shù)據(jù)源接受數(shù)據(jù),申請播放資源,并以精確的時間順序根據(jù)每一道的數(shù)據(jù)格式分別提交到各自的資源目標,揚聲器、顯示器,整個過程和關系如下圖所示:</p><p> 播放器對象Player具有若干種狀態(tài),大致可以分成創(chuàng)建播放器、判定請求資源、提交數(shù)據(jù)、播放媒體數(shù)據(jù)等狀態(tài) ,Java提供了ControllerListener接口來監(jiān)聽Player對象的各個狀態(tài)之間轉變時的事件,并完成相應
94、的處理。 </p><p> 3.2.4偽代碼設計</p><p> 前面我們了解了構成視頻播放器GUI的各個部件,下面要開始“設想”一下這個程序的具體構造。在正式編寫代碼之前,我們先用偽代碼的形式寫出這個程序的運行過程,以后正式編寫代碼時只需把偽代碼翻譯成Java代碼即可。下面給出了視頻播放器的偽代碼描述:</p><p> 應用的類名稱:Media,超類:
95、Frame</p><p> 監(jiān)聽器分類:動作事件,控制器事件,菜單項事件,繪圖事件,窗口事件 </p><p><b> main: </b></p><p> * 為Media對象分配內存。調用Media構造函數(shù),創(chuàng)建主窗口(同時,隱含地創(chuàng)建/啟動了AWT后臺線程)</p><p> * 結束主程序線程。此時
96、AWT線程繼續(xù)運行。</p><p> Media構造函數(shù):</p><p> * 設置主窗口的標題 * 注冊窗口監(jiā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)建的菜單條設置為主窗口的菜單條 * 把主窗口的大小設置為500*350像素 * 顯示主窗口 * 結束構造函數(shù) 動作監(jiān)聽器: 當出現(xiàn)動作時: * 如果動作事件起源于“Exit”菜單項, * 觸發(fā)一個給窗口監(jiān)聽器的窗口關閉事
99、件 * 返回 * 創(chuàng)建一個“Choose Video”對話框 * 把對話框的當前目錄設置為上次關閉時的目錄 * 顯示對話框。這個對話框是一個模式對話框 * 如果用戶沒有通過對話框選擇媒體文件 * 返回 * 保存用戶在對話框中選擇的目錄 * 如果以前已經(jīng)創(chuàng)建JMF播放器對象 * 關閉該對象 * 根據(jù)指定的目錄和名字,創(chuàng)建一個使用file:協(xié)議的媒體定位器(MediaLocator)對象,再利用該對象創(chuàng)建一個JMF播放器
100、對象 * 如果出現(xiàn)異常 * 顯示錯誤信息,然后返回 * 把主窗口的標題設置為媒體文件的名字 </p><p> * 把Media對象注冊為來自JMF播放器對象的控制器事件的監(jiān)聽器</p><p> * 讓JMF播放器對象預先提取媒體內容 * 返回 控制器監(jiān)聽器: 當控制器被關閉: * 如果JMF播放器的視覺部件存在,從Media容器拆除視覺部件 * 如果JMF播放器的控
101、制面板部件存在,從Media容器拆除控制面板部件 * 返回 當預提取媒體內容結束: * JMF播放器對象開始播放媒體 * 返回 當實例化(realize)完成: * 獲取JMF播放器對象的視覺部件 * 如果視覺部件存在,則把它加入到Media容器的中間 * 獲取JMF播放器對象的控制面板部件 * 如果控制面板部件存在,則把它加入到Media容器的南方 * 執(zhí)行pack()操作* 返回 窗口監(jiān)聽器: window
102、Closing: * 調用dispose以執(zhí)行windowClosed * 返回 windowClosed: * 如果已經(jīng)創(chuàng)建JMF播放器對象 * 關閉JMF播放器對象 * 結束程序 </p><p> 偽代碼的前面三行聲明了媒體播放器的類名稱、超類的名稱和Media類實現(xiàn)的監(jiān)聽器。帶有main:前綴的行表示Media的main()方法。類似地,帶有“構造函數(shù):”前綴的行屬于Media的構造函數(shù)。偽
103、代碼的其余內容分成五個監(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構造方法,設置對象的數(shù)據(jù)成員,完成窗口(包括菜單)的設置等。</p><p> SetupMenu方法,用于構造程序窗口的菜單,被MediaPlayer調用。</p><p> ActionPerformed方法監(jiān)聽來對象的菜單事件,根據(jù)相應命令做出相應的反映。</p>&
105、lt;p> ControllerUpdate方法用于處理JMF傳出的關于播放器的事件。要進行正常播放,必須利用這個方法捕捉合適的事件并調用Player相應的方法來實現(xiàn)。</p><p><b> 4.2 程序代碼</b></p><p> 4.2.1 代碼編寫</p><p> 我們把3.2.3的偽代碼轉換成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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 音樂播放器畢業(yè)設計
- 音樂播放器畢業(yè)設計論文
- ios音樂播放器畢業(yè)設計
- 畢業(yè)設計論文 音樂播放器設計
- 視頻播放器設計開題報告
- directshow視頻播放器
- ios_音樂播放器畢業(yè)設計
- 畢業(yè)設計--基于ios平臺的視頻播放器的設計與實現(xiàn)
- 畢業(yè)設計----播放器的設計與實現(xiàn)
- android視頻播放器課程設計
- 利用vc++設計視頻播放器
- 可編程音樂播放器 畢業(yè)設計
- 可編程音樂播放器畢業(yè)設計
- 手機視頻播放器開發(fā)【畢業(yè)論文】
- vc視頻播放器的設計與實現(xiàn)
- 媒體播放器的設計與實現(xiàn)畢業(yè)設計
- 畢業(yè)設計(論文)-單片機音樂播放器設計
- 基于android平臺的視頻播放器(論文范文+畢業(yè)設計源代碼)
- 基于SoC FPGA的視頻播放器設計.pdf
- 畢業(yè)設計---基于單片機的音樂播放器
評論
0/150
提交評論