Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java暂停后继续循环剪辑_Java_Audio - Fatal编程技术网

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()在不重置微

在java中创建
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