Java课程设计报告—音乐播放器
目錄
Java課程設(shè)計報告
1.設(shè)計內(nèi)容及要求?
2.需求分析?
3.總體設(shè)計
4.主要功能設(shè)計流程
5.系統(tǒng)實現(xiàn)及測試
6.總結(jié)與說明?
Java課程設(shè)計報告
題目:java音樂播放器
姓????名??????
學(xué)????號???????
院 ???系 ?????
班 ???級 ???????
專 ???業(yè) ?????
任課教師 ????
1.設(shè)計內(nèi)容及要求?
??能夠?qū)崿F(xiàn)簡單的音樂播放器功能,如:打開本地文件,播放,暫停,停止,背景播放,單曲循環(huán)等等,界面充實,交互友好,可以添加多首歌曲目錄?
一個簡單的基于java語言的音樂播放器,菜單欄:文件,播放 控制和播放列表,文件菜單包含打開、循環(huán)和退出三個菜單項;播放控制菜單包含播放、暫停和停止三個菜單項,播放列表菜單則是當(dāng)向里面添加歌曲之后才能夠查看到里面所包含的歌曲目錄。當(dāng)播放歌曲時,可以調(diào)節(jié)音量大小或者設(shè)置是否靜音;可以查看當(dāng)前播放音樂的相關(guān)屬性,如:歌曲名,歌手,發(fā)布時間,所屬專輯等等。
2.需求分析?
1.時間跟蹤條:根據(jù)歌曲播放的進度,控制條自動進行追蹤,用戶可以隨時了解歌曲的播放進度?
2、音量控制鍵:可以點擊該控鍵進行音量大小的調(diào)節(jié)以及是否靜音的設(shè)置?
3、屬性查詢鍵:通過該控鍵,用戶可以查看當(dāng)前播放音樂的相屬性,獲取關(guān)于該歌曲的用戶所需的相關(guān)信息。
4、菜單欄:
①文件:
打開:用戶通過該菜單項打開本地音樂文件,聽任何用戶想聽的歌曲循環(huán):通過循環(huán)設(shè)置,用戶可以重復(fù)的播放一首喜歡的歌曲退出:退出音樂播放器,及退出該程序
②播放控制:
播放:選擇歌曲之后,通過點擊播放菜單項啟動播放器播放音樂暫停:暫停當(dāng)前正在播放的音樂停止:停止當(dāng)前正在播放的音樂
③播放列表:當(dāng)用戶通過文件打開本地音樂文件后,及相當(dāng)于在播放列表里面添加了歌曲,及形成相應(yīng)的歌曲播放目錄
3.總體設(shè)計
????結(jié)合需求分析來看,整個設(shè)計包含了簡單的菜單欄,根據(jù)用戶需求設(shè)置了三個簡單的實現(xiàn)基本操作的菜單,分別是:文件,播放控制,播放列表;根據(jù)具體的操作每個菜單還包含了相應(yīng)的菜單項,文件:打開,循環(huán),退出;播放控制:播放,暫停,停止;播放列表則沒有菜單項,該菜單就是用來顯示或者查看相應(yīng)的歌曲目錄的。? 該音樂播放器設(shè)置了兩個窗口,運行程序時打開的初始化歡迎界面,用戶可以根據(jù)自己的需求進行菜單欄里面的基本操作和相應(yīng)的設(shè)置,當(dāng)用戶添加或者打開音樂播放文件的時候,程序?qū)@示出第二個音樂文件播放窗口,與此同時,第一個初始化窗口將會自動隱藏,在音樂播放窗口里面用戶可以進行相關(guān)的音樂播放的控制操作。當(dāng)用戶進入音樂播放窗口時,該窗口有幾個快捷控制的控鍵:時間追蹤軸:可以實現(xiàn)播放的前進、后退功能,根據(jù)用戶需求調(diào)節(jié)音樂的播放進度等;音量控制:設(shè)置靜音,打開揚聲器或者調(diào)節(jié)音量大小;播放列表:查看當(dāng)前播放音樂的相關(guān)屬性。
4.主要功能設(shè)計流程
5.系統(tǒng)實現(xiàn)及測試
(一)JMF(java媒體框架)簡介?
????JMF 即Java媒體框架。其核心框架支持不同媒體,如音頻輸出和視頻輸
出,包括時間的時鐘同步。它是一個標(biāo)準(zhǔn)的擴展框架,允許用戶制作純音頻流和視頻流。
????JMF實際上是Java的一個類包。它包括了一個開放的媒體架構(gòu),可使開發(fā)人員靈活采用各種媒體回放、捕獲組件,或采用他們自己的定制的內(nèi)
插組件。 ?
??JMF軟件是Java Media系列軟件的一部分。采用各種Java Media API,
軟件開發(fā)商人員就能容易、快速地為他們已有的各種應(yīng)用程序和客戶端,
Java小程序增添豐富的媒體功能,如流式視頻、3D圖像和影像處理等。就
是 說,各種Java Media API發(fā)揮了Java平臺的固有優(yōu)勢,將"編寫一次,
到處運行"的能力擴展到了圖像、影像和數(shù)字媒體等各種應(yīng)用領(lǐng)域,從而大
大縮減了開發(fā)時間和降低了開發(fā) 成本。
在開發(fā)JMF 應(yīng)用程序之前要完全理解JMF 的體系架構(gòu)、接口和類。就
拿我們的家用攝像機系統(tǒng)作個例子。首先用攝像機拍攝內(nèi)容,拍攝下來的
內(nèi)容錄制在DV帶中。DV帶可以放在放像機里播放、放像機提供視頻信號給
電視機,提供音頻信號給音箱,這樣我們就可以在電視機上看到畫面,從
音箱里聽到聲音。JMF API 提供的也是同樣的模型。 ?
??JMF 提供的模型可大致分為七類 ?
??* 數(shù)據(jù)源(Data source) ?
??* 截取設(shè)備(Capture Device,包括視頻和音頻截取設(shè)備) ?
??* 播放器(Player) ?
??* 處理器(Processor) ?
??* 數(shù)據(jù)池(DataSink) ?
??* 數(shù)據(jù)格式(Format) ?
??* 管理器(Manager) ??
如果只是想觀看捕獲的內(nèi)容,只需要使用捕獲數(shù)據(jù)源創(chuàng)建播放器
Player即可。如果想把捕獲的數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)或者保存起來,就需要創(chuàng)建
處理器Processor。
基本步驟是首先獲取視頻、音頻捕獲設(shè)備的信息,然后再根據(jù)取得的
設(shè)備信息確定設(shè)備的位置。找到設(shè)備的位置以后,調(diào)用ManageCreatePlayer
方法創(chuàng)建Player,當(dāng)Player開始播放的時候,就開始了捕獲的過程。
????有多種方法獲得捕獲設(shè)備信息,可以通過查詢指定的格式,也可以查
詢特定的設(shè)備名字。Player準(zhǔn)備好播放數(shù)據(jù),當(dāng)Player發(fā)出這個事件時,
就可以獲取播放器的可視面板和控制面板了。具體步驟如下:
??1. 先把所有的捕獲設(shè)備調(diào)出來 ??
??2. 創(chuàng)建Player,當(dāng)Play開始的時候,就開始了音頻捕獲的過程 ?
??3.以MediaLocator為參數(shù),創(chuàng)建Player ?
4. 為PLAYER添加監(jiān)聽器,以便監(jiān)聽RealizeComplete事件
(二)代碼實現(xiàn)?
?????(1)添加庫、包等相關(guān)文件?
import javax.media.ControllerEvent; ?
import javax.media.ControllerListener; ?
import javax.media.EndOfMediaEvent; ?
import javax.media.PrefetchCompleteEvent; ?
import javax.media.RealizeCompleteEvent; ?
import javax.media.*; ?
import javax.swing.*; ?
import java.awt.*; ?
import java.awt.event.*; ?
?
(2)初始化窗口?
?
?
1代碼實現(xiàn)?
private void init() {
??// TODO Auto-generated method stub
??this.setLayout(new BorderLayout());
??JPanel ?lrcPanel = new JPanel();
???
??JPanel ?controP= ?new JPanel();
???
?????jta = new JTextArea(22,35);
?????jta.setBackground(Color.black);
??????
??jta.setLineWrap(true);
??jta.setWrapStyleWord(true);
??jta.setEditable(false);
???
??lrcPanel.add(new JScrollPane(jta));
??lrcPanel.setBackground(Color.black);
??lrcPanel.setVisible(true);
???
???
???
??JButton Jstart= new JButton("");
??Jstart.setIcon(new ImageIcon("start.png"));
???
??Jstart.addActionListener(new ActionListener() {
????
???@Override
???public void actionPerformed(ActionEvent arg0) {
????// TODO Auto-generated method stub
????start();
???}
??});
??JButton Jpause=new JButton();
??Jpause.setIcon(new ImageIcon("停止.png"));
??Jpause.addActionListener(new ActionListener(){
???public void actionPerformed(ActionEvent e){
????stop();
?????
???}
??});
??JButton Jnext =new JButton();
??Jnext.setIcon(new ImageIcon("next.png"));
??Jnext.addActionListener(new ActionListener(){
???
???@Override
???public void actionPerformed(ActionEvent e) {
????// TODO Auto-generated method stub
????next();
???}
??});
??JButton Jprior =new JButton();
??Jprior.setIcon(new ImageIcon("back.png"));
??Jprior.addActionListener(new ActionListener(){
???public void actionPerformed(ActionEvent e){
????back();
???}
??});
??controP.setLayout(new FlowLayout());
??controP.add(Jprior);
??controP.add(Jstart);
??controP.add(Jpause);
??controP.add(Jnext);
???
??this.add(lrcPanel,BorderLayout.CENTER);
??this.add(controP,BorderLayout.SOUTH);
?}
?
(3)音樂播放窗口機基本功能的實現(xiàn)?
①界面?
?
?
②代碼實現(xiàn)?
// 播放方法?
public void start() { ????player =
??if(isplaying==false){ Manager.createPlayer(new File(mp3List.get
???try { ??
????? ??
?(mp3NO)).toURI().toURL()); BufferedReader(
????jta.setText(null); ??????new
???} catch (NoPlayerException e) FileReader(lcf));
{ ????String s;
????// TODO 自動生成?catch ???
塊??while((s=bReader.readLine()) != null){
????e.printStackTrace(); ??????
????System.out.println("不能?????jta.append(" ?"+s);
播放此文件!"); ?????jta.append("\n");
????return; ??????
???} catch (IOException e) { ????}
????// TODO 自動生成?catch ?????
塊??????
????e.printStackTrace(); ???} catch (Exception e) {
????return; ????// TODO Auto-generated
???} catch block
???if (player == null) { ????jta.setText("沒有歌詞");
????System.out.println("播放????System.out.println("沒有
文件為空!"); 歌詞文件!");
????return; ?????
???} ???}
??????
?player.addControllerListener(this); ???
??// 提取媒體內(nèi)容??}
??player.prefetch(); ?
??isplaying=true;//正在播放一首歌??private String getlrcFName() {//解析歌
??setLrc(); 曲名;?
??} ?// TODO Auto-generated method stub
?} ??String musicPath =
??mp3List.get(mp3NO);
?private void setLrc() { ??String s =musicPath.substring(11);
??// TODO Auto-generated method ??System.out.println(s);
stub ??String []str = s.split("\\.");
??File lrcfile = new File(lrcpath); ??String lrcFName=str[0] ;
??if(!lrcfile.exists()){ ??System.out.println(lrcFName);
???lrcfile.mkdir(); ??return lrcFName;
??} ?}
??String lrcFName = getlrcFName(); ?
??BufferedReader bReader; ?public void stop(){
??File lcf= new ??player.stop();
File(lrcpath+lrcFName+".lrc"); ??isplaying=false;
??System.out.println(lcf.getName()); ?}
???try { ??
????bReader = new ?public void next(){
?if(isplaying==true) ??// 當(dāng)提取媒體的內(nèi)容結(jié)束?
??stop(); ??if (e instanceof
??PrefetchCompleteEvent) {
??if(mp3NO<mp3List.size()-1){ ???System.out.println("內(nèi)容結(jié)束
??mp3NO++; ");
??start(); ???player.start();
??} ???return;
??else{ ??}
???jta.setText("沒有下一首了??
(<_>"); ??// 當(dāng)實例化后?
??} ??if (e instanceof
?} RealizeCompleteEvent) {
?public void back(){ ???System.out.println("實例化");
??if(isplaying) ???// pack(); //執(zhí)行pack()操作?
??stop(); ???return;
?????}
??if(mp3NO>0){ ?
??mp3NO--; ?}
??start(); ??public void setMp3List(){
??} ???File file = new File(musicpath);
??else ???if( !file.exists()){
???jta.setText("已經(jīng)是第一首歌????file.mkdir();
了(<_>)"); ???}
?} ???File[] mcFiles ;
?????mcFiles = file.listFiles();
?public void ???if(mcFiles!=null){
controllerUpdate(ControllerEvent e) { ????for(File f : mcFiles){
??// 當(dāng)媒體播放結(jié)束時,循環(huán)播放???????
??if (e instanceof EndOfMediaEvent) ????
{ ?System.out.println(f.getPath());
???isplaying=false; ????
???mp3NO++; ?mp3List.add(f.getPath());
???System.out.println(mp3NO); ????}
???if (mp3NO < mp3List.size()) { ???}else ?
????
????this.start(); ?System.out.println("MyMusic中沒有歌
???} 曲文件");
???return; ????
??} ??}
?
?
6.總結(jié)與說明?
在做寫程序?qū)崿F(xiàn)功能的過程中,界面和基本功能的設(shè)計需要較強的邏
輯思維,一不小心就容易出錯,在具體的功能設(shè)計和實現(xiàn)的過程中要盡可能
用最簡單的語句實現(xiàn)基本的播放器功能。我覺得可以設(shè)計更多的菜單及菜單
項目從而實現(xiàn)更多的功能,如:刪除,保存等,還可以實現(xiàn)更多的背景效果
或者更多可選擇的皮膚,還可以對按鈕添加音效效果,這樣感覺整個音樂播
放器更具有靈活性,媒體感更強烈一些,界面會更加豐富和生動一些。?????????????
通過自己做課程設(shè)計,自己設(shè)計界面,功能和設(shè)計功能的代碼實現(xiàn),
將理論知識運用到實際操作中,加深了對理論知識的理解和記憶,在做程序
設(shè)計的過程中,對很多代碼的多次操作和重復(fù)使用,使得對很多基本的代碼
和相關(guān)的操作能夠牢固的記憶。?
總結(jié)
以上是生活随笔為你收集整理的Java课程设计报告—音乐播放器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对笔记本电池的研究
- 下一篇: java美元兑换,(Java实现) 美元