【问题标题】:Playing clips in sequence with possible interruptions from other clips (using javax.sound)按顺序播放剪辑,可能会中断其他剪辑(使用 javax.sound)
【发布时间】:2011-11-11 13:48:24
【问题描述】:

我想创建一个简单的 PlayClipManager 类来管理音频剪辑的播放。它将有以下两种方法:

public void addAndPlay(Clip clip)
 {
  ...
 }

public void interruptAndPlay(Clip clip)
 {
  ...
 }

第一种方法应该将一个剪辑添加到队列中,并在队列中的其他剪辑完成后立即播放它。第二种方法接受一个中断当前播放的剪辑,刷新队列并将其自身添加到其中(它会立即播放,因为它是队列中唯一的剪辑)。

如果可以访问管理音频播放的 Java 线程,这将很容易,但除非我弄错了,否则我认为没有(有一个 AudioSystem 类,但对此没有帮助)。我看到这里有帖子显示如何使用 LineListener 来检查剪辑何时播放完毕,但我不确定如何在我的示例中具体使用它。另外,使用中断剪辑的方法,我想可能还会有一些并发问题。

非常感谢任何有关我如何解决此问题的帮助。

谢谢。

【问题讨论】:

    标签: java audio


    【解决方案1】:

    如果我没记错的话,剪辑会将播放线与音频数据捆绑在一起。

    您打算将实际剪辑排队吗?他们多大?这会占用大量内存。如果您要存储声音文件的地址,并在播放时制作/加载剪辑,则最好使用 SourceDataLine,因为它会更快地启动。 Clip 必须先将整个文件加载到内存中,然后才能开始播放。

    上面是tutorial,用于添加线路监听器。我认为这只是 myClip.addLineListener(YourLineListener)。您可以对 LineListener 进行编码,以提醒正在管理队列的任何人启动下一个剪辑,并为所有剪辑使用相同的 LineListener。

    或者这样的事情可能会有所帮助,当您准备好播放队列时在新线程上调用它,并让 LineListener 成为播放剪辑的可运行对象的一部分。

    class PlayClipRunnable implements Runnable, LineListener {
        private Clip currentClip;
        private QueueManager queueManager;
    
        public PlayPadRunnable (Clip currentClip, 
                QueueManager myQueueManager) {
            this.currentClip = currentClip;
            this.myQueueManager = myQueueManager;
        }
    
        public void run() 
        {
            try 
            {
                currentClip.addLineListener(this);
                currentClip.start();
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
    
        @Override
        public void update(LineEvent event) {
            if (event.getType() == LineEvent.Type.STOP) {
    
                queueManager.clipIsStopped();
            }
        }
    }
    

    我不确定应该何时打开剪辑。我也不确定如何插入中断剪辑的钩子。也许如果 QueueManager 执行 currentClip.close() 会起作用?在这种情况下,让 currentClip 变得易变可能会有所帮助。但我已经超出了我的深度。

    我希望这些想法值得探索并引导您找到解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多