Java课程设计报告—音乐播放器
目錄
Java課程設計報告
1.設計內容及要求?
2.需求分析?
3.總體設計
4.主要功能設計流程
5.系統實現及測試
6.總結與說明?
Java課程設計報告
題目:java音樂播放器
姓????名??????
學????號???????
院 ???系 ?????
班 ???級 ???????
專 ???業 ?????
任課教師 ????
1.設計內容及要求?
??能夠實現簡單的音樂播放器功能,如:打開本地文件,播放,暫停,停止,背景播放,單曲循環等等,界面充實,交互友好,可以添加多首歌曲目錄?
一個簡單的基于java語言的音樂播放器,菜單欄:文件,播放 控制和播放列表,文件菜單包含打開、循環和退出三個菜單項;播放控制菜單包含播放、暫停和停止三個菜單項,播放列表菜單則是當向里面添加歌曲之后才能夠查看到里面所包含的歌曲目錄。當播放歌曲時,可以調節音量大小或者設置是否靜音;可以查看當前播放音樂的相關屬性,如:歌曲名,歌手,發布時間,所屬專輯等等。
2.需求分析?
1.時間跟蹤條:根據歌曲播放的進度,控制條自動進行追蹤,用戶可以隨時了解歌曲的播放進度?
2、音量控制鍵:可以點擊該控鍵進行音量大小的調節以及是否靜音的設置?
3、屬性查詢鍵:通過該控鍵,用戶可以查看當前播放音樂的相屬性,獲取關于該歌曲的用戶所需的相關信息。
4、菜單欄:
①文件:
打開:用戶通過該菜單項打開本地音樂文件,聽任何用戶想聽的歌曲循環:通過循環設置,用戶可以重復的播放一首喜歡的歌曲退出:退出音樂播放器,及退出該程序
②播放控制:
播放:選擇歌曲之后,通過點擊播放菜單項啟動播放器播放音樂暫停:暫停當前正在播放的音樂停止:停止當前正在播放的音樂
③播放列表:當用戶通過文件打開本地音樂文件后,及相當于在播放列表里面添加了歌曲,及形成相應的歌曲播放目錄
3.總體設計
????結合需求分析來看,整個設計包含了簡單的菜單欄,根據用戶需求設置了三個簡單的實現基本操作的菜單,分別是:文件,播放控制,播放列表;根據具體的操作每個菜單還包含了相應的菜單項,文件:打開,循環,退出;播放控制:播放,暫停,停止;播放列表則沒有菜單項,該菜單就是用來顯示或者查看相應的歌曲目錄的。? 該音樂播放器設置了兩個窗口,運行程序時打開的初始化歡迎界面,用戶可以根據自己的需求進行菜單欄里面的基本操作和相應的設置,當用戶添加或者打開音樂播放文件的時候,程序將會顯示出第二個音樂文件播放窗口,與此同時,第一個初始化窗口將會自動隱藏,在音樂播放窗口里面用戶可以進行相關的音樂播放的控制操作。當用戶進入音樂播放窗口時,該窗口有幾個快捷控制的控鍵:時間追蹤軸:可以實現播放的前進、后退功能,根據用戶需求調節音樂的播放進度等;音量控制:設置靜音,打開揚聲器或者調節音量大小;播放列表:查看當前播放音樂的相關屬性。
4.主要功能設計流程
5.系統實現及測試
(一)JMF(java媒體框架)簡介?
????JMF 即Java媒體框架。其核心框架支持不同媒體,如音頻輸出和視頻輸
出,包括時間的時鐘同步。它是一個標準的擴展框架,允許用戶制作純音頻流和視頻流。
????JMF實際上是Java的一個類包。它包括了一個開放的媒體架構,可使開發人員靈活采用各種媒體回放、捕獲組件,或采用他們自己的定制的內
插組件。 ?
??JMF軟件是Java Media系列軟件的一部分。采用各種Java Media API,
軟件開發商人員就能容易、快速地為他們已有的各種應用程序和客戶端,
Java小程序增添豐富的媒體功能,如流式視頻、3D圖像和影像處理等。就
是 說,各種Java Media API發揮了Java平臺的固有優勢,將"編寫一次,
到處運行"的能力擴展到了圖像、影像和數字媒體等各種應用領域,從而大
大縮減了開發時間和降低了開發 成本。
在開發JMF 應用程序之前要完全理解JMF 的體系架構、接口和類。就
拿我們的家用攝像機系統作個例子。首先用攝像機拍攝內容,拍攝下來的
內容錄制在DV帶中。DV帶可以放在放像機里播放、放像機提供視頻信號給
電視機,提供音頻信號給音箱,這樣我們就可以在電視機上看到畫面,從
音箱里聽到聲音。JMF API 提供的也是同樣的模型。 ?
??JMF 提供的模型可大致分為七類 ?
??* 數據源(Data source) ?
??* 截取設備(Capture Device,包括視頻和音頻截取設備) ?
??* 播放器(Player) ?
??* 處理器(Processor) ?
??* 數據池(DataSink) ?
??* 數據格式(Format) ?
??* 管理器(Manager) ??
如果只是想觀看捕獲的內容,只需要使用捕獲數據源創建播放器
Player即可。如果想把捕獲的數據發送到網絡或者保存起來,就需要創建
處理器Processor。
基本步驟是首先獲取視頻、音頻捕獲設備的信息,然后再根據取得的
設備信息確定設備的位置。找到設備的位置以后,調用ManageCreatePlayer
方法創建Player,當Player開始播放的時候,就開始了捕獲的過程。
????有多種方法獲得捕獲設備信息,可以通過查詢指定的格式,也可以查
詢特定的設備名字。Player準備好播放數據,當Player發出這個事件時,
就可以獲取播放器的可視面板和控制面板了。具體步驟如下:
??1. 先把所有的捕獲設備調出來 ??
??2. 創建Player,當Play開始的時候,就開始了音頻捕獲的過程 ?
??3.以MediaLocator為參數,創建Player ?
4. 為PLAYER添加監聽器,以便監聽RealizeComplete事件
(二)代碼實現?
?????(1)添加庫、包等相關文件?
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代碼實現?
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)音樂播放窗口機基本功能的實現?
①界面?
?
?
②代碼實現?
// 播放方法?
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); ???
??// 提取媒體內容??}
??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) ??// 當提取媒體的內容結束?
??stop(); ??if (e instanceof
??PrefetchCompleteEvent) {
??if(mp3NO<mp3List.size()-1){ ???System.out.println("內容結束
??mp3NO++; ");
??start(); ???player.start();
??} ???return;
??else{ ??}
???jta.setText("沒有下一首了??
(<_>"); ??// 當實例化后?
??} ??if (e instanceof
?} RealizeCompleteEvent) {
?public void back(){ ???System.out.println("實例化");
??if(isplaying) ???// pack(); //執行pack()操作?
??stop(); ???return;
?????}
??if(mp3NO>0){ ?
??mp3NO--; ?}
??start(); ??public void setMp3List(){
??} ???File file = new File(musicpath);
??else ???if( !file.exists()){
???jta.setText("已經是第一首歌????file.mkdir();
了(<_>)"); ???}
?} ???File[] mcFiles ;
?????mcFiles = file.listFiles();
?public void ???if(mcFiles!=null){
controllerUpdate(ControllerEvent e) { ????for(File f : mcFiles){
??// 當媒體播放結束時,循環播放???????
??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.總結與說明?
在做寫程序實現功能的過程中,界面和基本功能的設計需要較強的邏
輯思維,一不小心就容易出錯,在具體的功能設計和實現的過程中要盡可能
用最簡單的語句實現基本的播放器功能。我覺得可以設計更多的菜單及菜單
項目從而實現更多的功能,如:刪除,保存等,還可以實現更多的背景效果
或者更多可選擇的皮膚,還可以對按鈕添加音效效果,這樣感覺整個音樂播
放器更具有靈活性,媒體感更強烈一些,界面會更加豐富和生動一些。?????????????
通過自己做課程設計,自己設計界面,功能和設計功能的代碼實現,
將理論知識運用到實際操作中,加深了對理論知識的理解和記憶,在做程序
設計的過程中,對很多代碼的多次操作和重復使用,使得對很多基本的代碼
和相關的操作能夠牢固的記憶。?
總結
以上是生活随笔為你收集整理的Java课程设计报告—音乐播放器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对笔记本电池的研究
- 下一篇: 基于Java+Swing+Socket实