如何在JavaFX中使MP3重复播放?

9
我希望在我的 mp3 文件播放结束后能够重复播放,但我无法创建一个循环来重复播放我的文件。(我使用了这段代码,但它只会在播放完第一秒后停止。)
AudioClip myMusic ....   
myMusic.setCycleCount(AudioClip.INDEFINITE);
myMusic.play();

编辑: 我使用了MediaPlayer,但它的循环计数器没有正确工作。例如,第一次播放我的mp3文件时它播放了2次,在第3次播放时突然停止。 第二次我再次运行我的应用程序,它只播放了1次,在第二次播放的一半时就停止了。 以下是我的代码:

URL resource = getClass().getResource("abcd.mp3");
     MediaPlayer a =new MediaPlayer(new Media(resource.toString()));
     a.setCycleCount(MediaPlayer.INDEFINITE);

 a.play();

有任何想法吗?谢谢您的帮助。

myMusic.bgSound是什么?假设myMusic是一个AudioClip,它不是AudioClip的一个字段。 - ggovan
编辑:myMusic 是一个 AudioClip。 - user2768684
你应该将你的答案作为这个问题的答案发布,而不是在问题本身中回答。 - ggovan
2个回答

17

我找到了解决方案,我使用了setOnEndOfMedia方法:

 URL resource = getClass().getResource("abcd.mp3");
 MediaPlayer a =new MediaPlayer(new Media(resource.toString()));
 a.setOnEndOfMedia(new Runnable() {
       public void run() {
         a.seek(Duration.ZERO);
       }
   });
  a.play();

1
@Zeta. 如果你还需要解决这个问题,我想给你一个解决方案。如果你要使用MediaPlayer播放声音,它需要放置在附加到当前场景的MediaView中。这就是为什么它停止播放的原因。有时,如果焦点失去在你的窗口上,它会停止播放。如果你把MediaPlayer放在MediaView中,并将其放在你的面板中,它就不应该停止播放。 - Philip Vaughn
@PhilipVaughn 谢谢。我会检查一下,但如果需要放在 MediaView 中,这似乎非常不合逻辑。 - Zeta.Investigator
1
@Zeta.Investigator 当我开始使用它们时,我也有这样的想法,但我一直在想为什么这个愚蠢的东西会停止。一旦我将它放置在我的根Stackpane中的MediaView中,问题就解决了。请查看以下“错误”并查看最终响应 https://bugs.openjdk.java.net/browse/JDK-8138754 - Philip Vaughn
@PhilipVaughn 看起来我们也可以将其声明为实例变量,这样GC就会让它保持不变。从你的链接中可以看到:“将sound更改为字段修复了问题”。 - Zeta.Investigator
1
@Zeta.Investigator 是的,但是如果您出于任何原因处理该页面,它也会停止。我的实例是我正在构建的游戏,我将MediaView放在根Stackpane中,这很好(因为我不断切换屏幕,实例变量可能会因为任何原因而丢失)。 - Philip Vaughn
显示剩余2条评论

0
为了避免突然停止,你必须做到以下几点:
a.setOnReady(new Runnable() {
        @Override
        public void run() {
            a.play();
        }
    });

这对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接