第一种方式import java.applet.AudioClip;import java.io.*;import java.applet.Applet;import java.net.URI;import java.net.URL;
public class Music { public void play() { try { //音乐文件 File file_music = new File("music/background.wav"); //解析文件组成部分 URI uri_music = file_music.toURI(); //解析文件地址 URL url = uri_music.toURL(); //使用音频剪辑播放,Applet:存储音频文件 AudioClip ac = Applet.newAudioClip(url); // 循环播放 ac.loop(); //停止播放// ac.stop(); } catch (Exception e) { e.printStackTrace(); } }}
第二种方式
import java.io.File;import java.io.FileNotFoundException;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;
/** * 音乐播放器 * * @author cn.clf.音乐 */public class MusicPlayer implements Runnable { File soundFile; // 音乐文件 Thread thread;// 父线程 boolean circulate;// 是否循环播放
/** * 构造方法,默认不循环播放 * * @param filepath * 音乐文件完整名称 * @throws FileNotFoundException */ public MusicPlayer(String filepath) throws FileNotFoundException { this(filepath, false); }
/** * 构造方法 * * @param filepath * 音乐文件完整名称 * @param circulate * 是否循环播放 * @throws FileNotFoundException */ public MusicPlayer(String filepath, boolean circulate) throws FileNotFoundException { this.circulate = circulate; soundFile = new File(filepath); if (!soundFile.exists()) {// 如果文件不存在 throw new FileNotFoundException(filepath + "未找到"); } }
/** * 播放 */ public void play() { thread = new Thread(this);// 创建线程对象 thread.start();// 开启线程 }
/** * 停止播放 */ public void stop() { thread.stop();// 强制关闭线程 }
/** * 重写线程执行方法 */ public void run() { byte[] auBuffer = new byte[1024 * 128];// 创建128k缓冲区 do { AudioInputStream audioInputStream = null; // 创建音频输入流对象 SourceDataLine auline = null; // 混频器源数据行 try { // 从音乐文件中获取音频输入流 audioInputStream = AudioSystem.getAudioInputStream(soundFile); AudioFormat format = audioInputStream.getFormat(); // 获取音频格式 // 按照源数据行类型和指定音频格式创建数据行对象 DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); // 利用音频系统类获得与指定 Line.Info 对象中的描述匹配的行,并转换为源数据行对象 auline = (SourceDataLine) AudioSystem.getLine(info); auline.open(format);// 按照指定格式打开源数据行 auline.start();// 源数据行开启读写活动 int byteCount = 0;// 记录音频输入流读出的字节数 while (byteCount != -1) {// 如果音频输入流中读取的字节数不为-1 // 从音频数据流中读出128K的数据 byteCount = audioInputStream.read(auBuffer, 0, auBuffer.length); if (byteCount >= 0) {// 如果读出有效数据 auline.write(auBuffer, 0, byteCount);// 将有效数据写入数据行中 } } } catch (IOException e) { e.printStackTrace(); } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (LineUnavailableException e) { e.printStackTrace(); } finally { auline.drain();// 清空数据行 auline.close();// 关闭数据行 } } while (circulate);// 根据循环标志判断是否循环播放 }}
import java.io.FileNotFoundException;
/** * 音效类 * * @author cn.clf.音乐 * */public class Sound { static final String DIR = "music/";// 音乐文件夹 static final String BACKGROUD = "background.wav";// 背景音乐 static final String JUMP = "jump.wav";// 跳跃音效 static final String HIT = "hit.wav";// 撞击音效
/** * 播放跳跃音效 */ public void jump() { play(DIR + JUMP, false);// 播放一次跳跃音效 }
/** * 播放撞击音效 */ public void hit() { play(DIR + HIT, false);// 播放一次撞击音效 }
/** * 播放背景音乐 */ public void backgroud() { play(DIR + BACKGROUD, true);// 循环播放背景音乐 }
/** * 播放 * * @param file * 音乐文件完整名称 * @param circulate * 是否循环播放 */ public void play(String file, boolean circulate) { try { // 创建播放器 MusicPlayer player = new MusicPlayer(file, circulate); player.play();// 播放器开始播放 } catch (FileNotFoundException e) { e.printStackTrace(); } }}