2017-04-15 21 views
0

所以我使用的是JavaFX,并且想要设置一个实验,我必须播放许多视频并与用户进行交互。对于这种设置,我想编写一个函数来接收文件名并用该名称播放视频。但它只能在视频播放结束后才会返回,而不是之前。所以像这样:(帮助仍然需要)如何制作视频播放结束时播放的playvideo功能?

private void play(URI name){ 
    MediaPlayer mediaPlayer = new MediaPlayer(new Media(name)); 
    mediaPlayer.setAutoPlay(true); 
    view.setMediaPlayer(mediaPlayer); 
} 

但是,这个函数返回视频结束之前,使程序的执行一团糟。我知道MediaPlayer有一个setOnEndOfMedia(Runnable)函数,但我不确定我可能如何使用它来实现我的目标。

这是我现在的代码。但它不起作用。问题在于两个视频都在同一时间播放,可能是因为播放函数一开始播放视频就会返回。我也尝试在播放函数的末尾添加一段while(true)循环,以便它在那里停留,直到返回;在.setOnEndOfMedia被调用,这阻止了任何视频的播放。

CODE:

static MediaView view; 

@Override 
public void start(Stage stage) throws IOException, URISyntaxException, InterruptedException { 
    // Create full screen scene 
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); 
    stage.setFullScreen(true); 
    Scene scene = new Scene(new Group(), dim.getWidth(), dim.getHeight()); 
    stage.setScene(scene); 
    stage.show(); 

    // Create the view and add it to the Scene. 
    view = new MediaView(); 
    ((Group)scene.getRoot()).getChildren().add(view); 

    play("videol"); 
    play("video2"); 
} 

private static void play(String name) throws InterruptedException { 
    Media media = new Media(uri(name)); 
    MediaPlayer player = new MediaPlayer(media); 
    player.setOnReady(() -> { 
     player.play(); 
     player.setOnEndOfMedia(() -> { 
      player.dispose(); 
      return; 
     }); 
    }); 
    view.setMediaPlayer(player); 
} 

private static String uri(String name) { 
    return Paths.get("clips/" + name + ".mp4").toUri().toString(); 
} 

public static void main(String[] args) { 
    launch(args); 
} 

回答

0

保持我原来的东西,因为它是有用的人。

无论如何,你的代码的问题是你正在调用方法两次,就在它本身之后。您需要从EndOfMedia部分中调用该方法。如果您希望在使用递归时可以创建列表和参数,则可以使用list.poll()来获取和删除列表中的第一个字符串。然后,当列表为空时,您可以返回到界面。只是一些想法。

我建议你使用的是创建一个播放音乐的方法,该方法以String作为参数,然后使用该字符串在散列图中找到它的等价物,如HashMap<String, MediaPlayer>。然后到你实际需要帮助的地方。我建议你写的东西是这样的:再次

mediaPlayer.setOnReady(() -> { 
     mediaPlayer.play(); 
     mediaPlayer.setOnEndOfMedia(() -> { 
      mediaPlayer.dispose(); 
      MusicPlayer(); 
     }); 
    }); 

基本上,你正在播放的媒体当准备好,然后在年底处置,并调用该方法,并在我的代码使用递归和调用方法MusicPlayer你可以改为'返回'。对不起,如果这是很不好解释,如果你需要进一步的帮助下面评论。

+0

我试过你的代码,我通过返回替换MusicPlayer()。但是,当我尝试播放几个视频时(例如,播放(“video_a”);播放(“video_b”);播放(“video_c”);)它只播放第一个视频,然后保持冻结状态。它已经执行了所有代码,但是我使用打印件进行了检查。 – Joan

+0

更正:它同时播放所有视频(不仅仅是第一个)。那么如何在视频结束之前阻止第一个函数调用返回? – Joan

+0

您确定您正在使用Javafx支持的媒体类型,您是否也可以提供更多代码,以便我可以更好地帮助您? –