Java暂停后继续循环剪辑
在java中创建Java暂停后继续循环剪辑,java,audio,Java,Audio,在java中创建Clip并打开声音后,可以使用Clip.start()播放声音。您可以使用clip.stop()暂停播放此声音,然后调用clip.start()继续播放 使用clip.loop(i)时,是否有任何方法可以执行相同的操作 调用clip.loop(3)后,剪辑应播放四次。但是,如果在声音上调用clip.stop(),然后通过调用clip.start()继续播放,则该片段将取消暂停,但无论需要执行多少次循环,它都只会完成当前的播放。因此,如果我理解正确,clip.stop()在不重置微
Clip
并打开声音后,可以使用Clip.start()
播放声音。您可以使用clip.stop()
暂停播放此声音,然后调用clip.start()
继续播放
使用clip.loop(i)
时,是否有任何方法可以执行相同的操作
调用clip.loop(3)
后,剪辑应播放四次。但是,如果在声音上调用clip.stop()
,然后通过调用clip.start()
继续播放,则该片段将取消暂停,但无论需要执行多少次循环,它都只会完成当前的播放。因此,如果我理解正确,clip.stop()
在不重置微秒位置的情况下停止播放,而clip.start()
仅从当前微秒位置到片段末尾继续播放一次
那么,如何在不丢失循环量的情况下恢复java中的循环片段呢?如果有一种方法可以得到一个剪辑的循环次数,我大概可以计算出来。
首先,在得到某种异常之后,我搜索并找到了这个网页,它是实现接口Clip、DataLine和其他一些类的文档。
很难说这些方法到底做了什么,但类中似乎有一个循环计数器,我们无法访问。基本上,如果要计算循环数,需要连续剪裁.LOOP_,并在轨迹末端拥有自己的递增计数器。请注意,stop()将影响Clip实例的许多值,因此在start()之后,您将再次需要循环(-1)[Clip.loop\u CONTINUOUSLY=-1,但使用API确认]
我决定实现我自己的setLoopPoints(int,int)和loop(int)连接方法,并将其发布在下面。请注意(可能是因为它在线程中)getFramePosition()似乎只返回每441帧,有时是882帧或1323帧,这意味着这不是一个完美的解决方案,但我认为没有完美的解决方案
另外,请注意,如果您使用剪辑在UI线程上执行任何操作(如移动位置),可能会影响此操作并导致异常
代码如下:
public class ClipLooper extends Thread
{
private Clip c;
private int firstFrame, lastFrame, numLoops, currentLoop = 1;
public ClipLooper(Clip c, int ff, int lf, int nl) throws Exception
{
if( ff < 0 || lf < ff || c.getFrameLength() < lf)
throw new Exception("you screwed up!! \n");
this.c = c;
firstFrame = ff;
lastFrame = lf;
numLoops = nl;
}
@Override
public void run()
{
while(currentLoop <= numLoops || numLoops <= 0)
{
c.setFramePosition(firstFrame);
c.start();
c.loop(-1);
while(c.getFramePosition() < lastFrame-220)
{}
c.stop();
++currentLoop;
}
}
}
public类ClipLooper扩展线程
{
私人剪辑c;
private int firstFrame、lastFrame、numLoops、currentLoop=1;
公共剪辑操作符(剪辑c、int-ff、int-lf、int-nl)引发异常
{
if(ff<0 | | lf