62,620
社区成员
发帖
与我相关
我的任务
分享//播放开战声音
AePlayWave apw=new AePlayWave("d:\\111.wav");
apw.start();
补充:直接在我给你提供的基础上直接调用音频文件就可以了啊!//播放游戏音频的类
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处理文件是以流的形式啊!工作原理:音频文件以流的形式被调入内存,然后再通过调用音频设备进行音频的播放!class AePlayWave extends Thread {
//要播放的音频文件名 只支持.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();
}
}
}