版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 PAGE34 / NUMPAGES39基于Linux的音樂播放器設(shè)計與實現(xiàn)專 業(yè):計算機科學(xué)與技術(shù) 學(xué) 號:學(xué) 生: 指導(dǎo)教師:摘要:作為一項與人們生活息息相關(guān)的應(yīng)用,音樂播放器在人們的生活中發(fā)揮著不可替代的作用。本播放器在Linux(Debian 6.0)操作系統(tǒng)平臺下進行開發(fā),使用Qt程序開發(fā)框架實現(xiàn)播放器的GUI設(shè)計,并用Phonon多媒體API實現(xiàn)多媒體控制,最后再用C+編程實現(xiàn)。本播放器實現(xiàn)了音樂播放器的基本功能,包括“播放”、“暫?!?、“上一曲”、“下一曲”、“添加文件”、“刪除文件”、“切換背景圖標(biāo)”、“最小化到托盤”等功能。測試表明,本播放器能夠流暢地運行,并能很好地實現(xiàn)各項
2、功能,并且有一定的容錯能力,達到了設(shè)計預(yù)期的效果。同時,本播放器在穩(wěn)定性、經(jīng)濟成本等方面都有不錯的表現(xiàn)。關(guān)鍵詞:音樂播放器;Linux;Qt;PhononThe Designand Implementation ofMusic Player Based on LinuxSpecialty: Student Number: Student: Supervisor: Abstract: As an application, which is closely related to the peoples lives, music player plays an irreplaceable role
3、in peoples life. This Music player is developed under Linux (Debian 6.0) operating system with the Qt application development framework implementing the players GUI design. Phonon multimedia APIs is used for multimedia control and at last coded by C+ programming language. The music player has realiz
4、ed basic functions of ordinarymusic player,including Play function, Pause function, Previous track function, Next track function, Add files function, Delete files function, Switch background icon function, Minimize to tray function and so on. The testing results show that the player can run smoothly
5、 and realize all of functions mentioned before. The player is provided withfault tolerance as well. To sum up, the player achieves the designs expected result. At the same time, the music player has a well performance in operational stability and economic cost.Key words:Music player; Linux;Qt; Phono
6、n目 錄 TOC o 1-3 h z u HYPERLINK l _Toc325706897緒 論 PAGEREF _Toc325706897 h 1HYPERLINK l _Toc3257068981 系統(tǒng)開發(fā)平臺介紹 PAGEREF _Toc325706898 h 2HYPERLINK l _Toc3257068991.1 Linux簡介 PAGEREF _Toc325706899 h 2HYPERLINK l _Toc3257069001.2 Qt介紹 PAGEREF _Toc325706900 h 3HYPERLINK l _Toc3257069011.3 集成開發(fā)環(huán)境 PAGEREF
7、 _Toc325706901 h 3HYPERLINK l _Toc3257069021.4 Phonon簡介 PAGEREF _Toc325706902 h 4HYPERLINK l _Toc3257069032 系統(tǒng)分析 PAGEREF _Toc325706903 h 5HYPERLINK l _Toc3257069042.1 播放器舉例 PAGEREF _Toc325706904 h 5HYPERLINK l _Toc3257069052.2 功能需求分析 PAGEREF _Toc325706905 h 5HYPERLINK l _Toc3257069062.2.1 基本功能 PAGER
8、EF _Toc325706906 h 6HYPERLINK l _Toc3257069072.2.2 播放器基本設(shè)置 PAGEREF _Toc325706907 h 6HYPERLINK l _Toc3257069082.2.3 快捷鍵設(shè)置 PAGEREF _Toc325706908 h 6HYPERLINK l _Toc3257069092.2.4 上下文菜單設(shè)置 PAGEREF _Toc325706909 h 6HYPERLINK l _Toc3257069102.3 可行性分析 PAGEREF _Toc325706910 h 7HYPERLINK l _Toc3257069112.3.1
9、 經(jīng)濟可行性 PAGEREF _Toc325706911 h 7HYPERLINK l _Toc3257069122.3.2 技術(shù)可行性 PAGEREF _Toc325706912 h 7HYPERLINK l _Toc3257069132.3.3 應(yīng)用分析 PAGEREF _Toc325706913 h 7HYPERLINK l _Toc3257069142.4 總結(jié) PAGEREF _Toc325706914 h 8HYPERLINK l _Toc3257069153 系統(tǒng)設(shè)計 PAGEREF _Toc325706915 h 9HYPERLINK l _Toc3257069163.1 Qt
10、信號與槽機制介紹 PAGEREF _Toc325706916 h 9HYPERLINK l _Toc3257069173.1.1 信號 PAGEREF _Toc325706917 h 9HYPERLINK l _Toc3257069183.1.2 槽 PAGEREF _Toc325706918 h 10HYPERLINK l _Toc3257069193.1.3 信號與槽的關(guān)聯(lián) PAGEREF _Toc325706919 h 11HYPERLINK l _Toc3257069203.1.4 Qt信號和槽機制的優(yōu)點 PAGEREF _Toc325706920 h 11HYPERLINK l _T
11、oc3257069213.2 函數(shù) PAGEREF _Toc325706921 h 12HYPERLINK l _Toc3257069223.2.1 Phonon媒體框架 PAGEREF _Toc325706922 h 12HYPERLINK l _Toc3257069233.2.2 Qlist容器類 PAGEREF _Toc325706923 h 16HYPERLINK l _Toc3257069243.3 播放器的基本功能 PAGEREF _Toc325706924 h 16HYPERLINK l _Toc3257069253.3.1 建立媒體對象 PAGEREF _Toc32570692
12、5 h 16HYPERLINK l _Toc3257069263.3.2 播放控制 PAGEREF _Toc325706926 h 17HYPERLINK l _Toc3257069273.4 播放器設(shè)置 PAGEREF _Toc325706927 h 20HYPERLINK l _Toc3257069283.4.1 QSettings介紹 PAGEREF _Toc325706928 h 21HYPERLINK l _Toc3257069293.4.2 QSettings的使用 PAGEREF _Toc325706929 h 21HYPERLINK l _Toc3257069303.4.3 Q
13、Settings的亂碼問題 PAGEREF _Toc325706930 h 22HYPERLINK l _Toc3257069313.5 播放器界面設(shè)計 PAGEREF _Toc325706931 h 23HYPERLINK l _Toc3257069323.5.1 設(shè)置背景 PAGEREF _Toc325706932 h 23HYPERLINK l _Toc3257069333.5.2 設(shè)置系統(tǒng)托盤圖標(biāo) PAGEREF _Toc325706933 h 23HYPERLINK l _Toc3257069344 系統(tǒng)測試 PAGEREF _Toc325706934 h 25HYPERLINK l
14、 _Toc3257069354.1 測試介紹 PAGEREF _Toc325706935 h 25HYPERLINK l _Toc3257069364.1.1 軟件測試的目的 PAGEREF _Toc325706936 h 25HYPERLINK l _Toc3257069374.1.2 測試的方法 PAGEREF _Toc325706937 h 25HYPERLINK l _Toc3257069384.2測試設(shè)計 PAGEREF _Toc325706938 h 26HYPERLINK l _Toc3257069394.2.1 添加文件 PAGEREF _Toc325706939 h 26HY
15、PERLINK l _Toc3257069404.2.2 刪除歌曲 PAGEREF _Toc325706940 h 27HYPERLINK l _Toc3257069414.2.3 播放歌曲 PAGEREF _Toc325706941 h 27HYPERLINK l _Toc3257069424.2.4 測試結(jié)果 PAGEREF _Toc325706942 h 29HYPERLINK l _Toc3257069434.3 總結(jié) PAGEREF _Toc325706943 h 29HYPERLINK l _Toc325706944結(jié) 論 PAGEREF _Toc325706944 h 30HYP
16、ERLINK l _Toc325706945參考文獻 PAGEREF _Toc325706945 h 31HYPERLINK l _Toc325706946致 PAGEREF _Toc325706946 h 33緒論隨著經(jīng)濟的發(fā)展,人類社會發(fā)生了翻天覆地的變化,人民生活水平得到了提高,生活節(jié)奏變得更快,人們在精神上的需求甚至超過了物質(zhì)上的需求,而音樂便是他們精神生活中不可缺少的一部分。現(xiàn)代科學(xué)技術(shù)不斷發(fā)展,人們開始使用網(wǎng)絡(luò)媒介和各種數(shù)據(jù)存儲設(shè)備,使得各種音頻和視頻資源的傳播更為便捷、迅速、廣泛,于是各種音樂播放器也緊跟著發(fā)展了起來。音樂播放器作為一種用于播放各種音樂文件的多媒體播放軟件,已經(jīng)成
17、為了大家電腦里面不可或缺的一項應(yīng)用。因此設(shè)計一款優(yōu)良的音樂播放器軟件成了許多公司和個人的目標(biāo)。網(wǎng)絡(luò)上已經(jīng)存在著成各式各樣的音樂播放器。但是,它們之中有許多都是根據(jù)特定的操作系統(tǒng)來開發(fā)的,其中很大一部分都沒有實現(xiàn)跨平臺的應(yīng)用,為了應(yīng)對不同的系操作統(tǒng),它們只能重新開發(fā)新的版本。本文主要研究的就是基于Linux的音樂播放器。它基于Qt開發(fā)框架,可以實現(xiàn)跨平臺應(yīng)用,能夠在任何它所支持的平臺上編譯、執(zhí)行一樣的程序代碼,而不需要修改源代碼。另外,它還能依照不同的平臺而表現(xiàn)出該平臺特有的圖形界面風(fēng)格。研究基于Linux的音樂播放器具有一定的意義。雖然Linux和Qt已經(jīng)發(fā)展了很長的一段時間,但是對于很多國計
18、算機專業(yè)的大學(xué)生來說,它們還是比較陌生的事物。計算機行業(yè)是一個飛速發(fā)展的行業(yè),我們必須跟上它的步伐,才不會被社會淘汰。本文的目的是通過對流行音樂播放器的研究,設(shè)計并實現(xiàn)一款音樂播放器。本音樂播放器在播放音頻文件方面主要選擇播放本地文件,在功能方面主要具備一些基本的音樂操作功能,如:暫停、播放、音量調(diào)節(jié)、拖動、停止等。它在穩(wěn)定性、視覺效果、歌曲庫的大小等方面可能遠不如當(dāng)今的許多播放軟件,但是它小巧并且易移植,能夠?qū)崿F(xiàn)跨平臺運行。1 系統(tǒng)開發(fā)平臺介紹1.1 Linux簡介Linux是一種自由和開放源碼的計算機操作系統(tǒng)。目前存在著許多不同的Linux,但它們?nèi)际褂昧薒inux核。Linux可安裝在
19、各種各樣的電腦硬件設(shè)備,從手機、平板電腦、路由器和影音游戲控制臺,到桌上型電腦,大型電腦和超級電腦。Linux是一個領(lǐng)先的操作系統(tǒng),在2011年11月發(fā)布的TOP500中有91.4%的超級計算機使用的是Linux操作系統(tǒng)1。Linux操作系統(tǒng)也是自由軟件和開放源代碼發(fā)展中最著名的例子。只要遵循GNU通用公共許可證,任何人和機構(gòu)都可以自由地使用Linux的所有底層源代碼,也可以自由地修改和再發(fā)布。嚴格來講,Linux這個詞本身只表示Linux核,但在實際上人們已經(jīng)習(xí)慣了用Linux來形容整個基于Linux核,并且使用GNU 工程各種工具和數(shù)據(jù)庫的操作系統(tǒng)(也被稱為GNU/ Linux)。通常情況
20、下,Linux被打包成供桌上型電腦和服務(wù)器使用的Linux發(fā)行版本。一些流行的主流Linux發(fā)行版本,包括Debian(與其衍生版本Ubuntu),F(xiàn)edora和openSUSE等2,3。Linux的發(fā)展現(xiàn)狀目前流行的桌面操作系統(tǒng)主要包括兩大類:一類是主流商業(yè)桌面系統(tǒng),包括微軟的Windows系列、Apple的Macintosh等;第二類基于自由軟件的桌面操作系統(tǒng),特別是Linux桌面操作系統(tǒng)。近年來,特別在國市場,Linux桌面的發(fā)展趨勢非常迅猛。國如中標(biāo)軟件、紅旗等系統(tǒng)軟件廠商推出的Linux桌面操作系統(tǒng),目前已經(jīng)在政府、企業(yè)、OEM等領(lǐng)域得到了廣泛應(yīng)用。國外的Novell(SuSe)、S
21、un公司也相繼推出了基于Linux的桌面系統(tǒng)。但是,從系統(tǒng)的整體功能、性能來看,Linux桌面系統(tǒng)與Windows系列相比還有一定的差距,主要表現(xiàn)在系統(tǒng)易用性、系統(tǒng)管理、軟硬件兼容性、軟件的豐富程度等方面,如音樂播放器。Linux發(fā)展非常迅速,這與它具有的良好特性是分不開的。Linux具有的主要特性如下4:開放性。系統(tǒng)遵循世界標(biāo)準(zhǔn)規(guī),凡遵循國際標(biāo)準(zhǔn)所開發(fā)的硬件和軟件,都能彼此兼容。多用戶。系統(tǒng)資源可以被不同用戶各自擁有和使用,即每個用戶對自己的資源有特定權(quán)限,互不影響。多任務(wù)。能夠同時執(zhí)行多個程序,而且各個程序相互獨立運行。設(shè)備獨立性。將外部設(shè)備統(tǒng)一視為文件,只要安裝它們的驅(qū)動程序,任何用戶都
22、可以像使用文件一樣操縱、使用設(shè)備,而不必知道它們的具體存在形式。1.2 Qt介紹Qt是一個跨平臺的C+應(yīng)用程序開發(fā)框架5。廣泛用于開發(fā)GUI程序,這種情況下又被稱為部件工具箱。也可用于開發(fā)非GUI程序,比如控制臺工具和服務(wù)器。Qt被OPIE、Skype、VLC media player、Adobe Photoshop、VirtualBox 與Mathematica所使用。它是諾基亞(Nokia)的QtDevelopment Frameworks部門的產(chǎn)品。Qt使用標(biāo)準(zhǔn)的C+。通過語言綁定,其他的編程語言也可以使用Qt。Qt是自由且開放源代碼的軟件,在GNU較寬松公共許可證條款下發(fā)布。所有版本都
23、支持廣泛的編譯器,包括GCC的C+編譯器和Visual Studio。使用Qt開發(fā)的軟件,一樣的程序碼可以在任何支持的平臺上編譯與執(zhí)行,而不需要修改源代碼。會自動依平臺的不同,表現(xiàn)平臺特有的圖形界面風(fēng)格。除了C+外,Qt還為其它多種計算機語言提供了應(yīng)用程序接口,您也可以使用這些語言開發(fā)Qt應(yīng)用程序6。Qt主要的優(yōu)勢如下:面向?qū)ο蟆t的良好封裝機制使得Qt的模塊化程度非常高,可重用性較好,對于用戶開發(fā)來說是非常方便的。Qt提供了一種稱為signals/slots的安全類型來替代callback,這使得各個元件之間的協(xié)同工作變得十分簡單。豐富的API。Qt包括250個以上的C+類,還提供基于模板
24、的collections,serialization,file,I/O device,directory management,date /time類。甚至還包括正則表達式的處理功能。1.3 集成開發(fā)環(huán)境QtCreator是一款跨平臺的集成開發(fā)環(huán)境,QtCreator 是 Qt 被 Nokia收購后推出的一款新的輕量級IDE。此 IDE 能夠跨平臺運行,支持在桌面環(huán)境,如:Windows、Linux/X11和MacOS。與移動設(shè)備,如:Symbian、Maemo和MeeGo上建構(gòu)和運行Qt應(yīng)用程序。允許開發(fā)者為多桌面環(huán)境與移動設(shè)備平臺創(chuàng)建應(yīng)用程序。它包括一個可視化偵錯工具和整合的GUI版面和外
25、形設(shè)計師。這個編輯器的功能包括語法高亮度顯示和自動完成。根據(jù)官方描述,QtCreator 的設(shè)計目標(biāo)是使開發(fā)人員能夠利用Qt這個應(yīng)用程序框架更加快速與輕易的完成開發(fā)任務(wù)。QtCreator在 Linux上,使用GCC的C+編譯器。在 Windows,預(yù)設(shè)安裝它可以使用MinGW或MSVC。從原始碼編譯時,也可以使用cdb(MicrosoftConsoleDebugger)。在功能方面,Qt Creator 包括項目生成向?qū)?、高級?C+ 代碼編輯器、瀏覽文件與類的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、圖形化的 GDB 調(diào)試前端,集成 qmake
26、 構(gòu)建工具等 。QtCreator主要是為了幫助新 Qt 用戶更快速入門并運行項目,還可提高有經(jīng)驗的Qt開發(fā)人員的工作效率。QtCreator主要功能和優(yōu)勢如下:使用強大的C+代碼編輯器可快速編寫代碼。語法標(biāo)識和代碼完成功能輸入時進行靜態(tài)代碼檢驗以與提示樣式上下文相關(guān)的幫助代碼折疊括號匹配和括號選擇模式高級編輯功能。使用瀏覽工具管理源代碼。集成了領(lǐng)先的版本控制軟件,包括Git、Perforce和Subversion開放式文件,無須知曉確切的名稱或位置搜索類和文件跨不同位置或文件沿用符號在頭文件和源文件,或在聲明和定義之間切換。為Qt跨平臺開發(fā)人員的需求而量身定制。集成了特定于Qt的功能,如信號
27、與槽(Signals/Slots)圖示調(diào)試器,對Qt類結(jié)構(gòu)可一目了然集成了Qt Designer可視化布局和格式構(gòu)建器只需單擊一下就可生成和運行Qt項目。1.4 Phonon簡介Phonon是KDE(Kool Desktop Environment)的多媒體API,為使用音頻和視頻的應(yīng)用程序開發(fā)提供的一個框架7。應(yīng)用程序不用去管多媒體播放是通過什么實現(xiàn)的(如GStreamer),只需調(diào)用相應(yīng)的接口就行,但這中間需要一個中轉(zhuǎn),被稱為backend。Phonon提供一個穩(wěn)定的API允許KDE4獨立于任何一個聲音系統(tǒng)服務(wù)器,Phonon從一開始就被設(shè)計成Qt函數(shù)的風(fēng)格,Phonon并非只能運行于Un
28、ix系統(tǒng),他的后端可以是在其它平臺如 Microsoft Windows 并提供一樣的功能。正是由于Phonon能夠?qū)崿F(xiàn)跨平臺使用,使得Qt4.4和之后版本使用了Phonon,作為跨平臺的音頻和視頻播放。Phonon讓各種后端提供界面給開發(fā)者所謂的“引擎”,每個引擎運作在一個具體的后端。每個后端都可讓Phonon控制基本功能,如播放、暫停和搜尋。Phonon也支持更高層次的功能,如讓音軌轉(zhuǎn)化之間變微弱。使用Solid,Phonon將給予用戶更多配件的控制能力如耳機、揚聲器、麥克風(fēng)。2 系統(tǒng)分析2.1 播放器舉例Windows下的音樂播放器:Windows Media Player 是一款Win
29、dows系統(tǒng)自帶的播放器,支持通過插件增強功能,在V7與以后的版本,支持換膚。1992年微軟在Windows 3.1當(dāng)中捆綁了WMP1.0,使Windows3.1成為第一代支持多媒體的Windows系統(tǒng)。后來,在Windows 98當(dāng)中置了WMP64,這個版本存在于后續(xù)的操作系統(tǒng)中,并被一直保留至今。另外,Windows有千千靜聽、 音樂、酷狗音樂等優(yōu)秀播放器,功能十分完善,界面十分華麗,設(shè)計人性化,操作靈活、簡單,種類十分豐富。Linux下的音樂播放器:Audacious與其它播放器的不同之處在于,它除了支持UTF-8字符集之外,還提供其它字符集的支持,這樣能比較好的解決中文亂碼的問題。更重
30、要的一點是,它能很好的播放APE格式的音樂 。Juk是一個很易用的播放器,而且界面方面做得比較美觀。但似乎它不能直接讀取windows分區(qū)里的音樂文件,如果音樂都在NTFS分區(qū)里,會給用戶帶來不少不便。Bmpx相對前面兩者的特色在于最小化到托盤后的播放提示。 Rhythmbox 是一款集成化的音樂管理工具,創(chuàng)建靈感來源于iTunes播放器,以GNOME桌面系統(tǒng)和GStreamer媒體框架為基礎(chǔ)。不僅可以播放多種格式的音樂文件,還可以連接到互聯(lián)網(wǎng)中接受網(wǎng)絡(luò)收音機或者到網(wǎng)上音樂商店購買音樂4。雖然Linux上的音樂播放軟件并不缺乏,但是很多的軟件技術(shù)層面并不是非常超前,只是簡簡單單,一切都由插件搞
31、定,只是靠它整合的完整性讓人簡簡單單完成音樂播放的任務(wù)。在缺乏商業(yè)化因素的支持下,Linux音樂播放器的用戶體驗并不高。由于Linux在圖形界面、用戶操作方面的劣勢,現(xiàn)在的Linux應(yīng)用程序在在向windows學(xué)習(xí),應(yīng)用程序界面更加豐富,更加美觀,更加人性化,種類也更加豐富。開發(fā)者也在想更加團隊、專業(yè)發(fā)展。2.2 功能需求分析音樂播放器作為一款必不可少的應(yīng)用程序,廣泛應(yīng)用于電腦、智能手機、嵌入式設(shè)備,有著龐大的客戶人群。本文設(shè)計并實現(xiàn)一款簡單的播放器,能夠?qū)崿F(xiàn)音樂播放器的一般基本功能。現(xiàn)將本播放器能夠?qū)崿F(xiàn)的功能做一些分析。2.2.1 基本功能實現(xiàn)音頻的播放,這是開發(fā)一款音樂播放器的最基本要求,
32、能夠?qū)崿F(xiàn)音頻播放、暫停、停止、進度拖動、音量控制、上一首、下一首等基本功能。同時,在用戶使用播放器的過程中,能夠打開本地音頻文件,將文件動態(tài)的添加到播放器當(dāng)前播放列表,實現(xiàn)文件的打開操作8。為了方便用戶的使用,本文能夠?qū)⒂脩舻牟シ帕斜泶鎯υ诒镜匚募校?dāng)系統(tǒng)下次啟動的時候,能夠獲取用戶的歷史播放列表,并且將其添加進播放器的播放列表中。同時,如果用戶想刪除某首歌曲,可以將其從當(dāng)前播放列表中刪除。為了能夠使用戶清楚自己的播放歷史,播放器實現(xiàn)了播放歷史記錄功能,將用戶的播放歷史記錄在本地文件中,可以方便用戶的查看。播放器還有一些其他的功能,如:雙擊播放器列表實現(xiàn)文件的播放,系統(tǒng)關(guān)閉提示,最小化到系統(tǒng)
33、托盤,鼠標(biāo)拖動窗口等。2.2.2 播放器基本設(shè)置為了讓用戶對播放器有更好的體驗,本文實現(xiàn)了對播放器的設(shè)置功能,能夠?qū)Σシ牌鬟M行一些基本設(shè)置,將設(shè)置結(jié)果保存在播放器的配置文件中,每次播放器啟動的時候,首先讀取配置文件,根據(jù)其中的容,配置播放器的相關(guān)項。能夠?qū)崿F(xiàn)的基本配置有:背景圖標(biāo)的切換、語言切換、默認打開文件路徑、是否最小化、播放器關(guān)閉提示。2.2.3 快捷鍵設(shè)置為了方便用戶的操作,現(xiàn)在絕大部分的應(yīng)用軟件都設(shè)置有快捷鍵操作,能夠?qū)崿F(xiàn)對軟件的快捷操作。本文也根據(jù)需要設(shè)置了相關(guān)的快捷鍵,實現(xiàn)對播放器的控制。2.2.4 上下文菜單設(shè)置在播放器的設(shè)計過程中,參照主流音樂播放器的一些特點,為本播放器的托
34、盤圖標(biāo),播放列表,和播放器的主窗體設(shè)置有相關(guān)的上下文菜單。當(dāng)用戶點擊鼠標(biāo)右鍵,能夠彈出相應(yīng)的菜單選項,提供不同的操作。比如,當(dāng)用戶右鍵播放器托盤圖標(biāo)的時候,彈出的菜單有:最小化、復(fù)原、設(shè)置等,當(dāng)用戶右擊播放列表,彈出菜單有:刪除此歌曲、刪除全部歌曲、打開文件等功能。2.3 可行性分析對于基于Linux的音樂播放器的設(shè)計與實現(xiàn)的可行性,本文將從經(jīng)濟、技術(shù)和應(yīng)用三方面進行分析。2.3.1 經(jīng)濟可行性Debian是一種自由和開放源碼的類Unix操作系統(tǒng),系統(tǒng)軟件本身的安裝和使用都不需要任何費用。Qt分為兩種版本:Qt商業(yè)版。提供給商業(yè)軟件開發(fā)。它們提供傳統(tǒng)商業(yè)軟件發(fā)行版并且提供在協(xié)議有效期的免費升級
35、和技術(shù)支持服務(wù)。Qt開源版。僅僅為了開發(fā)自由和開放源碼軟件,提供了和商業(yè)版本同樣的功能。GNU通用公共許可證下,它是免費的。本系統(tǒng)采用Qt開源版,不需要任何費用。所以,基于Linux的音樂播放器在開發(fā)過程中,不需要任何的附加費用,能夠?qū)崿F(xiàn)“零成本”的可行性。2.3.2 技術(shù)可行性首先,基于Linux的音樂播放器,實現(xiàn)一般音樂播放器的基本功能(播放,暫停,快進),沒有十分復(fù)雜的其他功能,如:網(wǎng)絡(luò)下載,歌詞下載等,這些都能夠運用所學(xué)的知識實現(xiàn),這些功能都可以通過調(diào)用Phonon的API來實現(xiàn)。Qt對于大多數(shù)人來說,還是一個新事物,但是它只是一個跨平臺應(yīng)用程序和UI開發(fā)框架,而且這個項目對于Qt的運
36、用不是很深入,只是對于某一些基本的理論知識的學(xué)習(xí)和運用。同時在Linux下使用Qt的集成開發(fā)環(huán)境 Qt Creator與在windows平臺下沒有太大差別。此項目使用過的編程語言是C+,作為一項高級語言,與C、C#、Java都有很多相似性。最后,Linux、Qt作為開源軟件,在網(wǎng)絡(luò)上有許多開源社區(qū),有很多開源愛好者,能夠查到許多相關(guān)的源代碼,通過充分運用這些網(wǎng)絡(luò)資源,對自己完成設(shè)計有很大幫助。2.3.3 應(yīng)用分析本文是在Debian操作系統(tǒng)平臺上進行的開發(fā),使用Qt實現(xiàn)C+圖形用戶界面開發(fā),Phonon實現(xiàn)多媒體編程。由于Qt和Phonon都具有跨平臺的特性,使用Qt開發(fā)的軟件,一樣的程序代碼
37、可以在任何支持的平臺上編譯與執(zhí)行,而不需要修改源代碼。只要操作系統(tǒng)安裝有Qt和Phonon的相關(guān)類庫,本播放器能夠在 Linux、Windows、Mac OS X等操作系統(tǒng)上使用。所以能夠支持播放器的操作系統(tǒng)十分廣泛。本播放器實現(xiàn)了大部分基本功能,能夠滿足用戶一般的播放需要。資源獲取途徑方面,本播放器可以不受限制地獲取本地計算機上的所有資源,同時資源獲取方便快捷。界面觀感方面,桌面應(yīng)用程序除了自身的菜單欄和工具欄之外,沒有多余的菜單欄和工具欄。2.4 總結(jié)本課題通過對Linux環(huán)境下的音樂播放器技術(shù)的相關(guān)研究,了解了Linux平臺下的體系結(jié)構(gòu),以與QT開發(fā)平臺使用,掌握了音樂播放器的實現(xiàn)原理以
38、與過程,從而設(shè)計出一款用戶界面友好的音樂播放器。通過以上分析,播放器的功能不是非常復(fù)雜,完成這個音樂播放器的知識大都已經(jīng)具備,所以能夠較好的完成。主要研究容包括以下幾個方面:查找相關(guān)書籍與文獻,了解LINUX的構(gòu)架并搭建LINUX平臺。查找相關(guān)資料,了解QT Creator的開發(fā)方式以與QT庫的使用,搭建QT平臺。查找現(xiàn)階段基于LINUX平臺手機音樂播放器發(fā)展現(xiàn)狀以與相關(guān)功能。在上述基礎(chǔ)上,做出音樂播放器的相關(guān)功能如下:美觀、時尚的操作界面。滾動顯示正在播放的歌曲與其長度信息。音頻的播放、暫停、停止、快進等功能。顯示歌曲的播放進度。通過播放列表來選擇播放曲目。音樂播放器的控制設(shè)置功能。音樂播放
39、器的控制設(shè)置功能等。在LINUX平臺上完成該課題的軟件,然后進行相應(yīng)的軟件測試。3 系統(tǒng)設(shè)計3.1 Qt信號與槽機制介紹在以往的GUI用戶界面中,用戶操作一個窗口部件時,需要其他窗口部件的響應(yīng)或者能夠激活其他操作。在程序開發(fā)中,經(jīng)常使用回調(diào)(callback)機制來實現(xiàn)。但是,QT不同于回調(diào)機制,他使用信號與槽機制。信號和槽機制是 QT 的核心機制,要精通 QT 編程就必須對信號和槽有所了解。信號和槽是一種高級接口,應(yīng)用于對象之間的通信,它是 QT 的核心特性,也是 QT 區(qū)別于其它工具包的重要地方。信號和槽是 QT 自行定義的一種通信機制,它獨立于標(biāo)準(zhǔn)的 C/C+ 語言,因此要正確的處理信號
40、和槽,必須借助一個稱為 moc(Meta Object Compiler)的 QT 工具,該工具是一個 C+ 預(yù)處理程序,它為高層次的事件處理自動生成所需要的附加代碼9。在人們熟知的很多 GUI 工具包中,窗口小部件 (widget) 都有一個回調(diào)函數(shù)用于響應(yīng)它們能觸發(fā)的每個動作,這個回調(diào)函數(shù)通常是一個指向某個函數(shù)的指針。但是,在 QT 號和槽取代了這些凌亂的函數(shù)指針,使得我們編寫這些通信程序更為簡潔明了。 信號和槽能攜帶任意數(shù)量和任意類型的參數(shù),他們是類型完全安全的,不會像回調(diào)函數(shù)那樣產(chǎn)生 core dumps。所有從 QObject 或其子類 (例如Qwidget) 派生的類都能夠包含信號
41、和槽。當(dāng)對象改變其狀態(tài)時,信號就由該對象發(fā)射 (emit) 出去,這就是對象所要做的全部事情,它不知道另一端是誰在接收這個信號。這就是真正的信息封裝,它確保對象被當(dāng)作一個真正的軟件組件來使用。槽用于接收信號,但它們是普通的對象成員函數(shù)。一個槽并不知道是否有任何信號與自己相連接。而且,對象并不了解具體的通信機制??梢詫⒑芏嘈盘柵c單個的槽進行連接,也可以將單個的信號與很多的槽進行連接,甚至于將一個信號與另外一個信號相連接也是可能的,這時無論第一個信號什么時候發(fā)射系統(tǒng)都將立刻發(fā)射第二個信號??傊?,信號與槽構(gòu)造了一個強大的部件編程機制。3.1.1 信號當(dāng)某個信號對其客戶或所有者發(fā)生的部狀態(tài)發(fā)生改變,信
42、號被一個對象發(fā)射。只有定義過這個信號的類與其派生類能夠發(fā)射這個信號。當(dāng)一個信號被發(fā)射時,與其相關(guān)聯(lián)的槽將被立刻執(zhí)行,就象一個正常的函數(shù)調(diào)用一樣。信號與槽機制完全獨立于任何 GUI 事件循環(huán)。只有當(dāng)所有的槽返回以后發(fā)射函數(shù)emit()才返回。如果存在多個槽與某個信號相關(guān)聯(lián),那么,當(dāng)這個信號被發(fā)射時,這些槽將會一個接一個地 執(zhí)行,但是它們執(zhí)行的順序?qū)请S機的、不確定的,我們不能人為地指定哪個先執(zhí)行,哪個后執(zhí)行。信號的聲明是在頭文件中進行的,QT 的 signals 關(guān)鍵字指出進入了信號聲明區(qū),隨后即可 聲明自己的信號。例如,下面定義了兩個信號:signals: void mySignal();
43、void mySignal(int x); 在上面的定義中,signals 是 QT 的關(guān)鍵字,而非 C/C+ 的。接下來的一行void mySignal() 定義了信號mySignal,這個信號沒有攜帶參數(shù);接下來的一行void mySignal(int x) 定義了重名信號 mySignal,但是它攜帶一個整形參數(shù),這有點類似于 C+ 中的虛函數(shù)。從形式上講信號的聲明與普通的C+函數(shù)是一樣的,但是信號卻沒有函數(shù)體定義。另外,信號的返回類型都是void,不要指望能從信號返回什么有用信息。信號由moc自動產(chǎn)生,它們不應(yīng)該在.cpp文件中實現(xiàn)6。3.1.2 槽槽是普通的 C+ 成員函數(shù),可以被正
44、常調(diào)用,它們唯一的特殊性就是很多信號可以與其相關(guān)聯(lián)。當(dāng)與其關(guān)聯(lián)的信號被發(fā)射時,這個槽就會被調(diào)用。槽可以有參數(shù),但槽的參數(shù)不能有缺省值。既然槽是普通的成員函數(shù),因此與其它的函數(shù)一樣,它們也有存取權(quán)限。槽的存取權(quán)限決定了誰能夠與其相關(guān)聯(lián)。同普通的 C+ 成員函數(shù)一樣,槽函數(shù)也分為三種類型,即 public slots、private slots 和 protected slots。public slots類型。在這個區(qū)聲明的槽意味著任何對象都可將信號與之相連接。這對于組件編程非常有用,你可以創(chuàng)建彼此互不了解的對象,將它們的信號與槽進行連接以便信息能夠正確的傳遞。protected slots類型。
45、在這個區(qū)聲明的槽意味著當(dāng)前類與其子類可以將信號與之相連接。這適用于那些槽,它們是類實現(xiàn)的一部分,但是其界面接口卻面向外部。private slots類型。在這個區(qū)聲明的槽意味著只有類自己可以將信號與之相連接。這適用于聯(lián)系非常緊密的類。槽也能夠聲明為虛函數(shù),這也是非常有用的。槽的聲明也是在頭文件中進行的。例如,下面聲明了兩個槽:public slots: void mySlot(); void mySlot(int x); 在上面的定義中,slots是 QT 的關(guān)鍵字。接下來的一行void mySlot() 定義了槽mySlot,這個槽沒有攜帶參數(shù);接下來的一行void mySlot(int x
46、)定義了重名槽 mySlot,但是它攜帶一個整形參數(shù)。槽的返回類型都是void。3.1.3 信號與槽的關(guān)聯(lián)信號是一個特定的標(biāo)識,槽就是一個函數(shù),卻與一般函數(shù)不同,槽函數(shù)能和信號關(guān)聯(lián),也能夠被直接調(diào)用。Qt利用信號與槽(signals/slots)機制取代傳統(tǒng)的callback來進行物件之間的溝通。當(dāng)操作事件發(fā)生的時候,物件會發(fā)送出一個信號(signal);而槽(slot)則是一個函式接受特定信號并且執(zhí)行槽本身設(shè)定的動作。在程序中,使用QObject:connect()函數(shù)來將信號與槽關(guān)聯(lián)。信號與槽的關(guān)聯(lián)關(guān)系有以下幾種模式:一個信號和槽關(guān)聯(lián)。一個信號和多個槽關(guān)聯(lián)。多個信號和一個槽關(guān)聯(lián)。一個信號與
47、多個槽關(guān)聯(lián)的情況下,當(dāng)發(fā)出信號的時候,與此信號關(guān)聯(lián)的各個槽之間以任意的先后順序立即執(zhí)行,即:槽函數(shù)之間的執(zhí)行順序是隨機的,與信號和槽關(guān)聯(lián)的先后沒有關(guān)系。同時,信號和槽機制是完全和GUI事件完全獨立的,槽函數(shù)獨立循環(huán)。信號在任何執(zhí)行點上皆可發(fā)射,甚至可以在槽里再發(fā)射另一個信號,信號與槽的連結(jié)不限定為一對一的連結(jié),一個信號可以連結(jié)到多個槽或多個信號連結(jié)到同一個槽,甚至信號也可連接到信號。3.1.4 Qt信號和槽機制的優(yōu)點信號和槽機制有以下優(yōu)點10:類型安全的。以往的callback缺乏類型安全,在呼叫處理函數(shù)時,無法確定是傳遞正確型態(tài)的參數(shù)。信號和其接受的槽之間傳遞的資料型態(tài)必須要相符合,需要關(guān)聯(lián)
48、的信號和槽的簽名必須是等同的,即信號的參數(shù)類型和參數(shù)個數(shù)與接受該信號的槽的參數(shù)類型和參數(shù)個數(shù)一樣;不過,一個槽的參數(shù)個數(shù)是可以少于信號的參數(shù)個數(shù),但缺少的參數(shù)必須是信號參數(shù)的最后一個或幾個參數(shù)。如果信號和槽的簽名不符,編譯器會報錯。信號和槽可接受任何數(shù)量、任何型態(tài)的參數(shù),所以信號與槽機制是完全類型安全。松散耦合的。Qt信號和槽機制減弱了Qt對象的耦合度。激發(fā)信號的Qt對象無需知道是哪個對象的哪個槽需要接收它發(fā)出的信號,它需要做的是在適當(dāng)?shù)臅r間發(fā)送適當(dāng)?shù)男盘柧涂梢粤?,而不需要知道也不必關(guān)心它的信號有沒有被接收到,更不需要知道是哪個對象的哪個槽接收到了信號,也就是說一個信號可以呼叫所有可用的槽。同
49、樣的,對象的槽也不知道是哪些信號關(guān)聯(lián)到了自己。而一旦關(guān)聯(lián)信號和槽,Qt就保證了合適的槽得到調(diào)用。即使關(guān)聯(lián)的對象在運行時被刪除,應(yīng)用程序也不會出現(xiàn)崩潰。此機制會確保當(dāng)在“連接”信號和槽時,槽會接受信號的參數(shù)并且正確執(zhí)行。信號與槽的效率問題。信號和槽機制增強了對象間通信的靈活性,然而也損失了一些性能。與callback相比較,信號與槽有些慢。原因有:需要定位接受信號的對象;安全的遍歷所有的關(guān)聯(lián)(如:一個信號關(guān)聯(lián)到多個槽);多線程,信號可能排隊等待。但是,與創(chuàng)建堆對象時的new操作實例化對象,以與刪除堆對象的delete操作相比較,信號與槽的代價只是他的很少的一部分。信號和槽帶來的性能損耗,對實時應(yīng)
50、用程序是很小的。相對于信號與槽帶來的靈活與簡便,這點性能損失是可以接受的。3.2 函數(shù)基于Linux的播放器使用了Phonon多媒體框架和Qt框架的相關(guān)函數(shù),現(xiàn)簡要介紹如下。3.2.1 Phonon媒體框架Phonon 有三個基本概念:媒體對象、接收端和路徑,圖3-1是Phonon架構(gòu)圖7:圖3-1 Phonon框架圖3-1是Phonon的架構(gòu)圖。Media Object(媒體對象)管理一個Media Source(媒體源),比如一個音樂文件;它提供了簡單的播放控制,比如開始、停止和暫停播放。Sink是輸出多媒體,通常是一個播放的裝置(如聲卡),且只接受MediaObject來的數(shù)據(jù)。多媒體由
51、MediaObject控制播放,而由Sink來處理這些多媒體。Path是用來連接 Phonon對象的,比如,一個媒體對象和一個接收端,從而構(gòu)成了Phonon 中的MediaGraph,如圖3-2所示:圖3-2 媒體文件播放過程圖3-2是媒體文件的播放過程,這些在不同的系統(tǒng)中實現(xiàn)方式不同,如:在Linux環(huán)境下,通常使用GStreamer庫,在Max OS X 環(huán)境下,使用QuickTime,在windows下,使用Direct X和SirectShow庫。而Qt中的phonon作為跨平臺的多媒體解決方案,就應(yīng)該為用戶屏蔽掉這些差異,如圖3-3所示:圖3-3 詳細Phonon框架圖3-3是Pho
52、non的詳細框架圖,由圖可知Phonon框架實質(zhì)上分4個部分:程序、Phonon庫、Phonon后端插件(phonon_backend)、真正的后端。Phonon其實什么都不干,他只是提供了一套API接口,這套接口可以給你的程序調(diào)用,同時也是給編寫后端插件提供一個規(guī)。同樣,Phonon庫也不知道,他只管搜索符合自己規(guī)的插件。并告訴這些插件,現(xiàn)在程序發(fā)出的指令是什么,從插件返回給程序現(xiàn)在的媒體狀態(tài)和信息。而后端才是實際進行讀入媒體、解碼并且播放的部分,他們和后端插件是一一對應(yīng)的。后端可以是任何形式,只要你寫出了相應(yīng)的后端插件。Phonon函數(shù)成員如圖3-4所示7:圖3-4 主要的Phonon類播
53、放器主要使用的Phonon類與使用方法介紹如下11:Phonon:MediaObject ClassMediaObject主要提供一個能夠處理媒體播放的類。MediaObject可說是處理多媒體文件最基本的一部份,它接受并管理來自于MediaSource的媒體文件。而媒體播放、暫停與停止都是由它來控制;而在此之前,mediaObject必須要與output node連接,如早先所講的,這個nodes主要將媒體輸出至底層的硬件,例如聲卡或顯卡等,而所需要的output node則是根據(jù)多媒體的容而所不同,目前Phonon有兩種output node:eq oac(,1)AudioOutput聲音
54、播放。eq oac(,2)VideoWidget影像播放。用法:Phonon:MediaObject *mediaObject=new Phonon:MediaObject(this);mediaObject-setCurrentSource(Phonon:MediaSource(/mymusic/barbi.wav);Phonon:AudioOutput ClassAudioOutput類別主要是用來把多媒體的聲音送到聲音輸出裝置。所以它能夠經(jīng)由類似喇叭等輸出裝置來播放聲音,多媒體資料的來源必須要經(jīng)過Phonon:createPath()與MediaObject連接。在Phonon術(shù)語中,我
55、們要創(chuàng)建的AudioOutput對象叫做音頻接收槽。它是直接與音頻驅(qū)動器通信的層的組成部分,并充當(dāng)MediaObject的虛擬音頻設(shè)備。MediaObject位于這一層的上層,增加了諸如暫停、播放和倒帶之類的功能。用法:AudioOutput *audioOutput=new AudioOutput(Phonon:MusicCategory, this);Phonon:createPath()這是相當(dāng)重要的一個函數(shù),主要用于建立一個Path,連接兩個MediaNodes,就是Source與Sink。如果只是利用Phonon來播放多媒體影音文件,其實只要記得它是用來連接source與輸出裝置即可
56、。用法:Phonon:Path path=Phonon:createPath(mediaObject, audioOutput);Phonon:SeekSlider classSeekSlider類別提供一個可滑動的slider來設(shè)定多媒體串流播放的位置。所以它會連接到MediaObject,并控制串流目前的位置。用法:Phonon:SeekSlider *seekSlider = new Phonon:SeekSlider(this);seekSlider -setMediaObject(mediaObject);seekSlider -show();Phonon:VolumeSlider
57、ClassVolumeSlider提供可以控制聲音裝置音量的類。用法其實與上面的SeekSlider類似,使用例如下:Phonon:VolumeSlider *volumeSlider = new Phonon:VolumeSlider;volumeSlider-setAudioOutput(audioOutput);3.2.2 Qlist容器類QList不是Phonon的類成員,而是Qt的一個類庫,它是一種表示鏈表的模板類。Qlist是Qt的一種泛型容器類。它以鏈表方式存儲一組值,并能對這組數(shù)據(jù)進行快速索引,還提供了快速插入和刪除等操作。QList是一組指向被存儲元素的數(shù)組。元素個數(shù)小于10
58、00的QList能夠很快地實現(xiàn)在鏈表中間插入操作,以與快速的查找操作。此外,由于QList在鏈表兩端都預(yù)先分配了緩存以應(yīng)對鏈表兩端的快速添加操作,這樣就使得在QList的兩端插入或刪除元素變得非常迅速。很適合使用Qlist來存儲播放器的播放列表,用法:QList sourceList;3.3 播放器的基本功能在使用Phonon多媒體框架前,需要在項目額外設(shè)定使用Phonon模組,必須要在qmaek project file(即.pro)中加入:QT += phonon,將Phonon庫添加進項目6。3.3.1 建立媒體對象首先實例化使用的Phonon類:mediaObject =new Pho
59、non:MediaObject(this);audioOutput =new Phonon:AudioOutput(Phonon:MusicCategory,this);seekSlider = new Phonon:SeekSlider(ui-progresswidget);volumeSlider=new Phonon:VolumeSlider(ui-Volumewidget);將媒體對象(mediaObject)和音頻輸出設(shè)備(audioOutput)使用函數(shù)Phonon:createPath()連接起來:Phonon:createPath(mediaObject, audioOutpu
60、t);將進度條seekSlider與媒體對象mediaObject進行關(guān)聯(lián),使得歌曲播放的進度和進度條,同時將音量控制條與音頻輸出設(shè)備連接:seekSlider-setMediaObject(mediaObject);volumeSlider-setAudioOutput(audioOutput); 最后,將進度條和音量控制條顯示在主窗口中:seekSlider-show();volumeSlider-show(); 3.3.2 播放控制系統(tǒng)實現(xiàn)的功能如圖3-5所示12:圖3-5 播放器的基本功能圖3-5是播放器的基本功能截圖,包括:暫停、播放等功能。播放當(dāng)點擊播放按鍵時,播放器播放用戶選中的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東科學(xué)技術(shù)職業(yè)學(xué)院《過程控制專題》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東工業(yè)大學(xué)《大數(shù)據(jù)和人工智能導(dǎo)論》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東創(chuàng)新科技職業(yè)學(xué)院《CPA稅法》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)生口才表演課件圖片
- 培訓(xùn)學(xué)校課件
- 廣東碧桂園職業(yè)學(xué)院《音樂律動(一)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《如何品鑒葡萄酒》課件
- 贛南醫(yī)學(xué)院《國際商法與公司治理》2023-2024學(xué)年第一學(xué)期期末試卷
- 《外周血管介入護理》課件
- 贛東學(xué)院《實驗室安全與法規(guī)》2023-2024學(xué)年第一學(xué)期期末試卷
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之4:4組織環(huán)境-4.2理解相關(guān)方的需求和期望(雷澤佳編制-2025B0)
- 2024年一級支行行長競聘演講稿例文(4篇)
- 健身房銷售人員培訓(xùn)
- 建筑工程施工合同:游泳館建設(shè)
- 2024-2025學(xué)年 數(shù)學(xué)二年級上冊冀教版期末測試卷(含答案)
- 2024年1月遼寧省普通高中學(xué)業(yè)水平合格性考試物理試題(含答案解析)
- 期末測試卷(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)滬教版
- 建工會職工之家的申請.doc
- CSFB信令流程(常用)
- 激光技術(shù)課程設(shè)計-MATLAB編程-聚光腔設(shè)計
- 中國航海-論文排版格式
評論
0/150
提交評論