基于java的音乐播放器课程设计报告.docx
《基于java的音乐播放器课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于java的音乐播放器课程设计报告.docx(11页珍藏版)》请在冰豆网上搜索。
![基于java的音乐播放器课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/28/880ade1f-70b9-4ace-aa17-7db7b5066acf/880ade1f-70b9-4ace-aa17-7db7b5066acf1.gif)
基于java的音乐播放器课程设计报告
Java课程设计报告
题目:
java音乐播放器
姓名
学号
院系
班级
专业
任课教师
1.设计内容及要求
能够实现简单的音乐播放器功能,如:
打开本地文件,播放,暂停,停止,背景播放,单曲循环等等,界面充实,交互友好,可以添加多首歌曲目录
一个简单的基于java语言的音乐播放器,菜单栏:
文件,播放控制和播放列表,文件菜单包含打开、循环和退出三个菜单项;播放控制菜单包含播放、暂停和停止三个菜单项,播放列表菜单则是当向里面添加歌曲之后才能够查看到里面所包含的歌曲目录。
当播放歌曲时,可以调节音量大小或者设置是否静音;可以查看当前播放音乐的相关属性,如:
歌曲名,歌手,发布时间,所属专辑等等。
2.需求分析
1、时间跟踪条:
根据歌曲播放的进度,控制条自动进行追踪,用户可以随时了解歌曲的播放进度
2、音量控制键:
可以点击该控键进行音量大小的调节以及是否静音的设置
3、属性查询键:
通过该控键,用户可以查看当前播放音乐的相属性,获取关于该歌曲的用户所需的相关信息。
4、菜单栏:
①文件:
打开:
用户通过该菜单项打开本地音乐文件,听任何用户想听的歌曲
循环:
通过循环设置,用户可以重复的播放一首喜欢的歌曲
退出:
退出音乐播放器,及退出该程序
②播放控制:
播放:
选择歌曲之后,通过点击播放菜单项启动播放器播
放音乐
暂停:
暂停当前正在播放的音乐
停止:
停止当前正在播放的音乐
③播放列表:
当用户通过文件打开本地音乐文件后,及相当于在
播放列表里面添加了歌曲,及形成相应的歌曲播放目录
3.总体设计
结合需求分析来看,整个设计包含了简单的菜单栏,根据用户需求设置了三个简单的实现基本操作的菜单,分别是:
文件,播放控制,播放列表;根据具体的操作每个菜单还包含了相应的菜单项,文件:
打开,循环,退出;播放控制:
播放,暂停,停止;播放列表则没有菜单项,该菜单就是用来显示或者查看相应的歌曲目录的。
该音乐播放器设置了两个窗口,运行程序时打开的初始化欢迎界面,用户可以根据自己的需求进行菜单栏里面的基本操作和相应的设置,当用户添加或者打开音乐播放文件的时候,程序将会显示出第二个音乐文件播放窗口,与此同时,第一个初始化窗口将会自动隐藏,在音乐播放窗口里面用户可以进行相关的音乐播放的控制操作。
当用户进入音乐播放窗口时,该窗口有几个快捷控制的控键:
时间追踪轴:
可以实现播放的前进、后退功能,根据用户需求调节音乐的播放进度等;音量控制:
设置静音,打开扬声器或者调节音量大小;播放列表:
查看当前播放音乐的相关属性。
4.主要功能设计流程
5.系统实现及测试:
(一)JMF(java媒体框架)简介
JMF即Java媒体框架。
其核心框架支持不同媒体,如音频输出和视频输出,包括时间的时钟同步。
它是一个标准的扩展框架,允许用户制作纯音频流和视频流。
JMF实际上是Java的一个类包。
它包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。
JMF软件是JavaMedia系列软件的一部分。
采用各种JavaMediaAPI,软件开发商人员就能容易、快速地为他们已有的各种应用程序和客户端,Java小程序增添丰富的媒体功能,如流式视频、3D图像和影像处理等。
就是说,各种JavaMediaAPI发挥了Java平台的固有优势,将"编写一次,到处运行"的能力扩展到了图像、影像和数字媒体等各种应用领域,从而大大缩减了开发时间和降低了开发成本。
在开发JMF应用程序之前要完全理解JMF的体系架构、接口和类。
就拿我们的家用摄像机系统作个例子。
首先用摄像机拍摄内容,拍摄下来的内容录制在DV带中。
DV带可以放在放像机里播放、放像机提供视频信号给电视机,提供音频信号给音箱,这样我们就可以在电视机上看到画面,从音箱里听到声音。
JMFAPI提供的也是同样的模型。
JMF提供的模型可大致分为七类
*数据源(Datasource)
*截取设备(CaptureDevice,包括视频和音频截取设备)
*播放器(Player)
*处理器(Processor)
*数据池(DataSink)
*数据格式(Format)
*管理器(Manager)
如果只是想观看捕获的内容,只需要使用捕获数据源创建播放器Player即可。
如果想把捕获的数据发送到网络或者保存起来,就需要创建处理器Processor。
基本步骤是首先获取视频、音频捕获设备的信息,然后再根据取得的设备信息确定设备的位置。
找到设备的位置以后,调用ManageCreatePlayer方法创建Player,当Player开始播放的时候,就开始了捕获的过程。
有多种方法获得捕获设备信息,可以通过查询指定的格式,也可以查询特定的设备名字。
Player准备好播放数据,当Player发出这个事件时,就可以获取播放器的可视面板和控制面板了。
具体步骤如下:
1.先把所有的捕获设备调出来
2.创建Player,当Play开始的时候,就开始了音频捕获的过程
3.以MediaLocator为参数,创建Player
4.为PLAYER添加监听器,以便监听RealizeComplete事件
(二)代码实现
(1)添加库、包等相关文件
importjavax.media.ControllerEvent;
importjavax.media.ControllerListener;
importjavax.media.EndOfMediaEvent;
importjavax.media.PrefetchCompleteEvent;
importjavax.media.RealizeCompleteEvent;
importjavax.media.*;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
(2)初始化窗口
①界面
②代码实现
publicvoidsetupMenu(){
Menuf=newMenu("文件");
MenuItemmi=newMenuItem("打开");
CheckboxMenuItemcbmi=newCheckboxMenuItem("循环",false);
MenuItemee=newMenuItem("退出");
f.add(mi);
f.add(cbmi);
f.add(ee);
mi.addActionListener(this);
cbmi.addActionListener(this);
ee.addActionListener(this);
f.addSeparator();
f.addSeparator();
f.addSeparator();
Menul=newMenu("播放列表");
Menuc=newMenu("播放控制");
MenuItemmove=newMenuItem("播放");
MenuItempause=newMenuItem("暂停");
MenuItemstop=newMenuItem("停止");
move.addActionListener(this);
pause.addActionListener(this);
stop.addActionListener(this);
c.add(move);
c.add(pause);
c.add(stop);
c.addSeparator();
c.addSeparator();
c.addSeparator();
MenuBarmb=newMenuBar();
mb.add(f);
mb.add(c);
mb.add(l);
setMenuBar(mb);
}
(3)音乐播放窗口机基本功能的实现
①界面
②代码实现
publicvoidactionPerformed(ActionEvente)
{
Stringcufile,selectfile,currentDirectory;
if(e.getActionCommand().equals("退出"))
{
dispose();
return;
}
if(e.getActionCommand().equals("播放"))
{
if(player!
=null)player.start();
return;
}
if(e.getActionCommand().equals("暂停"))
{
if(player!
=null)player.stop();
return;
}
if(e.getActionCommand().equals("停止"))
{
if(player!
=null)
{
player.stop();
player.setMediaTime(newTime(0));
}
return;
}
if(e.getActionCommand().equals("打开"))
{
FileDialogfd=newFileDialog(this,"打开媒体文件",FileDialog.LOAD);
fd.setVisible(true);
if(fd.getFile()==null)return;
selectfile=fd.getFile();
currentDirectory=fd.getDirectory();
cufile=currentDirectory+selectfile;
MenuItemmi=newMenuItem(selectfile);
mi.setActionCommand(cufile);
MenuBarmb=getMenuBar();
Menum=mb.getMenu
(2);
mi.addActionListener(this);
m.add(mi);
}else{
cufile=e.getActionCommand();
selectfile=cufile;
}
if(player!
=null)player.close();
try{
player=Manager.createPlayer(newMediaLocator("file:
"+cufile));
}catch(Exceptione2)
{
System.out.println(e2);
return;
}
if(player==null)
{
System.out.println("无法创建播放器");
return;
}
first=false;
setTitle(selectfile);
player.addControllerListener(this);
player.prefetch();
}
publicvoiditemStateChanged(ItemEventarg0)
{
}
publicstaticvoidmain(String[]args)
{
newMediaPlayer("播放器");
}
publicvoidcontrollerUpdate(ControllerEvente)
{
Containertainer=getContentPane();
if(einstanceofControllerClosedEvent)
{
if(vc!
=null)
{
remove(vc);
vc=null;
}
if(cc!
=null)
{
remove(cc);
cc=null;
}
}
if(einstanceofEndOfMediaEvent)
{
player.setMediaTime(newTime(0));
if(loop)player.start();
return;
}
if(einstanceofPrefetchCompleteEvent)
{
player.start();
return;
}
if(einstanceofRealizeCompleteEvent)
{
vc=player.getVisualComponent();
if(vc!
=null)
tainer.add(vc,BorderLayout.CENTER);
cc=player.getControlPanelComponent();cc.setBackground(Color.blue);
if(cc!
=null)
{
tainer.add(cc,BorderLayout.SOUTH);
if(vc!
=null)
{
pack();
return;
}
Else{
setSize(300,75);
setVisible(true);
return;
}
}
}
}
6.总结与说明
在做写程序实现功能的过程中,界面和基本功能的设计需要较强的逻辑思维,一不小心就容易出错,在具体的功能设计和实现的过程中要尽可能用最简单的语句实现基本的播放器功能。
我觉得可以设计更多的菜单及菜单项目从而实现更多的功能,如:
删除,保存等,还可以实现更多的背景效果或者更多可选择的皮肤,还可以对按钮添加音效效果,这样感觉整个音乐播放器更具有灵活性,媒体感更强烈一些,界面会更加丰富和生动一些。
通过自己做课程设计,自己设计界面,功能和设计功能的代码实现,将理论知识运用到实际操作中,加深了对理论知识的理解和记忆,在做程序设计的过程中,对很多代码的多次操作和重复使用,使得对很多基本的代码和相关的操作能够牢固的记忆。