JavaFXMediaPlayer:使用setStopTime时,播放次数为应有的一半

JavaFXMediaPlayer:使用setStopTime时,播放次数为应有的一半,java,javafx,Java,Javafx,在myMediaPlayer上使用setStopTime时,媒体播放的次数约为setCycleCount指定的一半 因此,如果我使用player.setCycleCount(10),声音只会播放5次而不是10次 为什么玩家会这样做,我如何让它按预定的次数播放? 我做了更多的测试,在播放一次之后,currentCount似乎增加了2而不是1,并且OnEndOfMedia也被触发了两次 这个问题似乎仅限于一些媒体。示例: (约1.8秒长) (约27秒长) 如果我停止使用setStopTime,问题就

在my
MediaPlayer
上使用
setStopTime
时,媒体播放的次数约为
setCycleCount
指定的一半

因此,如果我使用
player.setCycleCount(10)
,声音只会播放5次而不是10次

为什么玩家会这样做,我如何让它按预定的次数播放?

我做了更多的测试,在播放一次之后,
currentCount
似乎增加了2而不是1,并且
OnEndOfMedia
也被触发了两次

这个问题似乎仅限于一些媒体。示例:

(约1.8秒长) (约27秒长)

如果我停止使用
setStopTime
,问题就会消失

下面是一个完整的问题示例。请注意,声音不会播放10次,并且在大多数循环中,文本会在控制台上打印两次

packagemain;
导入javafx.application.application;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.media.media;
导入javafx.scene.media.MediaPlayer;
导入javafx.scene.media.MediaView;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类主扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
媒体=新媒体(“https://ia601701.us.archive.org/21/items/Laser_201304/laser.mp3");
MediaPlayer=新的MediaPlayer(媒体);
//添加到场景中
组根=新组(新媒体视图(播放器));
场景=新场景(根,500,200);
//上台
primaryStage.setTitle(“媒体播放器”);
初级阶段。场景(场景);
primaryStage.show();
player.setCycleCount(10);//应该运行10次,但运行5-8次
player.setStopTime(新持续时间(1800));//删除此选项可修复此问题
长启动=System.currentTimeMillis();
player.setOnEndOfMedia(
新的Runnable(){
@凌驾
公开募捐{
浮点秒=(System.currentTimeMillis()-start)/1000F;
System.out.println(“当前计数:+player.getCurrentCount()+”秒:+sec”);
}
});
player.play();
}
公共静态void main(字符串[]args){
发射(args);
}
}
输出示例:

Current Count: 1 Seconds: 3.456
Current Count: 2 Seconds: 3.465
Current Count: 3 Seconds: 5.334
Current Count: 4 Seconds: 7.177
Current Count: 5 Seconds: 7.185
Current Count: 6 Seconds: 9.056
Current Count: 7 Seconds: 10.896
Current Count: 8 Seconds: 10.906
Current Count: 9 Seconds: 12.776
Current Count: 10 Seconds: 12.798
请注意,
OnEndOfMedia
通常是快速连续触发的,例如1-2、4-5、7-8和9-10(在本例中,媒体播放6次)

我尝试了JavaFX10、11和13,但也遇到了同样的问题


编辑:我注意到,对于有问题的媒体,
getCurrentTime()
总是返回媒体的最长持续时间。

我可以用您的代码和MP3文件重现问题。但是,如果在MP3文件的实际持续时间之前充分设置了
停止时间
,则不会出现问题。这使我得出结论,问题在于
stopTime
设置得太接近介质的实际持续时间。这可能是一个并发问题;如文件所述,有一个单独的“媒体线程”用于实际播放媒体,但从实现来看,重复功能发生在FX线程上,如果没有,请考虑(另请参阅)。另外,请注意,对于短音效,如1.8秒激光音效,使用a可能更合适。对于较大的文件,它也会这样做。您是否将
停止时间设置为离文件末尾有多近?如果接近(即接近相同),那么我并不感到惊讶。如前所述,我怀疑这是一个并发性问题,这意味着文件的长度是无关的。我认为,问题在于媒体线程到达了
stopTime
,这会在FX线程上安排一次重复,而FX线程又必须将“seek to
startTime
”发回媒体线程。但是,在该操作生效之前,媒体线程到达文件末尾,触发另一个重复过程,导致“同时”发生两个重复周期。我明白了。那么,将
stopTime
重置为默认值的建议选项是什么?我可以用您的代码和MP3文件重现该问题。但是,如果在MP3文件的实际持续时间之前充分设置了
停止时间
,则不会出现问题。这使我得出结论,问题在于
stopTime
设置得太接近介质的实际持续时间。这可能是一个并发问题;如文件所述,有一个单独的“媒体线程”用于实际播放媒体,但从实现来看,重复功能发生在FX线程上,如果没有,请考虑(另请参阅)。另外,请注意,对于短音效,如1.8秒激光音效,使用a可能更合适。对于较大的文件,它也会这样做。您是否将
停止时间设置为离文件末尾有多近?如果接近(即接近相同),那么我并不感到惊讶。如前所述,我怀疑这是一个并发性问题,这意味着文件的长度是无关的。我认为,问题在于媒体线程到达了
stopTime
,这会在FX线程上安排一次重复,而FX线程又必须将“seek to
startTime
”发回媒体线程。但是,在该操作生效之前,媒体线程到达文件末尾,触发另一个重复过程,导致“同时”发生两个重复周期。我明白了。那么,将
stopTime
重置为默认值的建议选项是什么?