每当运行此子程序时,我需要制作一个播放声音片段的音频播放器。它还必须在播放新的声音片段之前停止它。
我遇到的问题是剪辑从未注册为正在运行。检查它是否正在运行的两个if语句都没有使用过。这意味着剪辑仅在完成时停止,并且它们可以重叠,并破坏程序。
我会使用clip.stop();在其他子程序中,但它会告诉我无法找到“剪辑”符号。我不知道如何使其可供其他子程序使用。
我可以获得clip.stop()的唯一方法;在这个子程序中工作是在clip.start()之后直接放置它。线,在开始后立即停止剪辑,因此根本没有听到。
下面是我用来播放音频片段的子程序。
public void play(String filename){
try {
Clip clip = AudioSystem.getClip();
audFile = audDir + filename;
if (clip.isRunning()){
System.out.println("Sounds playing 1");
clip.stop();
}
clip.open(AudioSystem.getAudioInputStream(new File(audFile)));
clip.start();
if (clip.isRunning()){
System.out.println("Sounds playing 2");
clip.stop();
}
} catch (Exception exc) {
exc.printStackTrace(System.out);
}
}
答案 0 :(得分:1)
我会使用clip.stop();在其他子程序中,但它会告诉我 无法找到“剪辑”符号。我不知道怎么做 可供其他子程序使用。
在您的班级中声明私人剪辑字段
private Clip clip;
并在从AudioSystem.getClip()
获取时设置它。
/*
* clip (local variable) is invisible from other methods
*/
Clip clip = AudioSystem.getClip();
this.clip = clip; // `this.clip` is a field, it's visible from other methods
然后你可以从其他方法访问它(“子例程”是Java中的类方法)。
我遇到的问题是剪辑从未注册为正在运行。
当您拨打clip.isRunning()
时它没有运行,但您确定从不正在运行吗?
您不能认为clip.isRunning()
在true
之后立即返回clip.start()
。该机制是异步的,它可能有助于注册LineListener
并收听START
事件。
clip.start();
LineListener listener = new LineListener() {
public void update(LineEvent event) {
if (event.getType() == LineEvent.Type.START) {
/*
* here you are sure the clip is started
*/
}
}
};
clip.addLineListener(listener );