首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何循环播放音频文件: javax.sound.sampled结束后重播

如何循环播放音频文件: javax.sound.sampled结束后重播
EN

Stack Overflow用户
提问于 2020-08-04 22:11:15
回答 2查看 32关注 0票数 0

我在试着一遍又一遍地播放声音。我有这样的代码:

代码语言:javascript
复制
public void play()  {
        try  {
            URL defaultSound = getClass().getResource(filename);
            AudioInputStream audioInputStream =
                    AudioSystem.getAudioInputStream(defaultSound);
            Clip clip = AudioSystem.getClip();
            clip.open(audioInputStream);
            clip.start( );
            System.out.println(clip.getMicrosecondLength());
            Thread.sleep(clip.getMicrosecondLength() / 1000);
            clip.addLineListener(new LineListener() {
                @Override
                public void update(LineEvent event) {
                    try {
                        clip.start();
                        Thread.sleep(clip.getMicrosecondLength() / 1000);
                    }
                    catch (Exception e)  {
                        e.printStackTrace();
                    }
                }
            });

        }
        catch (Exception e)  {
            e.printStackTrace();
        }
    }

但它只播放一次声音。

EN

回答 2

Stack Overflow用户

发布于 2020-08-05 07:27:03

代码语言:javascript
复制
clip.open(audioInputStream);
clip.start( );

应该是:

代码语言:javascript
复制
clip.open(audioInputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY); // <- NEW!
clip.start( );

请参阅Clip.loop(int)

参数:

count -回放应该从循环的结束位置循环回到循环的开始位置的次数,或LOOP_CONTINUOUSLY,表示循环应该继续,直到中断

票数 1
EN

Stack Overflow用户

发布于 2020-08-04 22:14:14

您可能希望使用Clip#setFramePosition将剪辑的frame position设置为0。你会想要在Clip#start之前调用它。您还需要检查LineEvent类型是否是值LineEvent.Type#STOP,以确保事件是update事件或close,并且确实是在它停止的时候。

代码语言:javascript
复制
@Override
public void update(LineEvent event) {
    try {
        if (event.getType() == LineEvent.Type.STOP) {
            clip.setFramePosition(0);
            clip.start();
            Thread.sleep(clip.getMicrosecondLength() / 1000);
        }
    } catch (InterruptedException e)  {
        Thread.currentThread().interrupt();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63248747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档