我编辑了一个小游戏,希望给它添上背景音乐,但是我看书上都是写一个可视化界面,然后监听按钮点击去播放音乐的,我希望能够在程序一运行的时候就自动播放音乐,程序关闭的时候音乐停止播放,因此,我想把这段播放音乐的代码(最好具有可移植性)放到我编好的主类中,然后就可以了,(之前遇到了一些问题:我曾经试着同时运行两个程序一个是音乐播放文件另一个是游戏文件,然后把音乐播放文件的窗口设置成不可见的,本来以为这样能够达到想要的效果,但是当我把setVisible()设为false时,音频文件播放了几秒钟后就自动停止了)
希望大家帮帮忙~java
希望大家帮帮忙~java
解决方案 »
- 【求教】用filefilter如何实现全盘查找指定类型文件,不要只是当前目录下...
- 正式表达式问题?
- 急 tomcat 连接池异常 请大伙帮忙看看
- 如何替换字符串后重新生成文件
- 有偿转让Java即时通信工具源程序及设计文档
- Java还有这种语法! 大家来看看
- java.sql.SQLException: ORA-00600 -- 分数不是问题
- 引用第三方包的问题
- 麻烦问一个简单的泛型和实现接口的问题,多谢!:)
- 如何 点击JAVA应用程序菜单里一选项,就打开一个HTML文件!有哪几种方法?
- 求大神解释:java中三目运算的底层实现原理及与if,else相比性能的差异
- 编译通过,运行时出现这样的问题。怎么办?
//要播放的音频文件名 只支持.wav音频
private String filename;
public AePlayWave(String wavfile) {
filename = wavfile;
} public void run() { File soundFile = new File(filename);
//音频输入流
AudioInputStream audioInputStream = null;
try {
/****************
* AudioSystem 类充当取样音频系统资源的入口点
* 此类允许查询和访问安装在系统上的混频器
* getAudioInputStream(File file) throws UnsupportedAudioFileException,IOException
* 从提供的file获得音频输入流
* 该file必须指向有效的音频文件数据
****************/
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (Exception e1) {
e1.printStackTrace();
return;
}
//获得此音频输入流中声音数据的音频格式
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
//根据指定信息构造数据行的信息对象,这些信息包括单个音频格式
//此构造方法通常由应用程序用于描述所需的行
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); try {
/*******************
* getLine(Line.Info info) throws LineUnavailableException
* 获得与指定 Line.Info 对象中的描述匹配的行
* 如果请求 DataLine且info是DataLine.Info的实例(至少指定一种完全限定的音频格式)
* 则上一个数据行将用作返回的 DataLine 的默认格式
*******************/
auline = (SourceDataLine) AudioSystem.getLine(info);
/*******************
* open(AudioFormat format) throws LineUnavailableException
* 打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作
*******************/
auline.open(format);
} catch (Exception e) {
e.printStackTrace();
return;
}
//线程开始 播放音频
auline.start();
int nBytesRead = 0;
//这是缓冲
byte[] abData = new byte[512]; try {
while (nBytesRead != -1) {
/****************
* read(byte[] b,int off,int len) throws IOException
* 从音频流读取指定的最大数量的数据字节,并将其放入给定的字节数组中
*****************/
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0) {
//auline是接口实例 是从哪儿调用的write(byte[],int,int)方法?
auline.write(abData, 0, nBytesRead);
}
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
//drain()是接口DataLine的方法 怎么能直接调用?
auline.drain();
//close()是从哪儿调用的?
auline.close();
} }
}
class AePlayWave extends Thread { private String filename;
public AePlayWave(String wavfile) {
filename = wavfile; } public void run() { File soundFile = new File(filename); AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (Exception e1) {
e1.printStackTrace();
return;
} AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (Exception e) {
e.printStackTrace();
return;
} auline.start();
int nBytesRead = 0;
//这是缓冲
byte[] abData = new byte[512]; try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
} }
}
java处理文件是以流的形式啊!工作原理:音频文件以流的形式被调入内存,然后再通过调用音频设备进行音频的播放!
AePlayWave apw=new AePlayWave("d:\\111.wav");
apw.start();
补充:直接在我给你提供的基础上直接调用音频文件就可以了啊!