【发布时间】:2021-12-28 05:00:51
【问题描述】:
我使用embeddedMediaPlayer.media().play(path); 加载视频并同时播放没有问题,但我宁愿它打开并且不自动播放视频。如果我使用 embeddedMediaPlayer.media().prepare(path); 它似乎并没有做任何事情,因为如果我然后使用 embeddedMediaPlayer.controls().play(); 播放视频它不会启动视频..
我还需要做些什么才能正确加载视频吗?使用embeddedMediaPlayer.media().play(path);,我在终端中得到这个显示视频已完全加载:
[00007fd615b78b00] videotoolbox decoder: Using Video Toolbox to decode 'h264'
[00007fd615b78b00] videotoolbox decoder: vt cvpx chroma: 420v
但是对于embeddedMediaPlayer.media().prepare(path);,我不明白。尽管函数的名称具有这种效果,但它似乎实际上并没有“准备”视频。
编辑:使用的代码来自演示程序https://github.com/caprica/vlcj-javafx-demo
公共类 VlcjJavaFxApplication 扩展应用程序 {
private final MediaPlayerFactory mediaPlayerFactory;
private final EmbeddedMediaPlayer embeddedMediaPlayer;
private ImageView videoImageView;
public VlcjJavaFxApplication() {
this.mediaPlayerFactory = new MediaPlayerFactory();
this.embeddedMediaPlayer = mediaPlayerFactory.mediaPlayers().newEmbeddedMediaPlayer();
this.embeddedMediaPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void playing(MediaPlayer mediaPlayer) {
}
@Override
public void paused(MediaPlayer mediaPlayer) {
}
@Override
public void stopped(MediaPlayer mediaPlayer) {
}
@Override
public void timeChanged(MediaPlayer mediaPlayer, long newTime) {
}
@Override
public void mediaChanged(MediaPlayer mediaPlayer, MediaRef media) {
System.out.println("media changed");
}
});
}
@Override
public void init() {
this.videoImageView = new ImageView();
this.videoImageView.setPreserveRatio(true);
embeddedMediaPlayer.videoSurface().set(videoSurfaceForImageView(this.videoImageView));
}
@Override
public final void start(Stage primaryStage) throws Exception {
List<String> params = getParameters().getRaw();
// if (params.size() != 1) {
// System.out.println("Specify a single MRL");
// System.exit(-1);
// }
BorderPane root = new BorderPane();
root.setStyle("-fx-background-color: black;");
videoImageView.fitWidthProperty().bind(root.widthProperty());
videoImageView.fitHeightProperty().bind(root.heightProperty());
root.widthProperty().addListener((observableValue, oldValue, newValue) -> {
// If you need to know about resizes
});
root.heightProperty().addListener((observableValue, oldValue, newValue) -> {
// If you need to know about resizes
});
root.setCenter(videoImageView);
Scene scene = new Scene(root, 1200, 675, Color.BLACK);
primaryStage.setTitle("vlcj JavaFX");
primaryStage.setScene(scene);
primaryStage.show();
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
if (ke.getCode().toString() == "ESCAPE")
System.exit(0);
else if (ke.getCode().toString() == "SLASH")
playPause();
}
});
embeddedMediaPlayer.media()
.prepare("/Volumes/Movies/stuff/projects/JavaFX/test/src/assets/test.mp4");
// embeddedMediaPlayer.media()
// .play("/Volumes/Movies/stuff/projects/JavaFX/test/src/assets/test.mp4");//this plays fine
// embeddedMediaPlayer.media().play(params.get(0));
embeddedMediaPlayer.controls().setPosition(0.4f);
}
private void playPause() {
System.out.println(embeddedMediaPlayer.status().isPlayable());//prepare - false, play = true
embeddedMediaPlayer.controls().play();
}
【问题讨论】:
-
你可以看看源代码,甚至可以尝试调试
prepare方法,对吧? -
@jmizv 好吧,我只是假设这是
prepare方法,我认为它不需要调试。不知道为什么它不起作用。 -
@caprica 因为它与
embeddedMediaPlayer.media().play(path);配合得很好,所以我的代码似乎没有任何问题。使用prepare它将播放视频,但我必须多次按.controls().play();.. -
@caprica 我不止一次的意思是我按一次
.controls().play();,然后在终端中得到videotoolbox decoder: Using Video Toolbox to decode 'h264'等,然后如果我再次按播放,它就会开始播放。