有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

音频Java暂停后继续循环剪辑

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

在使用clip.loop(i)时是否有任何方法可以做同样的事情

调用clip.loop(3)后,该剪辑应播放四次。但是,如果在声音上调用clip.stop(),然后通过调用clip.start()继续播放,则剪辑将取消暂停,但无论需要执行多少次循环,都只会完成当前的播放。因此,如果我理解正确,clip.stop()停止播放而不重置微秒位置,clip.start()仅从当前微秒位置继续播放到片段末尾一次

那么,如何在不丢失循环量的情况下恢复java中的循环片段呢?如果有一种方法可以得到一个剪辑的循环次数,我可能会找到它


共 (1) 个答案

  1. # 1 楼答案

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

    首先,在得到某种异常之后,我搜索并找到了这个网页,它是实现接口Clip、DataLine和其他一些类的文档。 很难说这些方法到底做了什么,但类中似乎有一个循环计数器,我们无法访问。基本上,如果要计算循环数,则需要剪裁。连续循环_,并在轨道末端有自己的递增计数器。请注意,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;
            }
        }
    }