暂停后Java继续循环剪辑

时间:2015-11-08 15:57:51

标签: java audio

在java中创建Clip并打开声音后,您可以使用clip.start()播放声音。您可以使用clip.stop()暂停播放此声音,然后通过调用clip.start()继续播放。

使用clip.loop(i)时有没有做同样的事情?

调用clip.loop(3)后,剪辑应播放四次。但是,如果你在声音上调用clip.stop(),然后通过调用clip.start()恢复它,剪辑将取消暂停,但无论需要多少循环,它都只会完成当前的游戏。因此,如果我理解正确,clip.stop()会在不重置微秒位置的情况下停止播放,并且clip.start()仅从当前微秒位置到剪辑结尾仅继续播放一次。

那么如何在不丢失循环量的情况下在java中恢复循环剪辑呢?如果有办法获得剪辑循环的次数,我可能会想出来。

1 个答案:

答案 0 :(得分:1)

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/com/sun/media/sound/DirectAudioDevice.java

首先,在获得某种异常后,我搜索并找到了这个网页,这是一个实现接口Clip,DataLine和其他一些类的类的文档。 很难确切地说出这些方法的作用,但似乎在类中有一个我们无法访问的循环计数器。基本上,如果你想计算你需要Clip.LOOP_CONTINUOUSLY的循环并拥有自己的计数器,它在轨道的末尾递增。请注意,stop()将影响Clip实例的许多值,因此在start()之后,您将再次需要循环(-1)[Clip.LOOP_CONTINUOUSLY = -1,但使用API​​确认]。

我决定实现自己的setLoopPoints(int,int)和loop(int)join方法,并将其发布在下面。请注意(也许是因为它在一个Thread中)getFramePosition()似乎只返回每第441帧,或者有时是第882帧或第1323帧,这意味着这不是一个完美的解决方案,但我不认为有一个完美的解决方案。

另外,请注意,如果您在UI线程上对剪辑执行任何操作(如移动位置),则可能会影响此操作并导致异常。

以下是代码:

%HOMEDRIVE%%HOMEPATH%