2017-04-20 17 views
0

我需要一个为我播放视频的功能,并在视频结束时返回,而不是在之前。所以当我写“play('video1'); play('video2');”两个视频都必须重新播放。我已经做了几次尝试,但迄今为止所有尝试都不会播放视频或同时播放所有视频。下面我发布了一个播放视频的基本功能,现在我只需要一种方法来延迟返回。有任何想法吗?我可以制作一个功能,直到媒体完成播放才能返回吗?

private static void play(String name) throws InterruptedException { 
    Media media = new Media(uri(name)); 
    MediaPlayer player = new MediaPlayer(media); 
    player.setAutoPlay(true); 
    view.setMediaPlayer(player); 
} 

我尝试以下:

player.setOnEndOfMedia(() -> { return; }); 
组合

在函数的末尾的无限循环。出于某种原因,阻止播放视频。有更好的主意吗?

回答

1

JavaFX与所有UI工具包一样,是事件驱动的。这意味着你可以编写响应事件的代码,而不是编写一个能够完成所有工作的大循环。 (假设您从FX应用程序线程启动媒体播放器,如果您的方法在媒体完成后才会退出,那么UI将无法更新或响应任何用户事件,直到媒体完成为止,而不是你想要什么发生)

所以你需要使用一个onEndOfMedia处理程序来播放下一个媒体,如果有另一个打一处来:

private String[] videos = {"video1", "video2"}; 
private int currentVideoIndex = 0 ; 

private void playNextVideo() { 
    Media media = new Media(uri(videos[currentVideoIndex])); 
    currentVideoIndex++ ; 
    MediaPlayer player = new MediaPlayer(media); 
    player.setOnEndOfMedia(() -> { 
     if (currentVideoIndex < videos.length) { 
      playNextVideo(); 
     } 
    }); 
    player.setAutoPlay(true); 
    view.setMediaPlayer(player); 
} 
+0

您好詹姆斯,感谢您的快速响应, javafx是事件驱动真正帮助的概念。我正在使用你的功能,它的效果很好。我想知道是否有一个很好的方法来防止两个视频之间短暂的白色闪烁。 (因为我的所有视频的开始和结束都大致在同一屏幕上,我正在考虑将视频中的帧设置为场景背景。是否有更好的方法来实现这种效果?) – Joan

+0

@Joan不确定:我会有试验一下,没有合适的视频文件。我怀疑“闪烁”是在很短的时间内,而媒体仍然从磁盘(或任何地方)读取,但在调用“view.setMediaPlayer(...)”后已完成。您可能可以做类似于“提前排队下一个视频”的事情,也许可以通过加载创建下一个Media对象(甚至是MediaPlayer对象)来提前播放一个视频。但是,代码可能会变得复杂。 –

相关问题