我想创建一个简单的PlayClipManager类来管理音频剪辑的播放。它将有以下两种方法:
public void addAndPlay(Clip clip)
{
...
}
public void interruptAndPlay(Clip clip)
{
...
}
第一种方法应该将一个片段添加到队列中,并在队列中的其他片段完成后立即播放。第二种方法接受一个中断当前播放的剪辑,刷新队列并将其自身添加到它(它立即播放,因为它是队列中唯一的剪辑)。
如果有人可以访问Java Thread管理音频播放,这将很容易,但除非我弄错了,我认为没有错误(有一个AudioSystem类,但它没有帮助)。我看到这里有帖子显示如何使用LineListener来检查剪辑何时播放完毕,但我不确定如何在我的示例中具体使用它。另外,使用中断剪辑的方法,我想也可能存在一些并发问题。
任何帮助我如何解决这个问题非常感激。
感谢。
答案 0 :(得分:0)
如果我没弄错的话,Clip会将播放行与音频数据捆绑在一起。
你打算排队实际的剪辑吗?他们多大?这可能占用大量内存。如果您正在存储声音文件的地址,并在播放时制作/加载 new 剪辑,那么最好使用SourceDataLine,因为它会更快地启动。 Clip必须先将整个文件加载到内存中才能开始播放。
以上是添加线条侦听器的tutorial。我认为它只是myClip.addLineListener(YourLineListener)。您可以对LineListener进行编码,以警告管理队列的任何内容以启动下一个Clip,并对所有剪辑使用相同的LineListener。
或者类似这样的东西会有所帮助,当你准备好播放队列时在新线程上调用它,并让LineListener成为播放Clip的runnable的一部分。
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();
}
}
}
我不确定何时应该打开Clip。我也不确定如何放入一个用于中断Clip的钩子。也许如果QueueManager执行一个有效的currentClip.close()?在这种情况下使currentClip变得不稳定可能会有所帮助。但是我离开了我的深度。
我希望这些想法值得探索并引导您找到解决方案。