【Java】打开窗体后自动播放背景音乐代码实现

   日期:2020-08-21     浏览:187    评论:0    
核心提示:简易音乐播放器窗体类音乐类实现效果新建一个窗体后程序自动播放音乐,可以选择自己喜欢的歌曲播放,可用于平时的窗体练习或者游戏界面的背景音乐,拿走不谢。首先,该播放器需要两个类,一个用来构建窗体,一个用来设置音乐。话不多说,直接上代码窗体类package 音乐播放窗体;import java.awt.Color;import java.awt.Container;import java.awt.Frame;import java.util.concurrent.TimeUnit;impor

简易音乐播放器

      • 窗体类
      • 音乐类
      • 实现效果

新建一个窗体后程序自动播放音乐,可以选择自己喜欢的歌曲播放,可用于平时的窗体练习或者游戏界面的背景音乐,拿走不谢。

首先,该播放器需要两个类,一个用来构建窗体,一个用来设置音乐。
话不多说,直接上代码

窗体类

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();
	}  
 }

实现效果

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服