当前位置: 首页 > 面试题库 >

我如何等待Java声音剪辑完成播放?

祝灼光
2023-03-14
问题内容

我正在使用以下代码使用java sound API播放声音文件。

    Clip clip = AudioSystem.getClip();
    AudioInputStream inputStream = AudioSystem.getAudioInputStream(stream);
    clip.open(inputStream);
    clip.start();

对Clip.start()方法的方法调用将立即返回,并且系统在后台线程中播放声音文件。我希望我的方法暂停直到播放完成。

有什么好办法吗?

编辑:对于所有对我最终解决方案感兴趣的人,根据Uri的回答,我使用了以下代码:

private final BlockingQueue<URL> queue = new ArrayBlockingQueue<URL>(1);

public void playSoundStream(InputStream stream) {
    Clip clip = AudioSystem.getClip();
    AudioInputStream inputStream = AudioSystem.getAudioInputStream(stream);
    clip.open(inputStream);
    clip.start();
    LineListener listener = new LineListener() {
        public void update(LineEvent event) {
                if (event.getType() != Type.STOP) {
                    return;
                }

                try {
                    queue.take();
                } catch (InterruptedException e) {
                    //ignore this
                }
        }
    };
clip.addLineListener(listener );
}

问题答案:

声音剪辑是类型或线路,因此支持线路监听器。

如果使用addLineListener,则应该在播放开始和停止时获取事件;如果您不在循环中,则剪辑结束时应停止播放。但是,与任何事件一样,在实际结束播放和停止播放之前可能会有延迟。

使该方法等待会有些棘手。您可以忙于等待(不是一个好主意)或使用其他同步机制。我认为有一种模式(不确定),可以等待很长时间才能引发完成事件,但这是一个普遍的问题,您可能需要单独发布到SO。



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

  • 问题内容: 我编写了一个简单的类,可以在一个简单的游戏中播放音频文件。它适用于诸如枪声或爆炸声之类的小声音,但是当我尝试将其用于背景音乐时,出现以下错误:“未能分配剪辑数据:请求的缓冲区太大。” 我假设这意味着文件太大,但是如何解决呢?资源: 问题答案: 使用。这是我玩12-18分钟(或更多1分钟)的MP3的课堂。 它要求在运行时类路径上实际加载MP3格式的声音,但这不是重点。重点是: 会将声音文

  • 问题内容: 我的问题: 如何在a上执行一堆线程对象并等待它们全部完成后再继续? 我是ThreadPoolExecutor的新手。因此,此代码是测试以了解其工作方式。现在我什至都不用对象填充,因为我不理解如何在不调用另一个队列的情况下开始队列。无论如何,现在我只是打电话给我,但我认为我仍然缺少一些东西。任何提示都很棒!谢谢。 RunnableObject类: 问题答案: 你应该循环

  • 问题内容: 我有一个登录框架,我必须从另一个线程等待。成功登录后,框架将自行处置。我想弹出该应用程序的主框架。现在,我正在观看一个布尔值,以确定何时启动主机。正确的做法是什么?观看布尔值只是感觉并不优雅。 问题答案: 如果您有Java 5或更高版本,则可以使用CountDownLatch。例如,假设主框架最初处于控制状态,则让主框架创建一个倒数为1的,然后将此锁存器传递给登录框架。然后让主机等待锁

  • 我正在开发一个具有许多JButton对象的程序,我希望每个对象都对应于自己的文件。另外,我希望声音的工作方式是,它们可以与其他按钮的声音重叠,但它不能与自身重叠(在播放声音时单击按钮将重新启动声音)。 我尝试使用单个Clip对象,但我无法完成上面所述的内容。因此,我不得不为每个按钮声明一个新的Clip对象,但我觉得这对我的问题来说是一个相当低效的解决方案。 我怎样才能以最有效的方式完成我在第一段中

  • 问题内容: 我只希望我的主线程在退出之前等待我所有的(p)线程完成。 线程来回移动的原因很多,我真的不想跟踪所有线程-我只想知道线程什么时候消失了。 wait()对子进程执行此操作,在没有子进程时返回ECHILD,但是wait(似乎不与(p)个线程一起工作)。 我真的不想麻烦保留每个未完成线程的列表(随它们来来去去),然后必须在每个线程上调用pthread_join。 有没有一种快速而又肮脏的方式