前言

之前的版本,有位朋友说无法实现暂停播放,还有一些其他无伤大雅的bug,所以我就查了一波资料,研究了一下后,进行的一波优化。
这个版本的播放器,实现了:上一首、下一首、暂停/播放、目录浏览等功能。

注意

需要注意的是几个jar包的变化,旧的jar包会导致一些异常,例如:Resetting to invalid mark等,所以做了有一些改变,当然jl1.0.1不要应该也行:

代码

手写是MyPlayer类里面的变化,为了方便我直接写成了MyPlayer2;
其中不再使用jl中player的play方法,而是改用JavaSound中的方法类实现。
代码结构:

MyPlayer2实现

package com.lyrics.musicplayer.service;import java.io.File;
import java.io.IOException;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;public class MyPlayer2 extends Thread{Object lock = new Object();AudioInputStream stream;SourceDataLine sourceDataLine;public static boolean paused = false;private String music;public MyPlayer2(String music) {this.music = music;}public void setPaused(boolean paused) {MyPlayer2.paused = paused;}public void run() {try {play(music);} catch (IOException | UnsupportedAudioFileException | LineUnavailableException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void play(String music) throws IOException, UnsupportedAudioFileException, LineUnavailableException {stream = AudioSystem.getAudioInputStream(new File(music));AudioFormat format = stream.getFormat();if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), 16, format.getChannels(),format.getChannels() * 2, format.getSampleRate(), false);stream = AudioSystem.getAudioInputStream(format, stream);}DataLine.Info info = new DataLine.Info(SourceDataLine.class, stream.getFormat());sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);sourceDataLine.open(stream.getFormat(), sourceDataLine.getBufferSize());sourceDataLine.start();int numRead = 0;byte[] buf = new byte[sourceDataLine.getBufferSize()];while ((numRead = stream.read(buf, 0, buf.length)) >= 0) {while(paused) {if(sourceDataLine.isRunning()) {sourceDataLine.stop();}else {sourceDataLine.start();}}int offset = 0;while (offset < numRead) {offset += sourceDataLine.write(buf, offset, numRead - offset);}System.out.println(sourceDataLine.getFramePosition() + " " + sourceDataLine.getMicrosecondPosition());}sourceDataLine.drain();sourceDataLine.stop();sourceDataLine.close();stream.close();}public void close() {if(sourceDataLine != null) {sourceDataLine.close();}if(stream != null) {try {stream.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void on() {setPaused(false);}public void pause() {setPaused(true);}
}

Design实现

package com.lyrics.musicplayer.ui;import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.DirectoryDialog;import java.util.Vector;import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Text;import com.lyrics.musicplayer.service.MyPlayer2;
import com.lyrics.musicplayer.util.FileList;import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Label;public class Design {protected Shell shell;private Text textBrowser;String selecteddir=null;String programdir=null;String music;int index = 0;MyPlayer2 myplayer;/*** Open the window.*/public void open() {Display display = Display.getDefault();createContents();shell.open();shell.layout();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}myplayer.close();}/*** Create contents of the window.* @wbp.parser.entryPoint*/protected void createContents() {shell = new Shell();shell.setSize(358, 335);shell.setText("Music Player");Button btnPlayer = new Button(shell, SWT.NONE);btnPlayer.setText("播放");btnPlayer.setBounds(138, 45, 80, 27);List listDisplay = new List(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);listDisplay.setBounds(10, 138, 322, 149);Button btnPrevMusic = new Button(shell, SWT.NONE);btnPrevMusic.setBounds(22, 45, 80, 27);btnPrevMusic.setText("上一首");Button btnNextMusic = new Button(shell, SWT.NONE);btnNextMusic.setText("下一首");btnNextMusic.setBounds(252, 45, 80, 27);textBrowser = new Text(shell, SWT.BORDER);textBrowser.setBounds(10, 93, 229, 23);Button btnBrowser = new Button(shell, SWT.NONE);btnBrowser.setBounds(252, 91, 80, 27);btnBrowser.setText("浏览");Label label = new Label(shell, SWT.NONE);label.setBounds(22, 10, 61, 17);label.setText("正在播放:");Label lblName = new Label(shell, SWT.NONE);lblName.setBounds(86, 10, 246, 17);// 播放暂停键btnPlayer.addMouseListener(new MouseAdapter() {@Overridepublic void mouseDown(MouseEvent e) {if(!MyPlayer2.paused) {btnPlayer.setText("播放");myplayer.pause();return;}if(MyPlayer2.paused){//thread.run();btnPlayer.setText("暂停");myplayer.on();}}});// 双击列表播放listDisplay.addMouseListener(new MouseAdapter() {@Overridepublic void mouseDoubleClick(MouseEvent e) {index = listDisplay.getSelectionIndex();lblName.setText(listDisplay.getItem(index));btnPlayer.setText("暂停");music=selecteddir + "/" +listDisplay.getItem(index);myplayer = new MyPlayer2( music);myplayer.on();myplayer.start();}});// 文件夹选择btnBrowser.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(SelectionEvent e) {//新建文件夹(目录)对话框DirectoryDialog folderdlg=new DirectoryDialog(shell);//设置文件对话框的标题folderdlg.setText("文件选择");//设置初始路径folderdlg.setFilterPath("SystemDrive");//设置对话框提示文本信息folderdlg.setMessage("请选择相应的文件夹");//打开文件对话框,返回选中文件夹目录selecteddir=folderdlg.open();if(selecteddir==null){return ;}else{textBrowser.setText(selecteddir);programdir=System.getProperty("user.dir");try {FileList fileList= new FileList();Vector<String> list=new Vector<String> ();fileList.getAllFileName(selecteddir, list);for(int i=0;i<list.size();i++){listDisplay.add(list.elementAt(i));System.out.println(list.elementAt(i));}} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}});// 上一首btnPrevMusic.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(SelectionEvent e) {index = index-1;listDisplay.setSelection(index);btnPlayer.setText("暂停");lblName.setText(listDisplay.getItem(index));myplayer.close();music= selecteddir + "/" + listDisplay.getItem(index);myplayer = new MyPlayer2( music);myplayer.on();myplayer.start();}});// 下一首btnNextMusic.addSelectionListener(new SelectionAdapter() {@Overridepublic void widgetSelected(SelectionEvent e) {index = index+1;listDisplay.setSelection(index);btnPlayer.setText("暂停");lblName.setText(listDisplay.getItem(index));myplayer.close();music = selecteddir + "/" + listDisplay.getItem(index);myplayer = new MyPlayer2( music);myplayer.on();myplayer.start();}});}
}

FileList实现

package com.lyrics.musicplayer.util;import java.io.File;
import java.util.Vector;public class FileList {public void getAllFileName(String path,Vector<String> list) {File file = new File(path);File[] tempList = file.listFiles();for (int i = 0; i < tempList.length; i++) {if (tempList[i].isFile()) {list.add(tempList[i].getName());}if (tempList[i].isDirectory()) {getAllFileName(tempList[i].getAbsolutePath(),list);}}return;}
}

启动:MusicPlayer实现

package com.lyrics.musicplayer;import com.lyrics.musicplayer.ui.Design;/** * @Author: lyrics* @ClassName: MusicPlayer    * @Date: 2020/05/17* @Copyright: lyrics*/
public class MusicPlayer {public static void main(String[] args) {try {Design window = new Design();window.open();} catch (Exception e) {e.printStackTrace();}}
}

运行结果

写在最后

针对之前有位朋友提到的问题我都一一实现或者解决了,但是这个代码毕竟只是随意之作,肯定有很多不足的地方,如果接下来我不是很忙的话,我会继续更新优化,当然也有可能是有生之年系列。

用java写一个简单的音乐播放器(二)相关推荐

  1. 用Qt写一个简单的音乐播放器(三):增加界面(播放跳转与音量控制)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  2. 用Qt写一个简单的音乐播放器(六):显示歌词(正则表达式)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  3. 用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐

    一.前言 QMediaplayer可以用于解析音频文件和视频文件,继承自QMediaObject,涉及到的对象为QMediaContent.QMediaObject可以提供关于媒体内容的接入,通过UR ...

  4. 用Qt写一个简单的音乐播放器(五):歌曲播放时间显示

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  5. 用Qt写一个简单的音乐播放器(七):界面美化(QSS样式表)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  6. 用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  7. 用C/C++写一个简单的音乐播放器(基于windows控制台编程)

    学习内容:1. 使用单例模式设计,让加载资源唯一化. 2. 控件管理. 3. 按键消息处理 4. 音频函数的使用 1. 资源管理与加载 1.1 公共头文件 将用到的头文件保存到一个公共头文件" ...

  8. 使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))

    当你学习了python之后,总想着利用它去做些什么,无论是制作小工具还是小游戏,都是一种锻炼. 那么,利用python加上PyQt5写一个简单的音乐播放器,可能会是一个有趣的体验. 下面我会分享一下如 ...

  9. HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌)

    用HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌) 效果如下:(鼠标点击按钮可以实现播放或暂停,按钮会旋转,实现了歌词同步,功能还需改进) 代码如下: <!DOCTYPE htm ...

最新文章

  1. Android中线程同步之Mutex与Condtion的用法
  2. Helloj2ee WPF书评系列——缘起
  3. 静态局部变量和全局变量的区别!
  4. 免安装版 mysql-5.6.29-winx64 下载,配置
  5. 好品山东谋定产业扶贫-农业大健康·万祥军:乡村振兴行动
  6. 手机壳鸿蒙,手机壳黑榜发布 真相太惊人!
  7. CRT 入口函数 CRTStartup
  8. Adobe After Effects CS6 操作记录
  9. c++用new求数组中n个数的和_在C++中实现任意大小数组的定义方法
  10. mysql5.6.36源码安装_CentOS 7下rpm安装MySQL 5.6.36
  11. Java边缘填充_任意画一个多边形,用边缘填充算法填充
  12. opencv-api drawKeyPoints
  13. 【Java】导入项目时,出现The project cannot be built until build path errors are resolved错误解决方法
  14. 运行matlab生成多张图片后如何瞬间将图片全部关闭
  15. jquery on() 转
  16. php旧物交易开源代码_PHP学习笔记:php二手交易市场系统
  17. c语言做线性代数第六版答案,线性代数求解(C语言):
  18. 100个Python实战项目(十一)如何使用 Python 获取电话号码信息?
  19. 每月的第一个工作日执行的corn表达式
  20. tga缩略图预览_甜蜜的缩略图预览库

热门文章

  1. Q+无法启动?启动后立即退出?折腾……
  2. Jensen不等式、数值积分的变分界、KL散度
  3. vue 平滑回到顶部
  4. 新浪微博Android客户端开发
  5. ubuntu/linux系统知识(25)ubuntu录屏软件含声音obs天下第一
  6. C 标准库 (stdio.h 介绍)
  7. MAC报文格式的简单整理
  8. 全网首发2023全新ChatGPT3.5小程序开源源码 全新UI
  9. 入行pcb设计,到底该学哪款工具软件
  10. Android 反射