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

Java声音API在播放音频文件后对其进行锁定

宗政卓
2023-03-14

下面是一个代码示例:

static private class SoundThread extends Thread implements LineListener {
    private boolean playCompleted;
    private int cycles;
    
    public SoundThread(int repeats) {
        cycles = repeats;
    }
    
    @Override
    public void run() {
        Clip clip;
        AudioInputStream inputStream;
        File soundFile = new File("alerting.wav");
        try {
            inputStream = AudioSystem.getAudioInputStream(soundFile);
            try {
                clip = AudioSystem.getClip();
                clip.addLineListener(this);
                clip.open(inputStream);
                while(cycles > 0) {
                    playCompleted = false;
                    clip.setFramePosition(0);
                    clip.start();
                    while(!playCompleted) {
                        Thread.sleep(1000);
                    }
                    Thread.sleep(audioRepeatTime * 1000);
                    cycles--;
                }
                //clip.drain();
                clip.close();
                inputStream.close();
                System.out.println("All closed");
                try {
                    this.finalize();
                } catch (Throwable ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (Exception ex) {
                Main.syslog(Level.WARNING, "E1001 could not play alert sound", ex);
            } finally {
                inputStream.close();
            }
        } catch (UnsupportedAudioFileException ex) {
            Main.syslog(Level.WARNING, "E1001 could not play alert sound", ex);
        } catch (IOException ex) {
            Main.syslog(Level.WARNING, "E1001 could not play alert sound", ex);
        }
    }

    @Override
    public void update(LineEvent event) {
        LineEvent.Type type = event.getType();
        
        System.out.println("Event: " + type);
        if(type == LineEvent.Type.STOP) {
            playCompleted = true;
        } else if (type == LineEvent.Type.CLOSE) {
            System.out.println("listener closed");
        }
    }
}

public static void PlayAlertSound() {
    if(enableAudio) {
        SoundThread st = new SoundThread(audioLoops);
        st.start();
    }
} 

public static void PlayAlertSound(int repeats) {
    if(enableAudio) {
        SoundThread st = new SoundThread(repeats);
        st.start();
    }
} 

在Java线程列表中,我看到“Java Sound Event Dispatcher”正在运行。我想这就是文件被锁住的原因。你知道我该怎么解决这个问题吗?谢谢

共有1个答案

陈朗
2023-03-14

剪辑的API状态如下:

请注意,有些线路一旦关闭,就不能重新打开。试图重新打开这样的行总是会导致LineUnavailableException

我将提出几个额外的建议。

 类似资料:
  • 问一下Xamarin.Forms便携里面Xamarin.Forms的音频怎么播放 正如我所知,有依赖服务,我看到了一些示例,只有iOS和Android,但没有Windows Phone 8.1/Windows 8.1和UWP。

  • 播放视频,当应用程序转到后台时,它应继续播放音频,当我重新打开时,它应恢复有关我们在音频中的位置的视频。 我在一个服务中使用exoplayer,我可以在后台播放音频,但当我对视频执行相同操作时,音频正在播放,但当我回到应用程序时,视频只是一个黑屏,如果我再次重复(转到后台并回到应用程序)该步骤,它将继续播放视频。 据我所知,exoplayer正在缓冲下一帧,播放器视图无法一次渲染所有帧。 我有一个

  • 我在许多论坛和YouTube教程中搜索了一些简单的代码来播放声音文件(.mp3),但我找到的所有内容都不适合我。 我总是收到异常,它找不到文件或其他错误,但它总是以异常结束。 有什么我必须先配置的吗? -编辑- 我再次尝试以下代码来显示我得到的解释: 这是我的代码 添加JFXPanel后,我得到了异常:线程“main”中的异常MEDIA Exception:MEDIA _ UNAVAILABLE

  • 播放(播放音效/播放录音)

  • 问题内容: 我有几个与Sun,音频播放器和声音输入/输出有关的问题 为什么该软件包不属于Java API?此处是一些信息:http : //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6b14/sun/audio/AudioPlayer.java但这仍然是默认JDK构建I的一部分正在使用。 我已经尝试过使用JMF,

  • 我对javascript和discord.js很陌生,有人知道如何让机器人加入一个频道,播放一个文件然后离开吗? 以下是我尝试过的: 现在,它将发送消息加入语音通道,而不管我是否在其中,如果我在其中,它就不会加入语音通道并播放文件。任何帮助都很感激。