我正在编写几行代码,或者每隔0.5秒打印一次" tick" s" tock"并打印出#34;完成!&#34 ; 60秒后。
import javax.sound.sampled.*;
public class Thread0001 {
public static void main(String args[]) {
for(int i=0; i<60; i++) {
try {
Thread.sleep(500);
if(i%2 == 0) {
System.out.print("tick ");
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(Thread0001.class.getClass().getResource
("Users/Marshall/Documents/Sources/Elevator.mp3"));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
} catch(Exception e) {
}
}
else
System.out.print("tock ");
if(i == 59) { // when it reaches 60 seconds
System.out.println("done!");
}
} catch(Exception e) {
}
}
}
}
嗯,一切似乎都很好,但有一件事 - 我还提出了一个代码,每隔一段时间发出一次电梯铃声&#34; tick&#34;。这段代码似乎没有用,所以有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
您需要加载一个库,例如JavaZoom提供的库,以便播放mp3。如果您已经将JavaFX用于图形组件,则可以考虑将其用于播放,因为它的音频现在支持mp3。
之后,出现的下一个最可能的错误是“找不到文件”或“格式无效”。前者很可能是因为获得相对地址正确的棘手问题。后者很可能是由于编码的wav文件以大于44100 fps或16位编码的精度记录。但是,除非您按照建议添加e.printStackTrace();否则您不会知道可能发生的情况。
您编写的代码应该是相当近似的,最差可能在十几个毫秒之内。要改进代码,您可以在循环外预加载Clip,只需重新定位到起始帧并调用play。另一个选择是通过SourceDataLine进行播放,这很快就会启动。就目前而言,每次迭代都要将文件加载到RAM中,然后(仅在完成后)从RAM中播放文件。
帧精度(在1/44100秒内)是可能的,但我所知道的方法需要使用SourceDataLine并在连续播放中计算经过的帧数。可能有点矫枉过正。