計算機科學與技術畢業論文-基于Python的音頻播放器的設計與實現_第1頁
計算機科學與技術畢業論文-基于Python的音頻播放器的設計與實現_第2頁
計算機科學與技術畢業論文-基于Python的音頻播放器的設計與實現_第3頁
計算機科學與技術畢業論文-基于Python的音頻播放器的設計與實現_第4頁
計算機科學與技術畢業論文-基于Python的音頻播放器的設計與實現_第5頁
已閱讀5頁,還剩31頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

緒論1.1研究背景隨著人們不斷尋求更高層次的精神生活的今天,聆聽音樂已是人們最為普遍的一種愛好。現在的網絡上,各種聲音的播放器可以說是各具特色,各有千秋。一款用于播放多種類型的歌曲的播放機。包含:MP3、WMA、MP4等多個不同的播放機,它們不僅有著美觀簡約的界面,而且又有簡易的使用方法,將你帶入一個完美的音樂世界。而作為音頻解碼器的一個可視化的界面,它的實質就是對不同的語音進行音頻編碼格式的解碼器。大部分的音樂播放器都是采用了不同的編碼方式,并且有一個相同的回放界面,因此音樂播放器能夠很容易的實現聆聽各種音樂的功能。也正是由于這個音樂播放器只是音頻解碼器打包,而且音頻的解碼是相同的,所以從道理上來說,每一款音樂播放器的聲音都是一模一樣的,根本不存在什么音樂播放器中的最佳聲音。有些音樂家會在解碼器外接一個DSP插件式的解碼器外接程序,將原來的曲子經過變形,以滿足用戶的要求,這種方式被稱為音色。這可能會讓某些曲子聽起來更好聽,但同時也會影響到其他曲子的質量。它具有良好的用戶界面和可擴充性,大部分的商用版本的音樂回放程序傾向于擁有很好的用戶界面和很容易使用的功能,但是它們缺少可擴充的功能,而且對音樂的支援也不是很強。開放源碼的回放軟件通常具有良好的伸縮性和支援多種不同的曲目,但其界面通常較為單一,難以引起使用者的興趣。1.2Java語言的特征首先,

Java是一門完整的OOP設計語言,它具有OOP的特點。Java的多態性是建立在時滯binding或Dynamicbinding基礎上的,所以Java天生就能夠識別出一個對象的種類。然而,c++并不支持動態捆綁,而且捆綁發生在編譯時,因此,c++希望實現多機運行的結果,就需要用到虛函數。另外,盡管C++已經有了封裝、繼承等功能,但是多態依然是基于編譯器的約束,需要用虛擬的函數來完成。而且,在C++中,由于其指針運算可以采用goto語句,以及諸如多繼承這樣的特點,使得C++無法與OOP的概念完全一致。其次,Java是完全獨立于平臺的,它采用了一種虛擬機,將不同的平臺隔離開來。Java是由Java的源程序通過編譯而形成的類文件,這種類文件的結構與傳統的編譯器所生成的二進制文件有很大的區別,需要通過虛擬機口譯來實現,是一種具有解釋性的語言。虛擬機起到了一個中間體的作用,它將被編譯的類文件轉化成另一個平臺上的指示。而在不同的C,

C++編譯器中,各個數據類型所占的空間可能是不相同的,這就會對程序的可移植性產生影響。另外,在存儲管理上,Java通過對虛擬機上的冗余存儲進行自動化的處理,能夠根據數據的變化,自動判定出哪些存儲已經被用戶所占用;因此,在軟件開發過程中,使用者不必再進行冗長的記憶體管理。C、c++等程序設計中,如果在沒有被利用到的情況下,必須重新利用其所具有的儲存能力,那么就有可能出現儲存能力的短缺,從而出現儲存缺陷。同時,由于Java本身屬于解釋型語言,因此,其生成的Java類文件必須經過虛擬機上的解釋才能被操作系統直接使用;因此其效率與C++和C++還是有一些距離的。在運行時,程序的發行比較麻煩,因為用Java寫成的軟件需要被安裝到OS的虛擬機上。在圖1.1中顯示了一個

Java應用的經過編輯的執行流程圖1.1JAVA程序的運行過程

2關于JMF技術2.1關于JMF技術JMF

(JavaMediaFramework),也就是

Java2的標準版本。J2SE

(J2SE)是一種面向多媒體內容采集、播放、傳輸及編碼變換的通用平臺,是一種面向多媒體內容采集、播放、傳輸及編碼變換的通用平臺。JMF技術能夠為Java的開發和應用帶來更多的便利。其內容有:媒體捕獲、壓縮、流轉、回放,并對M-JPEG、H.263、MP3、RTP/RTSP(即時傳輸協議和即時流轉協議)、

MacromediasFlash、IBM的HotMedia和Beatniks的RichMediaFormat

(RMF)等多種主流媒體格式和編碼的支持。同時,

JMF2.1.1也對諸如快速時序,微軟

AVI,

MPEG-1等常見的媒體進行了支援。另外,JMF還包含了一套開放式媒體體系結構,使得開發者可以使用多種媒體播放,捕捉組件,或者使用自己的自定義插入組件。JMF(JAVA

MediaFramework)是一種基于JAVA聲的層次結構。JMF在它的聲音過程中確實使用了Java聲音。JMF提供了更多的聲音和播放能力,但是它缺乏對Java聲音的底層存取。此外,該規范的JDK分發沒有包含JMF,而是包含了

JavaSound。JavaSound:(1)增加Audio和MIDI功能(2)可在

JDK1.3和以后的版本中使用(3)是最輕的。(4)自身對(AIFF,

WAV,

AU)幾種音頻格式的支持也比較有限(5)可以利用

Java聲學的ServiceMobileInterface(SPI)來擴展JMF:(1)增加對音頻、視頻及其他時基于數據的支持(2)對多個媒體格式進行同步和控制(3)目前未使用任何JDK來提供(4)除了MPEG和其他格式外,它還支持多種音頻格式(AIFF,

WAV等)。(5)包括對編碼器/譯碼器介質的可擴充支持2.2JMF常用類JMF通常有下列類:●數據來源●媒體定位器●播放器●處理器●數據池●數據格式●管理程序2.2.1數據源(DataSource)在JMF中,一個資料來源是資料來源,可以是從收集裝置取得的資料、一個多媒體檔案或從網際網路上下載的資料。在數據源對象中,只要你決定了其所在的地點和類別,那么這個對象就會包括一個可以用來播放這個多媒體的地點和軟件。一旦數據源對象被創建,你就可以把這個數據源對象放進播放器對象,而不用擔心數據源中的媒體是怎樣被獲取的,也不用擔心數據源中的媒體是怎樣被獲取的。2.2.2媒體定位器(MediaLocator)數據源的定義一般有兩個方面,一個是媒體定位,另一個是URL。媒體定位器與URL相似,可以被

URL所構建,甚至不需要對應的協議處理機構就可以構建媒體定位器(對于Java來說,一個URL只能在一個

URL協議的處理機構被設置在系統中時才可以被構建)。媒體定位器用于定位采集裝置,本地媒體文件,網絡上的媒體文件和網絡上的

RTP數據流。數據源的定義一般有兩個方面,一個是媒體定位,另一個是URL。媒體定位器與URL相似,可以被

URL所構建,甚至不需要對應的協議處理機構就可以構建媒體定位器(對于Java來說,一個URL只能在一個

URL協議的處理機構被設置在系統中時才可以被構建)。媒體定位器用于定位采集裝置,本地媒體文件,網絡上的媒體文件和網絡上的

RTP數據流。2.2.3播放器(Player)正如在圖2-1中所見,

Player對象將一個聲音和一個圖像的流作為一個輸入,接著把它輸出到一個擴音器或者一個畫面上,就好像一個玩家從DV的錄音機中讀出一個信息,再把一個聲音的聲音和一個視頻的聲音傳到一個聲音上,再把這個聲音傳到另一個聲音上。圖2.1JMF播放器模型播放器對象具有不同的狀態,在

JMF中已有6個定義,見圖2.2。通常,在播放多媒體之前,

Player對象必須經過每一個狀態。以下是關于這些國家的描述。圖2.2播放器的狀態轉換圖●沒有顯示:此時,玩家對象已被執行,但沒有顯示其想要顯示的多媒體內容。●在調用實時方法時,播放器對象的狀態從未實時轉換為實時。在這個狀態中,播放器對象將決定其所需的資源。●一個真實的:在這個情況下,播放器對象會決定他所需要的資源,而且還會了解什么媒體要被播放。●在Prefetching被調用時,播放器對象的狀態由實時轉換為Prefetching。在這種情況下,Player是為了進行多媒體的播放而進行的,它包含了多媒體數據的裝載、獲取所需的專用資源等等。這種方法叫做預先提取。●已預獲取:在播放器對象完成預先獲取后,將達到這個狀態。●開始:在使用開始方式之后,玩家將會進入這個狀態,并且播放多媒體內容。玩家從一種狀態切換到另外一種狀態時,會生成一個轉變事件(詳情參見2.3的事件模式)。有了控制器,你的程序就能判斷玩家的狀態,然后做出對應的響應。通過這個事件報表,您可以在您呼叫玩家的方法之前判斷玩家是否處于正確的狀態。為避免出現這種情況,在玩家的全部狀態中,無法調用全部的方法。如果玩家在目前的情況下,使用了不合法的方法,玩家會拋出一個例外或者一個錯誤。2.2.4處理器(Processor)一個與一個處理機(處理機)相對應的一個界面微處理機。還可以使用JMFAPI中的處理程序來播放介質數據。這是一個專門用于處理輸入的介質流的玩家。該處理器提供了對所有播放機的回放控制。從圖2-3中可以看出,處理器不僅可以把介質數據傳送給回放終端,而且也可以把介質數據傳送給數據源,這個過程可以用處理器的獲取數據輸出方式來完成。此資料來源可用作其它牌手的資料來源。該數據或者由其他處理器使用以進行后續的操作,或者作為DataSink的一個參數使用,或者保存在一個文檔中或者傳送到一個互聯網上。圖2.3處理器模型從圖2.4可以看出,處理對象包含了除玩家中提及的六個狀態外的兩個新的狀態。這兩個狀態分別位于未重置狀態的后面和重置狀態的前面。(1)在配置方法被調用之后,處理對象將進入這個狀態。在這個狀態中,處理程序物件會連結至資料來源,并且取得輸入資料的格式化資訊。(2)在資料來源連結結束,取得資料格式資訊后,處理物件便進入配置中。圖2.4處理器的狀態轉換圖2.2.5數據池(DataSink)數據池用于從數據源(DataSink)中讀取媒體數據,并將其輸出到指定的目標地點,此處的目標地點與上面提到的揚聲器或屏幕不同。某一種特殊的DataSink可以將資料輸出至檔案,也可以將資料傳送至網絡,也可以將資料傳送至RTP。與Player類似,數據Sink對象使用數據源作為一個參數,并使用它的管理者去構建。2.2.6數據格式(Format)在JMF體系結構中,介質的格式化信息被存儲在數據格式化對象中。該算法既沒有包含編碼參數,也沒有包含整體的時域信息。在音頻格式中,對聲音的格式進行了說明,例如取樣頻率,每個取樣的資料位元等。在視頻格式中,對H.263等視頻數據進行了說明。圖2.5表示JMF對音頻格式和視頻格式的定義:圖2.5JMF的媒體數據格式2.2.7管理器(Manager)JMF提供了下面四種管理器(Manager):(1)管理器是兩個類間的一個接口。舉例來說,如果您想要播放數據源,您可以用管理對象的CreatePlayer()方法來創建一個播放器對象。通過管理器對象,您可以創建播放器,處理器,數據源,以及數據鏈接對象。(2)JMF類的注冊信息在這個管理員中被保存。(3)在這個管理員中有一個被捕獲裝置的登記資料。(4)在這個管理員中,你可以看到JMF插件的登記信息。2.3事件模型JMF通過事件報表的方式,使得JMF可以通過該報表向JMF報表的應用程序提供對媒體系統的實時信息,使得該應用程序可以根據該報表的變化作出相應的處理。無論何時,只要有一個JMF對象想要回報其目前的狀況,就會產生一個媒體事件。媒體事件的子類包含控制器事件,數據事件,Gainchange事件,RTPEVent。對于能夠傳送媒體事件的任意一個

JMF對象,JMF都會定義一個對應的監聽界面。如果要在某個媒體事件出現的時候能夠獲得相關的消息,那么就需要實現一個合適的監聽接口,并且在相應的類中覆蓋這個接口中處理媒體事件的方法本體,并且使用addListener方法來接收這個媒體事件。如圖2.6中所示,JMF中的控制器對象,諸如玩家(Player)、處理器(Processor),以及諸如GainControl之類的控制器對象,都能夠發出媒體事件。(播放器和處理器從控制器類繼承)圖2.6JMF的事件模型圖2.7JMF控制器事件圖2.7所示為控制器(例如播放器或處理器)所生成的控制器事件,控制器事件可以被劃分為三種類型:變更通知、關機事件,以及狀態轉換事件。1.更改事件,例如Rate變更事件,持續時間最新事件,格式變更事件表示某些控制器的屬性發生了變化。2.狀態轉換事件會讓您的程序響應控制器對象的狀態轉換。玩家在從一種狀態轉換到另一種狀態時,會生成轉換事件。3.控制器在被關機時會生成一個關機事件。

3系統架構和功能模塊設計3.1MVC模式概述MVC體系結構被稱為“Model-View-Controller”,它把“建模、查看和控件”看作是構建一個軟件的三個基本元素。事件使控制器更改模型或視圖,或二者都更改。一旦控制器更改了模型中的資料或特性,就會立即更新這些視圖。同樣地,當控制器更改視圖時,視圖也會從可能的模型中提取數據并更新自身。與此對應的是,該系統也采用了

MVC思想來引導設計,實現了模塊細化,分工明確,模塊之間的三大目標。流程如圖3.1所示圖3.1流程圖3.2系統目標在音樂播放中,要使用者能夠使用最簡便、最完整的音樂播放系統。最起碼要有播放,暫停,停止,音量和進程的拖放等功能。一個好的播放機,在最基礎的操作之外,還有很多其他的特性,可以用來凸顯這個播放機的特點,比如這個播放機的歌詞。在這種條件下,玩家的設計目標就是可以實現以下功能:(1)在使用者界面視窗上的控制:播放機主視窗、播放清單視窗、歌曲顯示視窗;(2)支持多媒體文件的播放,包括播放,暫停,停止,拖拽等;(3)多媒體檔案的管理功能:增加歌曲,增加目錄,刪除歌曲,清空清單,保存清單,加載清單;(4)聲音檔案資料展示:向使用者展示聲音檔案的資料,并可由使用者自行設定資料。3.3系統功能模塊概要設計該系統還使用了MVC的開發方式,實現了控件、信息和視圖三個部分的獨立,并且存在著緊密的交互聯系,互相調用,并對它們進行了約束和依賴。所以,我們可以把該體系劃分成五大部分,這些部分分別是:其相互關系如圖3.2所示圖3.2相互關系圖3.3.1用戶界面模塊為使軟件產品接口具有友好性和簡潔性,而又要確保其功能的完整性,對玩家進行游戲的控制窗口的設計就變得更為關鍵。首先,我們來看一下這個接口的構成成分,見表3.1。表3.1控制窗口的設計把如此多的控制項放在一個很小的窗口上,會讓窗戶變得非常雜亂,不利于使用,因此要考慮好它的放置位置。根據其作用將控制面板、播放列表面板、

LRC面板分為3類。通過這種方式,就能夠實現軟件產品界面的友好性與簡潔性,條理清晰,在保證軟件產品功能完整性的同時,也給用戶提供了便利。每個板之間的聯系見圖3.3。圖3.3板塊聯系圖3.3.2播放控制模塊其中,播放器的主要功能是生成播放器,對播放器進行控制,并設定播放器的內容。該方法與每一個模塊都有緊密聯系,具體實施如下:3.3.3播放信息模塊播放信息模塊是由三個層級的嵌套構成的,分別是:圖3.4播放信息模塊圖首先看看在播放信息中,由播放狀態構成的幾個基本成分:3.3.4播放列表控制模塊3.3.5歌詞控制模塊3.4音頻文件播放邏輯3.4.1對音頻文件的傳遞在此過程中,語音文件的傳送主要是為了對歌曲的曲目進行整理。玩家在玩游戲時,首先要做的就是把游戲中的音樂文件從原來的地方轉換成原來的地方,再把原來的地方轉換成原來的地方。在要播放這個文件的時候,就要從演奏信息模塊中將目前索引所指向的這個文件地址抽取出來,并將這個位置傳遞到了演奏控制模塊,之后再將這個位置分配給管理者

Manager的新生成的媒體定位器對象(MediaLocator),

Manager在生成了播放機(Player)之后,其余的工作全部由Player來完成,來完成對語音文件的播放。聲音檔案的傳輸流程在附圖3.5中顯示。圖3.5聲音檔案的傳輸流程圖3.4.2對歌詞文件的傳遞其中,對歌曲進行LRC的數據分析和數據分析,對歌曲進行LRC的數據分析和數據分析。因為LRC歌曲的歌曲往往位于多個地點,所以它的存取及資料的處理都比較繁瑣。詳細的工藝過程見圖3-2。同時,也會把音樂檔案的所在傳送至磁碟上的播放清單。在需要重放一個檔案時,先將檔案的所在位置移至重放控制視窗,再將檔案所在的地方移至重放控制視窗。這樣,就能得到與MP3檔案相同的檔案所在的位址。將該音頻文件的所在及該音頻文件的所在之處傳遞給播放資訊模組。正在播放消息模塊中,首先對音頻文件中的TAG信息進行讀出,之后將其最后的內容傳送到歌詞處理模塊,并對其進行檢驗,確認此音頻文件中是否有歌詞,若有歌詞,就將時間信息與歌詞文字分開,并返回;當沒有嵌入的歌詞時,就會對

LRC的歌詞文件進行檢驗,若有,就會把它交給歌詞處理器,然后將它從歌詞中提取出來,然后返回;若沒有,請自行移動相關的歌曲資料夾中的歌曲。如果有,就把它傳送到歌詞控制模塊,將它從歌詞文字中剝離出來,再傳送到播放控制模塊;當有一首曲子出現時,它就會被傳送到曲子顯示視窗中,而這個視窗是用來控制曲子的。若以上三個地方均無一首歌曲,您可以通過右擊歌曲目錄中的歌曲相關功能,來進行歌曲相關,見圖3.6。圖3.6對歌詞文件的傳遞圖3.4.3播放控制流程自始至終,播放器都有一套由JMF寫成的可被調用的方法。這個程序也有一套可以執行回放、暫停、停止、拖拉等操作的程序:圖3.7播放控制流程圖

4系統詳細設計與實現4.1開發平臺及環境這個軟件采用了一個Eclipse3.2的軟件平臺,這個平臺由IBM提供。Eclipse是一個開源的,可擴展的,并且是基于Java的。可擴充的軟體,是現今最受歡迎的一種跨平臺的,自由的,整合的軟體開發環境。Eclipse自身很大,并且采用了“全部由插件構成”的設計哲學。還有幾個功能與Eclipse通過插件很好地整合在一起,并且一起工作。比如,Eclipse(SWT/JFace)的圖形開發環境,Java開發環境的插件,多語言軟件包等等。在

Eclipse開始之后,要想真的用到一個插件,這個插件就會被自動加載到記憶中,而在合適的時間里,那些不再被用到的插件會被清理出記憶,在這個系統中,用到的一個典型的插件的實例就是,在這個過程中,用到的

VisualEditor就是一個很好的例子。4.2用戶界面模塊詳細設計與實現在用戶接口中,存在著三個主要的工作,那就是(1)接收更改后的信息,并對接口信息進行顯示/更新(2)對用戶/玩家進行事件的偵聽(3)向其他控制模塊傳送更改的信息最主要的工作就是在無意中偵聽到使用者/玩家發生的事情,然后做出回應。4.2.1對播放拖動條添加拖動事件監聽器拖動TimeSlider可以得到一個事件發生在什么時候,這樣就可以將一個事件監聽程序添加到TimeSlider來捕捉這個事件。同時,在播放過程中,在定時器線程中,TimeSlider的值要被設置為currentpercent*100,也就是當前的音樂播放比例X100,具體的代碼如圖4.1所示:圖4.1播放拖動條添加拖動事件監聽器4.2.2音量拖動條添加拖動事件監聽器該音量控制拉桿控制器是一種與該“聲音”相關的回放信息,該音量控制拉桿的拉桿位置發生變化時,該音量顯示屏幕上所顯示的數值也隨之發生變化。音量顯示器上顯示的是0和100,代表的是最大音量的百分數,具體的代碼如圖4.2所示。圖4.2音量控制拖動條添加拖動事件監聽器4.2.3對鼠標點擊放開事件添加監聽器主框架的使用者介面上有許多按鍵,每按一下就會觸發一次事件,所以要為每一個按鍵增加一個監聽者是一件相當困難的事情,所以我們想出了新辦法。在MainFrame類中,實現MouseListener,ActionListener接口,而通用類MainFrame擴展JFrame,則可以實現ActionListener,MouseListener。因此,如果我們在MainFrame上實現一個界面的方法,那么我們將會主要響應MouseReleasedEvent,其具體的步驟見圖4.3:圖4.3鼠標點擊放開事件添加監聽器4.2.4時間線程在

MainFrame中,將創建一個新的時間線程Timer,它將在每1秒對

TimeLabel和

TimeSlider進行一次更新,同時還將對LRC進行更新,當

isPaused為

false,且沒有拖動事件發生的時候,Timer將會運行run

,代碼如圖4.4所示:圖4.4時間線程代碼4.2.5最小化托盤通過對系統托盤圖標的設定,可以讓玩家在后臺進行播放,如果想要將玩家叫醒到前臺,只要雙擊右下角的小圖標,就可以將玩家推出來,這樣就可以讓玩家的操作界面變得更友好,具體代碼如圖4.5所示:圖4.5系統托盤圖標4.3播放控制模塊詳細設計與實現4.3.1播放函數在多媒體播放機的眾多控制中,回放功能最為關鍵。沒有游戲規則,游戲者無法游戲,因此不能被稱作游戲者。該播放機在按下回放按鈕后,將出現兩種切換:一種為暫停回放,一種為暫停回放;第二個是從“暫停”到“回放”的過程。二是由“停”向“放”的轉換。“回放”指令是在按下“回放”鍵后,生成一個單獨的“回放”指令。在玩家接收到回放指令之后,將按如下順序進行:(1)對玩家的當前狀態進行檢驗,也就是對布爾變量

isPaused在掛起狀態下的值進行判定。如果游戲被掛起,就讓玩家繼續玩,時間計時器會啟動時間,把“不玩”的數值設為假,然后就會離開游戲控制流;在沒有被掛起的情況下,執行步驟2;(2)查看播放清單中有無介質文件,若無介質文件,就通過

ListController中增加歌曲的程序來增加,再重新執行這個程序來進行播放;如有檔案在播放清單中,則按第3步進行;(3)檢查該播放表的索引,并確定該播放表中的該歌曲是否已被選擇并正在播放。如未找到,請從該曲目中選取最早的曲目,再按第四步進行。若有一首歌被選出來,就會立即進行第四步;(4)確定待放的曲目在播放清單中的先后順序,若為前一曲目,前一曲目將被關閉,若為前一曲目,前一曲目將被激活;當播放到上一曲時,下一曲鍵將被關閉,否則將被激活;(5)確認播放方式是否為單行本,若為單行本,前一首歌及下一首歌均為無效,若為正常,(6)獲得被選擇的歌曲的播放地址,利用播放器控制進行播放,并調用歌詞顯示功能來顯示歌詞如圖4.6所示:圖4.6顯示歌詞代碼4.3.2停止函數這里有兩種方式來終止目前正在播放的音樂。第一種是在播放到目前的檔案結束后,系統就會自動關閉;二是通過按下“暫停”鍵,使用戶可以終止當前的多媒體文件。在開始的兩個階段,一是在播放階段,二是在播放階段;二是停機,即玩家進入停機狀態后,停機都失去了作用,玩家只有進入停機狀態后,玩家方可繼續工作,正在播放中。這兩種函數類似。在此,我們僅舉例一種歌曲的功能,即“上/下”按鈕。首先你要對你的音樂清單的下拉情況做出一個判斷。當指數位于首位時,前一位的特性將會失效。如果指數位于尾端,那么接下來的追蹤功能就會將指數置于首端。這段代碼的主要內容如圖4.7所示:圖4.7停止播放器4.3.4暫停函數在播放者接到暫停命令的時候,它會讓播放者暫停,停止計時器,將暫停狀態變量

isPaused為

True,將暫停按鈕隱藏起來,在顯示出播放按鈕后,就可以結束暫停的功能流程,代碼如圖4.8所示:圖4.8暫停函數4.3.5對播放至文件播放至末尾結束事件的處理在玩家中加入控制器

Listener之后,在音樂的末尾將生成一個可以被控制器Listener捕捉的EndOfMediaEvent。這個時候,首先要看的是什么情況。若是只有一次的話,便會被終止。如果只有一個周期,則會再次播放。按序播放,首先破壞現有的播放器,再添加1個播放器,以獲得下一首歌的資料,再創建一個播放器播放。因為JMF類執行控制器列表界面,所以在控制器對象生成事件時,必須在界面中執行控制器更新方法。代碼如圖4.9所示:圖4.9末尾結束事件的處理總體流程圖如圖4.10圖4.10總體流程圖4.4播放信息模塊詳細設計與實現4.4.1播放信息模塊其中,回放信息模塊的功能是對玩家在游戲中的各項操作進行記錄,并為玩家在游戲中的操作提供

get/set功能。因為該顯示信息模塊包含有顯示清單(picturelist)模塊,故該顯示信息模塊包含顯示清單(picturelist)的動作。在列表控制器中,如果想要操縱該列表,就必須使用該功能來間接地調用該功能。以下是關鍵變數如圖4.11所示:圖4.11播放信息模塊因為播放信息是一層一層地嵌套在一起的,包括了一個音樂節點的播放清單。4.4.2.播放列表我們可以把它看成一個容器。每一個playlist物件都會儲存很多的歌節點。它的功能是對音樂進行編輯,比如添加文件,刪除列表條目,清空列表等等。以下是增加、刪除、清除清單的代碼如圖4.12所示:圖4.12播放列表4.4.3歌曲信息節點“TAG”,3個字節的標記,30個字節的MP3標題,30個字節的歌手,30個字節的唱片集,4個字節的時間,30個字節的注釋,1個字節的MP3歌曲信息一個關鍵的關鍵是一個構建函數,如圖4.13所示:圖4.13歌曲信息節點4.5播放列表控制模塊詳細設計與實現其中,播放目錄的作用是對目錄進行處理,包括創建目錄,刪除目錄,加載目錄,保存目錄等。4.5.1打開文件函數在打開文件的時候,可以調用系統的文件選擇器,創建一個

JFileChooser對象,并對其進行一些篩選,你只可以打開.

wav和.mp3格式的文件,如果你沒有取消選擇,你可以將文件組添加到當前列表中,如圖4.14所示。圖4.15打開文件函數4.5.2保存/裝載列表函數一旦建立了一個對象,只要有必要,它就會一直在那里,但是一旦使用完畢,所有的對象就都消失了。在一些實際的應用中,為了在下一個應用程序開始運行時能夠及時的保存數據,需要通過JAVA的I/O來完成。序列化(例如,保存你的音樂清單)(1)由于需要有一個輸出物,因此有必要建立一個輸出流。(2)把輸出數據流包裝為一個對象輸出數據流。ObjectOutputStream是一種特殊的對象序列化方法(3)通過調用由

ObjectOutputStream所提供的

WriteObject

()方法,將該對象進行串行化,并將其轉化成一個字符串,并將該字符串行將其送至

Output

Stream指定的媒體。4.6歌詞控制模塊詳細設計與實現其中,歌詞控制模塊的功能包括:歌曲的載入、取消、識別和重新繪制。在完成LRC的讀出之后,將其轉換為歌曲的時間序列和歌曲序列。二者一一對應,一模一樣。

5結束語本文介紹Python的音頻播放器的設計與實現,通過對音頻播放器的功能。從需求分析、整體設計與實現等幾個角度,對整個音頻播放器的開發過程進行了詳細的說明。主要內容:(1)根據現有的Python的音頻播放器的現狀,對現有的Pyt

溫馨提示

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

評論

0/150

提交評論