java制作音乐播放器教程_教你轻松制作java音乐播放器
一、音乐播放器的实现原理
Javase的多媒体功能很弱,所以有一个专门处理多媒体的插件叫JMF,JMF提供的模型可大致分为七类
* 数据源(Data source)
* 截取设备(Capture Device,包括视频和音频截取设备)
* 播放器(Player)
* 处理器(Processor)
* 数据池(DataSink)
* 数据格式(Format)
* 管理器(Manager)
而我所做的这个音乐播放器MyMusicPlayer(这是我创建的类名)正是调用了JMF中的Player类来实现其播放等各种功能.
我们首先要做的就是要安装JMF。JMF的安装,相信对于许多的新手来说是很伤脑筋的,JMF只支持32位的JDK版本,然而像eclipse这样的IDE环境要与JDK对应,也就是IDE环境要支持32位JDK版本。当安装完JMF之后,有时候对于MP3的播放并不成功,还需要装JMF的mp3plugin。
二、界面效果图
三、功能结构图
四、各种实现功能的代码
public class MyMusicPlayer implements ActionListener, ControllerListener,Runnable{
JFrame j=new JFrame("音乐播放器");
JLabel TablePlaer=new JLabel("播放列表");
JButton BAdd=new JButton("添加歌曲");
JButton BDelect=new JButton("删除歌曲");
JButton BDelectTable=new JButton("清空列表");
JButton BMoveNext=new JButton("下一曲");
JButton BMovePrevious=new JButton("上一曲");
JButton BPlayer=new JButton("暂停");
JButton BStop=new JButton("停止");
JButton BSet=new JButton("显示歌词");
JButton BEnd=new JButton("停止");
String[] s={"顺序播放","单曲循环","随机播放"}; //下拉列表选项数组
JComboBox select=new JComboBox(s); //创建下拉选项
JPanel p1=new JPanel(); //播放列表区域
JPanel p=new JPanel();
JPanel p2=new JPanel(); //按钮区域
JPanel p3=new JPanel();
JLabel l=new JLabel();
JPanel p5=new JPanel(); //放置播放列表
JPanel p6=new JPanel(); //放置播放歌曲的名称
static JPanel pp=new JPanel();
static JLabel lb;
public static JTextArea jt=new JTextArea();
static int index; //播放列表的下标
int count;
int flag; //标记是随机播放还是顺序播放
int countSecond; //获取音乐的总时间值
static int newtime = 0;
int ischanging = 0; //当鼠标是对游标进行点击,进度值也会改变
int ispressing = 0; //判断鼠标是否对游标进行点击
File MusicName = null;
static java.util.List MusicNames = null; //运用泛型,创建File对象
File currentDirectory = null;
List list;// 文件列表
FileDialog open; // 定义文件对话框对象
Random rand = new Random();
String filename;
//进度条
JButton timeInformation = new JButton();
JSlider timeSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 100, 0); //(SwingConstants.HORIZONTAL)用于定向进度条为水平方向的常量的集合
//( 0, 100, 0)用指定的最小值、最大值和初始值创建一个水平滑块。
// 播放
Player player = null;
MusicFileChooser fileChooser = new MusicFileChooser();
static JTextPane tp=new JTextPane(); //显示歌词区域
static JTextArea are=new JTextArea(); //显示图片区域
public MyMusicPlayer(){
j.setSize(1200, 700);
j.setLayout(null);
j.getContentPane().setBackground(Color.BLACK);
j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p.setBounds(2, 563, 1180, 95);
p.setLayout(new BorderLayout());
p1.setBounds(2, 3, 298, 30);
p1.setBackground(new Color(255,255,255));
p2.setLayout(new GridLayout(2,3,20,20));
p2.setBackground(Color.LIGHT_GRAY);
p3.setLayout(new GridLayout(2,0,200,10));
p3.setBackground(new Color(255,255,255));
p5.setBounds(2, 35, 298, 526);
p5.setLayout(null);
p5.setBackground(new Color(255,255,255));
p6.setBounds(301, 3,880, 30);
p6.setLayout(null);
p6.setBackground(new Color(255,255,255));
l.setBounds(250, 4, 600, 30); //设置显示播放的歌曲
p6.add(l);
/*实现图片插入
* */
ImageIcon ic=new ImageIcon("image\\2.3.jpg");
ic=new ImageIcon(ic.getImage().getScaledInstance(880, 477, 2)); //获取图片以及设置图片大小
lb=new JLabel(ic);
lb.setOpaque(false);
pp.setOpaque(false); //设置为透明
pp.setBounds(241, 80,990, 500);
are.setBounds(241, 56,990, 520);
are.setOpaque(false);
tp.setBackground(new Color(255,255,255));
tp.setBounds(301, 35,880, 49);
pp.add(are);
pp.add(lb);
// 文件列表
list = new List(10);
list.setBounds(100, 55, 187, 495); //列表区域
list.addActionListener(this);
j.add(list);
j.add(jt);
j.add(tp);
BAdd.setBounds(5,20, 90,30);
BAdd.setBackground(new Color(255,255,255));
BDelect.setBounds(5, 80, 90, 30);
BDelect.setBackground(new Color(255,255,255));
BDelectTable.setBounds(5, 140, 90, 30);
BDelectTable.setBackground(new Color(255,255,255));
TablePlaer.setBounds(30, 100, 200, 50);
TablePlaer.setFont(new Font("宋体",1, 20));
p1.add(TablePlaer);
BMovePrevious.setBackground(new Color(255,255,255));
BPlayer.setBackground(new Color(255,255,255));
BMoveNext.setBackground(new Color(255,255,255));
BStop.setBackground(new Color(255,255,255));
select.setBackground(new Color(255,255,255));
BSet.setBackground(new Color(255,255,255));
p2.add(BMovePrevious);
p2.add(BPlayer);
p2.add(BMoveNext);
p2.add(BStop);
p2.add(select);
p2.add(BSet);
p2.setBackground(new Color(255,255,255));
p.add(p2,BorderLayout.WEST);
p.add(p3,BorderLayout.CENTER);
p5.add(p);
p5.add(BAdd);
p5.add(BDelect);
p5.add(BDelectTable);
BAdd.addActionListener(this);
BDelect.addActionListener(this);
BDelectTable.addActionListener(this);
BMoveNext.addActionListener(this);
BPlayer.addActionListener(this);
BMovePrevious.addActionListener(this);
BStop.addActionListener(this);
select.addActionListener(this);
BSet.addActionListener(this);
timeInformation.setEnabled(false);
/*
* 实现进度条
* */
timeSlider.setMajorTickSpacing(1);//调用此方法设置主刻度标记的间隔。传入的数字表示在每个主刻度标记之间以值衡量的距离。
timeSlider.setPaintTicks(true); //要绘制主刻度,setPaintTicks 必须设置为 true
timeSlider.addChangeListener(new ChangeListener() { //创建一个新的 ChangeListener 添加到滑块。
public void stateChanged(ChangeEvent arg0) {
if (player != null && ispressing == 1) {
newtime = (int)((JSlider)arg0.getSource()).getValue();
timeInformation.setText("当前时间:"+newtime/60+":"+newtime%60+" || "+" 总时间: "+countSecond/60+":"+countSecond%60);
ischanging = 1;
}
}
});
timeSlider.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent arg0) {
ispressing = 1; //当鼠标对游标进行点击时
}
public void mouseReleased(MouseEvent arg0) {
ispressing = 0; //当鼠标不对游标进行点击时
}
});
timeInformation.setText("当前时间:00:00 || 总时间:00:00");
timeInformation.setBackground(new Color(255,255,255));
p3.add(timeInformation,BorderLayout.NORTH);
p3.add(timeSlider,BorderLayout.SOUTH);
j.add(pp);
j.add(p5);
j.add(p);
j.add(p1);
j.add(p6);
j.setVisible(true);
// j.setResizable(false);
}
/*
* 主函数
* */
public static void main(String[] args) throws IOException, InterruptedException { //InterruptedException:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常
MyMusicPlayer play=new MyMusicPlayer();
Thread timeRun = new Thread(play);
timeRun.start();
}
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand(); //通过获取字符串来判断是播放还是暂停,
String box=(String)select.getSelectedItem(); //判断播放的顺序
if(e.getSource()==BAdd)
{
if (player == null) {
if (fileChooser.showOpenDialog(j) == MusicFileChooser.APPROVE_OPTION) {
this.MusicName = fileChooser.getSelectedFile();
File cd = fileChooser.getCurrentDirectory(); //获取当前路径
if (cd != this.currentDirectory|| this.currentDirectory == null) {
FileFilter[] fileFilters = fileChooser.getChoosableFileFilters(); //FileFilter 是一个抽象类,JFileChooser 使用它过滤显示给用户的文件集合
File files[] = cd.listFiles(); //cd.listFiles()表示返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
this.MusicNames = new ArrayList();
for (File file : files) { //每次循环都将数组中的文件对象赋给file这个变量,然后再在循环体中对这个变量进行操作如:
//for(int i=0;i
filename = file.getName().toLowerCase(); //获取所有的音乐名称
for (FileFilter filter : fileFilters) {
if (!file.isDirectory() && filter.accept(file)) {
this.MusicNames.add(file);
list.add(filename);
filename=e.getActionCommand();
}
}
}
}
index = MusicNames.indexOf(MusicName); //定义歌曲的下标
count = MusicNames.size();
PlayFile();
}
} else {
player.start();
}
}
if(cmd.equals("暂停")){
BPlayer.setText("播放");
player.stop();
}
if(cmd.equals("播放")){
BPlayer.setText("暂停");
player.start();
}
if(e.getSource()==BStop){ //停止
if (player != null) {
player.stop();
timeInformation.setText("当前时间:00:00 || 总时间:00:00");
timeSlider.setValue(0);
player.setMediaTime(new Time(0)); //设置时间为零
}
}
if(e.getSource()==BMoveNext){ //下一曲
if (player != null) {
if("顺序播放".equals(box)){
nextMusic();
}
if("随机播放".equals(box)){
int index = (int) rand.nextInt(this.MusicNames.size())+1;
if (this.MusicNames != null && !this.MusicNames.isEmpty()) {
if ( ++index == this.MusicNames.size()) {
index=(int) rand.nextInt(this.MusicNames.size())+1;
}
player.stop(); //若点击上一曲,则将当前的歌曲停止播放,播放上一曲
try {
player=Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
player.prefetch();
player.setMediaTime(new Time(0.0));// 从某个时间段开始播放
player.addControllerListener(this);
l.setText("正在播放:"+this.MusicNames.get(index).toString());
list.select(index);
player.start();
flag=1;
} catch (NoPlayerException | CannotRealizeException | IOException e1) {
e1.printStackTrace();
}
}
}
}
}
if(e.getSource()==BMovePrevious){ //上一曲
if (player != null) {
if("顺序播放".equals(box)){
PreviousMusic();
}
if("随机播放".equals(box)){
int index = (int) rand.nextInt(this.MusicNames.size())+1;
if (this.MusicNames != null && !this.MusicNames.isEmpty()) {
if ( index--==(int) rand.nextInt(this.MusicNames.size())+1) {
index = this.MusicNames.size() - 1;
}
player.stop(); //若点击上一曲,则将当前的歌曲停止播放,播放上一曲
try {
player=Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
player.prefetch();
player.setMediaTime(new Time(0.0));// 从某个时间段开始播放
player.addControllerListener(this);
l.setText("正在播放:"+this.MusicNames.get(index).toString());
list.select(index);
player.start();
flag=1;
} catch (NoPlayerException | CannotRealizeException | IOException e1) {
e1.printStackTrace();
}
}
}
}
}
if(e.getSource()==BDelect){ //删除歌曲
index =list.getSelectedIndex();
list.remove(index);
MusicNames.remove(this.index);
}
if(e.getSource()==BDelectTable){ //清空列表
list.removeAll();
MusicNames.removeAll(MusicNames);
player.stop();
player = null;
}
//双击列表时实现播放
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 双击时处理
if (e.getClickCount() == 2) {
if(player!=null){
player.stop();
}
// 播放选中的文件
index=list.getSelectedIndex();
PlayFile();
}
}
});
}
// 因为实现了"ControllerListener"接口,本方法用于处理媒体播放器传来的事件;
public void controllerUpdate(ControllerEvent e) {
String box=(String)select.getSelectedItem(); //判断播放的顺序
if (e instanceof EndOfMediaEvent) {
player.setMediaTime(new Time(0));
if ("单曲循环".equals(box)) {
player.start();
}
if("顺序播放".equals(box)){
nextMusic();
}
if("随机播放".equals(box)){
if (this.MusicNames != null && !this.MusicNames.isEmpty()) {
int index = (int) rand.nextInt(this.MusicNames.size())+1;
try {
player=Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
player.prefetch();
player.setMediaTime(new Time(0.0));// 从某个时间段开始播放
player.addControllerListener(this);
l.setText("正在播放:"+this.MusicNames.get(index).toString());
list.select(index);
player.start();
flag=1;
} catch (NoPlayerException | CannotRealizeException | IOException e1) {
e1.printStackTrace();
}
}
}
}
}
/**
* 获取MP3歌曲名
*
* @MP3文件路径
* @歌曲名
*/
public String getMusicName(String str) {
int i;
for (i = str.length() - 1; i > 0; i--) {
if (str.charAt(i) == '\\')
break;
}
str = str.substring(i + 1, str.length() - 4);
return str;
}
/**
* 下一首 实现函数
*/
public void nextMusic() {
}
/**
* 上一首实现函数
*/
public void PreviousMusic() {
}
/**
* 播放MP3文件主函数
*/
public void PlayFile() {
try {
player = Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
player.prefetch();
player.setMediaTime(new Time(0.0));// 从某个时间段开始播放
player.addControllerListener(this);
l.setFont(new Font("宋体",0,20));
l.setText("正在播放:"+this.MusicNames.get(index).toString()); //显示正在播放的歌曲
list.select(index);
player.start();
Mythread11 tt=new Mythread11();
tt.start();
} catch (Exception e1) { //当选到一首音乐不能播放时,对其进行处理
dealError();
return;
}
this.setFrame();
}
public void setFrame()
{
countSecond = (int)player.getDuration().getSeconds();
timeSlider.setMaximum(countSecond);
timeSlider.setValue(0);
newtime = 0;
}
private void dealError() {
// TODO Auto-generated method stub
MusicNames.remove(index);
if( --count == index )
index = 0;
if( count == 0)
player = null;
else
PlayFile();
}
/**
* MP3文件筛选内部类
*/
class MusicFileChooser extends JFileChooser {
}
/**
* MP3文件筛选辅助内部类
*
*/
class MyFileFilter extends FileFilter { //FileFilter 是一个抽象类,JFileChooser 使用它过滤显示给用户的文件集合
String[] suffarr;
String decription;
public MyFileFilter() {
super();
}
public MyFileFilter(String[] suffarr, String decription) {
super();
this.suffarr = suffarr;
this.decription = decription;
}
public boolean accept(File f) {
for (String s : suffarr) {
if (f.getName().toUpperCase().endsWith(s)) {
return true;
}
}
return f.isDirectory();
}
public String getDescription() {
return this.decription;
}
}
/**
* 读取显示时间进度条
*/
public void run() {
while(true) {
sleep();
if(player != null) {
if(ispressing == 0) {
if(ischanging == 1) {
newtime = timeSlider.getValue();
player.setMediaTime(new Time(((long)newtime)*1000000000));
ischanging = 0;
} else {
newtime = (int)player.getMediaTime().getSeconds();
timeSlider.setValue(newtime);
timeInformation.setText("当前时间:"+newtime/60+":"+newtime%60+" || "+" 总时间: "+countSecond/60+":"+countSecond%60);
}
}
}
}
}
//实现歌词的线程
class Mythread11 extends Thread {
public void run() {
// TODO Auto-generated method stub
try{
LRC lrc = ReadLRC.readLRC("Traveling Light.lrc");
Lyrics ls = ParseLRC.parseLRC(lrc);
playTest(ls);
}catch(Exception e){
}
}
}
static void playTest(Lyrics ls) throws InterruptedException {
tp.setFont(new Font("宋体",1,20));
tp.setForeground(Color.BLUE);
StyledDocument doc = tp.getStyledDocument();
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); //将歌词区中显示
doc.setParagraphAttributes(0, doc.getLength(), center, false);
tp.setText("艺术家:" + ls.getAr());
tp.setText("专辑:" + ls.getAl());
tp.setText("歌曲:" + ls.getTi());
tp.setText("歌词制作:" + ls.getBy());
for (Lyric l : ls.getLyrics()) {
tp.setText( l.getTxt());
Thread.sleep(l.getTimeSize());
}
}
}
五、总的测试效果
如下
更多关于播放器的内容请点击《java播放器功能》进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java制作音乐播放器教程_教你轻松制作java音乐播放器相关推荐
- 计算机如何制作U盘启动盘,U大侠U盘启动盘制作教程_教你如何制作U盘启动 - U大侠,装机专家...
下载完成之后Windows XP系统下直接双击运行即可,Windows Vista或Windows 7/8系统请右键点击以管理员身份运行 管理员身份运行 U大侠U盘启动盘制作工具 一般情况下,都是直接 ...
- python制作闯关答题软件_教你轻松使用优考试制作互动闯关答题
我们可以使用优考试在线考试系统组织招聘考试.培训考试.员工考核,或者是给学生做每日一练.模拟考试,或者我们可以拿来协助创建在线的知识竞赛比赛.但是,其实优考试推出了一个新的功能,就是创建闯关答题的功能 ...
- 教你轻松拿下百度音乐播放器mp3地址
教你轻松拿下百度音乐播放器mp3地址----ldfu2010 如果你想做一个类似百度或谷歌或QQ音乐那样的flash播放器,你最需要最重要的事情是什么?播放器什么做?我觉得应该不是,而是你的音乐mp3 ...
- ps教程:教你如何制作一种牛仔布料
这里我们教大家学习如何巧妙的利用滤镜制作一款非常经典的牛仔布纹理,做出来的效果无论是色泽还是色彩的更替都非常的棒,做的同时,注意图层样式每一步造成的字体不同变换,接下来让我们先欣赏一下效果图. 打开A ...
- ps教程:教你如何制作一种漂亮的银色金属字体
这里我们教大家学习如何巧妙的利用图层样式制作一种漂亮的银色金属字体,这是一个非常简单的金属字体教程,只用到了一次图层样式,做出来的效果无论是色泽还是色彩的更替都非常的棒,做的同时,注意图层样式每一步 ...
- 实例教程_次世代兽人制作教程
实例教程_次世代兽人制作教程 链接:https://pan.baidu.com/s/1sr6VvFHKyfpg1ZlW0ui8PQ 密码:cj85
- python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析
Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...
- 【Java速成教学】桌球游戏项目_教你用最短的时间开发桌球小游戏_Java初学者项目
Java小游戏项目回归!今天给大家带来的是桌球游戏~ 本课程面向刚入门或者有一定Java基础的人群,帮助学员理解面向对象编程,并将基础知识进行实际应用,最终目标为开发出一个功能强大的桌球游戏.[Jav ...
- 用计算机做图画ppt,ppt怎么做?手机电脑超全PPT制作教程_教你做出完整的PPT
核心提示:小编整理了两块内容,一个是教大家怎么制作电脑版的PPT,一个是教大家怎么制作手机版的PPT,喜欢的朋友们可以看一下噢! 电脑版PPT制作方法步骤 1.打开"PPT"软件, ...
最新文章
- unicode编码过php的magic_quotes_gpc设置为on的mysql注入与文件写入(待测试)
- python web-Python的哪个Web框架学习周期短,学习成本低?
- ML之xgboostGBM:基于xgboostGBM算法对HiggsBoson数据集(Kaggle竞赛)训练(两模型性能PK)实现二分类预测
- 问题排查:vue项目刷新页面加载了500多个请求?
- 使用docker运行微信wechat的安装脚本
- /usr/local/php-5.2.14/sbin/php-fpm start Starting php_fpm –fpm-config
- DP问题之 捞鱼问题
- Android中级之网络数据解析一之Json解析
- delphi文本转换mp3_基于百度AI 的语音合成、转换的 Yii2 sdk.
- gtp怎么安装系统_UEFI+GTP模式下使用GHO文件安装WIN7或WIN8图文教程
- C#中英文逗号之间的相互转化
- RabbitMQ消息队列,看这篇文章就够了
- JS实现图片的懒加载
- 医院时钟系统(网络授时设备)设计方案
- Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊
- 无root权限怎么完全卸载系统自带软件(捆绑软件)
- linux awk 字符串匹配,awk匹配字符串
- 邮件编码介绍及乱码的解决
- 手把手教你部署Docker(手撸官网)
- gulp:提示:Error: watching html/*: watch task has to be a function (optionally generated by using gulp