java代码按顺序播放音频_如何在Java应用程序中播放音频

博主在开发Java应用时遇到音频播放的困扰。第一种方法使用AudioSystem播放音频,但导致程序阻塞直到声音文件播放完毕。第二种方法通过JApplet的AudioClip播放,但声音时常提前结束或不播放。寻求解决方案。
摘要由CSDN通过智能技术生成

我正在制作一个Java应用程序,我需要播放音频。尽管我计划循环播放背景音乐,但我主要播放的是我的大炮射击(它是大炮射击游戏)和弹丸爆炸的小声音文件。我找到了两种不同的方法来实现此目的,但是两种方法都不符合我的要求。

第一种方法实际上是一种方法:

public void playSoundFile(File file) {//http://java.ittoolbox.com/groups/technical-functional/java-l/sound-in-an-application-90681

try {

//get an AudioInputStream

AudioInputStream ais = AudioSystem.getAudioInputStream(file);

//get the AudioFormat for the AudioInputStream

AudioFormat audioformat = ais.getFormat();

System.out.println("Format: " + audioformat.toString());

System.out.println("Encoding: " + audioformat.getEncoding());

System.out.println("SampleRate:" + audioformat.getSampleRate());

System.out.println("SampleSizeInBits: " + audioformat.getSampleSizeInBits());

System.out.println("Channels: " + audioformat.getChannels());

System.out.println("FrameSize: " + audioformat.getFrameSize());

System.out.println("FrameRate: " + audioformat.getFrameRate());

System.out.println("BigEndian: " + audioformat.isBigEndian());

//ULAW format to PCM format conversion

if ((audioformat.getEncoding() == AudioFormat.Encoding.ULAW)

|| (audioformat.getEncoding() == AudioFormat.Encoding.ALAW)) {

AudioFormat newformat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,

audioformat.getSampleRate(),

audioformat.getSampleSizeInBits() * 2,

audioformat.getChannels(),

audioformat.getFrameSize() * 2,

audioformat.getFrameRate(), true);

ais = AudioSystem.getAudioInputStream(newformat, ais);

audioformat = newformat;

}

//checking for a supported output line

DataLine.Info datalineinfo = new DataLine.Info(SourceDataLine.class, audioformat);

if (!AudioSystem.isLineSupported(datalineinfo)) {

//System.out.println("Line matching " + datalineinfo + " is not supported.");

} else {

//System.out.println("Line matching " + datalineinfo + " is supported.");

//opening the sound output line

SourceDataLine sourcedataline = (SourceDataLine) AudioSystem.getLine(datalineinfo);

sourcedataline.open(audioformat);

sourcedataline.start();

//Copy data from the input stream to the output data line

int framesizeinbytes = audioformat.getFrameSize();

int bufferlengthinframes = sourcedataline.getBufferSize() / 8;

int bufferlengthinbytes = bufferlengthinframes * framesizeinbytes;

byte[] sounddata = new byte[bufferlengthinbytes];

int numberofbytesread = 0;

while ((numberofbytesread = ais.read(sounddata)) != -1) {

int numberofbytesremaining = numberofbytesread;

sourcedataline.write(sounddata, 0, numberofbytesread);

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

问题是我的整个程序停止运行,直到声音文件完成或至少接近完成。

第二种方法是这样的:

File file = new File("Launch1.wav");

AudioClip clip;

try {

clip = JApplet.newAudioClip(file.toURL());

clip.play();

} catch (Exception e) {

e.getMessage();

}

我这里的问题是,每次声音文件提早结束或根本不播放时,这取决于我将代码放置在什么地方。

没有上述问题,他们是否可以播放声音?难道我做错了什么?任何帮助是极大的赞赏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值