简易音乐播放器
新建一个窗体后程序自动播放音乐,可以选择自己喜欢的歌曲播放,可用于平时的窗体练习或者游戏界面的背景音乐,拿走不谢。
首先,该播放器需要两个类,一个用来构建窗体,一个用来设置音乐。
话不多说,直接上代码
窗体类
package 音乐播放窗体; import java.awt.Color; import java.awt.Container; import java.awt.Frame; import java.util.concurrent.TimeUnit; import javax.swing.JFrame; import 音乐播放窗体.MusicFrame; import 音乐播放窗体.Sound; public class MusicFrame extends JFrame{ public static void main(String[] args) throws InterruptedException { //1.创建音乐窗体 JFrame f = new JFrame("自制音乐播放器"); //2.设置容器 Container con=f.getContentPane(); //3.设置窗口的背景色 con.setBackground(Color.pink) ; //4.设置大小 f.setSize(400, 400); //5.设置位置居中显示 f.setLocationRelativeTo(null); //6.设置可见 f.setVisible(true); //7.设置关闭窗体时关闭窗体 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //8.创建音乐播放器 Sound player = new Sound("E:/kkkkk/博客斐日常练习/src/稻香.wav"); //循环播放 player.start(true); TimeUnit.SECONDS.sleep(4); //继续开始播放音频 player.continues(); /** * 第二,三步可以省略,此处为了美观,设置窗体颜色。 */ } }
音乐类
package 音乐播放窗体; /** * Description: 简易音频播放器(只支持AU,RA,WAV) * 在不使用JMF的情况下快速实现音频播放 */ import javax.sound.sampled.*; import java.io.*; import java.util.concurrent.TimeUnit; public class Sound { private String musicPath; //音频文件 private volatile boolean run = true; //记录音频是否播放 private Thread mainThread; //播放音频的任务线程 private AudioInputStream audioStream; private AudioFormat audioFormat; private SourceDataLine sourceDataLine; public Sound(String musicPath) { this.musicPath = musicPath; prefetch(); } //数据准备 private void prefetch(){ try{ //获取音频输入流 audioStream = AudioSystem.getAudioInputStream(new File(musicPath)); //获取音频的编码对象 audioFormat = audioStream.getFormat(); //包装音频信息 DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat,AudioSystem.NOT_SPECIFIED); //使用包装音频信息后的Info类创建源数据行,充当混频器的源 sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo); sourceDataLine.open(audioFormat); sourceDataLine.start(); }catch(UnsupportedAudioFileException ex){ ex.printStackTrace(); }catch(LineUnavailableException ex){ ex.printStackTrace(); }catch(IOException ex){ ex.printStackTrace(); } } //析构函数:关闭音频读取流和数据行 protected void finalize() throws Throwable{ super.finalize(); sourceDataLine.drain(); sourceDataLine.close(); audioStream.close(); } //播放音频:通过loop参数设置是否循环播放 private void playMusic(boolean loop)throws InterruptedException { try{ if(loop){ while(true){ playMusic(); } }else{ playMusic(); //清空数据行并关闭 sourceDataLine.drain(); sourceDataLine.close(); audioStream.close(); } }catch(IOException ex){ ex.printStackTrace(); } } private void playMusic(){ try{ synchronized(this){ run = true; } //通过数据行读取音频数据流,发送到混音器; //数据流传输过程:AudioInputStream -> SourceDataLine; audioStream = AudioSystem.getAudioInputStream(new File(musicPath)); int count; byte tempBuff[] = new byte[1024]; while((count = audioStream.read(tempBuff,0,tempBuff.length)) != -1){ synchronized(this){ while(!run) wait(); } sourceDataLine.write(tempBuff,0,count); } }catch(UnsupportedAudioFileException ex){ ex.printStackTrace(); }catch(IOException ex){ ex.printStackTrace(); }catch(InterruptedException ex){ ex.printStackTrace(); } } //暂停播放音频 private void stopMusic(){ synchronized(this){ run = false; notifyAll(); } } //继续播放音乐 private void continueMusic(){ synchronized(this){ run = true; notifyAll(); } } //外部调用控制方法:生成音频主线程; public void start(boolean loop){ mainThread = new Thread(new Runnable(){ public void run(){ try { playMusic(loop); } catch (InterruptedException e) { e.printStackTrace(); } } }); mainThread.start(); } //外部调用控制方法:暂停音频线程 public void stop(){ new Thread(new Runnable(){ public void run(){ stopMusic(); } }).start(); } //外部调用控制方法:继续音频线程 public void continues(){ new Thread(new Runnable(){ public void run(){ continueMusic(); } }).start(); } }
实现效果