简易音乐播放器
- 窗体类
- 音乐类
- 实现效果
新建一个窗体后程序自动播放音乐,可以选择自己喜欢的歌曲播放,可用于平时的窗体练习或者游戏界面的背景音乐,拿走不谢。
首先,该播放器需要两个类,一个用来构建窗体,一个用来设置音乐。
话不多说,直接上代码
窗体类
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 音乐播放窗体;
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();
}
}