/**
* 此方法需要用到第三方jar包 我这用到tritonus_share-0.3.6.jar
**/
private static final int EXTERNAL_BUFFER_SIZE = 128000;
public static void main(String[] args){
play("D:\\Backup\\ALARM8.WAV"); //可以放到while里面循环播放音乐
}
/**
* 播放音频文件 支持音频格式 wav mid aif,此方法不支持mp3 wma au
*@param strFileName 文件路径
*/
public static void play(String strFilename){
if (strFilename.length() <= 0)
{
printUsageAndExit();
}
//把声音文件 放到文件对象里
File soundFile = new File(strFilename);
//读出这个声音文件
AudioInputStream audioInputStream = null;
try
{
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
}
catch (Exception e)
{ //如果读取文件失败,则抛出这个异常
e.printStackTrace();
throw new MonitorException(e.getMessage());
}
//从这个audioInputStream流数据得到java能解读的声音格式
AudioFormat audioFormat = audioInputStream.getFormat();
//通过audioFormat格式得到正常播放的数据line
SourceDataLine line = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class,
audioFormat);
try
{
line = (SourceDataLine) AudioSystem.getLine(info);
//得到了数据line后,line还没准备好接受音频数据, 这里调用open 接收音频数据
line.open(audioFormat);
}
catch (LineUnavailableException e)
{
e.printStackTrace();
System.exit(1);
}
catch (Exception e)
{
e.printStackTrace();
System.exit(1);
}
//line现在已经能接受数据了,但是还不能通过音频设备播出, 这里调用start 激活音频设备
line.start();
//这里把音频流读到缓存中,然后写到line中播放
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
while (nBytesRead != -1)
{
try
{
nBytesRead = audioInputStream.read(abData, 0, abData.length);
}
catch (IOException e)
{
e.printStackTrace();
}
if (nBytesRead >= 0)
{
int nBytesWritten = line.write(abData, 0, nBytesRead);
}
}
//等待所有的数据都播放完
line.drain();
//关闭line
line.close();
}
private static void printUsageAndExit()
{
System.exit(1);
}