下一个MediaPlayer上的JavaFX setOnEndOfMedia [英] JavaFX setOnEndOfMedia on next MediaPlayer

查看:107
本文介绍了下一个MediaPlayer上的JavaFX setOnEndOfMedia的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有List<MediaPlayer>正在填充

I have List<MediaPlayer> that is populating by

private List<MediaPlayer> players() {

    for (String file : path.list((dir1, name) -> {
        if (name.endsWith(SUPPORTED_VIDEO_FILE_EXTENSIONS)){
            return true;
        }
        return false;
    })) {
        players.add(createPlayer(Paths.get(path + "/" + file).toUri().toString()));
        System.out.println(Paths.get(path + "/" + file).toUri().toString());
    }
    return players;
}

在我的情况下,List<MediaPlayer>的大小为3.

In my case size of List<MediaPlayer> is 3. Than i use it there

if (currentNumOfVideo == -1) {
    currentNumOfVideo = 0;
}
mv = new MediaView();
MediaPlayer currentPlayer = players.get(currentNumOfVideo);
mv.setMediaPlayer(currentPlayer);
currentPlayer.play();

players.get(currentNumOfVideo).setOnEndOfMedia(() -> {
    players.get(currentNumOfVideo).stop();
    if (currentNumOfVideo < players.size()) {
        currentNumOfVideo += 1;
        mv.setMediaPlayer(players.get(currentNumOfVideo));
        players.get(currentNumOfVideo).play();
    } else {
        currentNumOfVideo = 0;
        mv.setMediaPlayer(players.get(currentNumOfVideo));
        players.get(currentNumOfVideo).play();
    }
});

第一个视频播放结束后,第二个视频开始播放.在第二个视频之后,MediaPlayer停止并且没有播放第三个视频.

First video playing, when it ends second video starts. After second video MediaPlayer stops and didn't play third video.

我了解到,因为我的setOnEndOfMedia仅在第一个MediaPlayer上.当第二个视频开始播放时,它没有setOnEndOfMedia.如何在List<MediaPlayer>中的每个视频上setOnEndOfMedia.

I understand that because of my setOnEndOfMedia that is only on first MediaPlayer. When the second video starts it doesn't have setOnEndOfMedia. How can I setOnEndOfMedia on every video in my List<MediaPlayer>.

推荐答案

我个人不会提前创建所有MediaPlayer实例.而是获取Media对象的列表,或者至少获取指向媒体的URI.然后创建一个方法,该方法负责在当前视频结束时播放下一个视频.该方法将处置旧的MediaPlayer,创建下一个MediaPlayer,并将其配置为在完成时调用相同的方法.例如:

Personally, I would not create all the MediaPlayer instances ahead-of-time. Instead, get a list of Media objects or at least the URIs pointing to the media. Then create a method which is responsible for playing the next video when the current video ends. That method will dispose the old MediaPlayer, create the next MediaPlayer, and configure it to call the same method upon completion. For example:

import java.util.List;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;

public class Main extends Application {

  private MediaView mediaView;

  private List<Media> media;
  private int curIndex;

  @Override
  public void start(Stage primaryStage) throws Exception {
    media = ...; // get media from somewhere

    mediaView = new MediaView();
    primaryStage.setScene(new Scene(new StackPane(mediaView), 720, 480));
    primaryStage.show();

    playNextVideo();
  }

  private void playNextVideo() {
    disposePlayer();
    if (curIndex == media.size()) {
      return; // no more videos to play
    }

    MediaPlayer player = new MediaPlayer(media.get(curIndex++));
    player.setAutoPlay(true); // play ASAP
    player.setOnEndOfMedia(this::playNextVideo); // play next video when this one ends
    mediaView.setMediaPlayer(player);
  }

  private void disposePlayer() {
    MediaPlayer player = mediaView.getMediaPlayer();
    if (player != null) {
      player.dispose(); // release resources
    }
  }
}

这可能会导致视频之间的暂停.如果不可接受,您可以提前创建 next MediaPlayer,既可以与当前MediaPlayer同时创建,也可以在当前播放器达到某个时间戳时创建(例如,之前的10秒结束).但我仍然不会提前创建 all 所有MediaPlayer实例.

This may cause a pause between videos. If that's not acceptable you could create the next MediaPlayer ahead-of-time, either at the same time as the current MediaPlayer or when the current player reaches a certain timestamp (e.g. 10 seconds before the end). But I still wouldn't create all the MediaPlayer instances ahead-of-time.

这篇关于下一个MediaPlayer上的JavaFX setOnEndOfMedia的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆