当前位置: 首页 > 知识库问答 >
问题:

AudioSystem剪辑不会停止播放时,clip.stop();运行

相弘方
2023-03-14

我需要制作一个音频播放器,每当这个子例程运行时,它都会播放一个声音剪辑。在播放新的之前,它还必须停止以前的声音剪辑。

我遇到的问题是,剪辑从来没有注册为运行。检查它是否正在运行的两个if语句都没有使用过。这意味着剪辑只有在完成时才会停止,它们可能会重叠,从而破坏程序。

我会使用剪辑停止();在其他子例程中,但它会告诉我找不到“剪辑”符号。我不知道如何使其可供其他子例程使用。

我唯一能得到剪辑的方法。停止();要在这个子程序中工作,请将它直接放在剪辑之后。启动();线,它在开始后立即停止剪辑,因此根本听不到。

下面是我用来播放音频剪辑的子例程。

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);
    }
}

共有1个答案

邓阳伯
2023-03-14

我会使用剪辑停止();在其他子例程中,但它会告诉我找不到“剪辑”符号。我不知道如何使其可供其他子例程使用。

在类中声明私有剪辑字段

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中的类方法)。

我遇到的问题是剪辑从未注册为正在运行。

当您调用< code>clip.isRunning()时,它并未运行,但您确定它从未运行过吗?

不能假设< code>clip.isRunning()在< code>clip.start()之后立即返回< code>true。由于该机制是异步的,因此注册一个< code>LineListener并侦听< code>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 );
 类似资料:
  • 当我一次又一次点击播放按钮时,它会同时播放多次。我想停止多重播放。这是代码: 媒体播放器和按钮的对象 按钮单击事件监听器以播放音频 按钮单击事件侦听器以停止音频 任何帮助都将不胜感激。谢谢

  • 好吧,标题说明了一切,我尝试使用javax播放wav文件。声音,什么也没有发生。我试过很多不同的文件,但没有任何运气。

  • 由于限制,我需要在第一次启动时下载一个wav文件。 我将该文件托管在服务器上。 我已经检查过了,我在服务器上有完整的文件,我也验证过了,用管道将audioinputstream输入到一个剪辑中,播放它就会播放完整的音频。 现在我的问题是:如何将完整的流写入一个文件,或者我是否必须这样做,这是一种更简单的方法,可以将wav文件下载到特定的位置

  • 我创建的Android应用程序包含2个按钮,点击每个按钮播放mp3文件。问题是,当我播放按钮1时,它播放声音1,当我单击按钮2时,它播放声音2。 我检查其他玩家的每个按钮是否正常工作,然后停止并播放单击的按钮 但是,如果我两次单击同一个按钮,则会将第一个音频保持在后台播放,然后再次播放另一个音频 我试图检查并停止它,但它不起作用! 我想,如果我点击按钮1,它将播放声音,如果再次点击它,它将停止播放

  • ap.stopBackgroundAudio(CALLBACK) 停止播放音乐。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <style>.output{ display:block; max-width: 100%;

  • 我有一个游戏的音效。当游戏框架打开时,第一个声音会滞后。在那个声音播放后,不会再有延迟。这是我的剪辑播放器: 因此,当我将 SoundEffect.WALL.play() 命名为“声音效果”时,它总体上可以很好地播放,但是第一次播放时,会出现巨大的延迟峰值。我能做些什么来解决这个问题,最好还是使用剪辑?