使用vlcj api在Java FX中播放video

我正在尝试播放有关Java FX组件的video但无法播放。 我知道如何使用vlcj播放video,但是当我尝试相同时我无法在javafx中播放

@Override public void start(Stage primaryStage) { File f = new File("Video.mp4"); new NativeDiscovery().discover(); EmbeddedMediaPlayerComponent playerComponent = new EmbeddedMediaPlayerComponent(); /*I dont know where to add the playerComponent as we do in swing*/ MediaPlayer mp=playerComponent.getMediaPlayer(); StackPane root = new StackPane(); Scene scene = new Scene(root, 700, 700); primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); } //above code is for javafx where I am getting a problem //below code for swing public void playVideo() { new NativeDiscovery().discover(); EmbeddedMediaPlayerComponent playerComponent = new EmbeddedMediaPlayerComponent(); jif[i].setContentPane(playerComponent); MediaPlayer p = playerComponent.getMediaPlayer(); ft = new FileTest(); videoList = ft.getVideoList(); jif[i].setVisible(true); frame.setVisible(true); p.setAspectRatio(width[i] + ":" + height[i]); p.playMedia(videoList[0]); } 

我想知道我需要在javafx中为我们在swing中设置的SettingContentPane做些什么。

EmbeddedMediaPlayerComponent需要一个重量级的AWT Canvas来播放video。你不能在JavaFX中使用这种方法。

对于JavaFX,您必须使用DirectMediaPlayerComponent渲染video – “direct”意味着“直接渲染”。 在较高的层次上,这涉及获取video数据(由组件为您提供),然后以某种方式呈现它,例如将video数据复制到场景中的图像。

这里有一个完整的项目,显示了许多方法,包括一个解决方案,以使可resize的video播放器工作:

https://github.com/caprica/vlcj-javafx

我有同样的问题。 然后我尝试了vlcj-javafx ,但是使用该解决方案,我遇到了性能问题并且无法观看video。 所以,我尝试使用具有更好性能的awt。

我最终得到了一个AWT JWindows,当JavaFx窗口被聚焦时,它是最顶层的,并且像javafx Window一样改变位置。 我知道这不是一个好的解决方案,但它比我之前使用java fx尝试的任何解决方案都更好

我没有Java开发经验,也不熟悉Java Fx这个词。 但它工作安静。 代码说明:您可以在Java Fx中使用此面板,awt面板将在此面板上绘制。 要播放video使用:

 VlcPlayerPane#play(video_file_path.mp4) 

MyMediaPlayerEventListenerMediaPlayerEventListener但每个Method都有一个空的defalt值。

 //some imports here.... public class VlcPlayerPane extends Pane { static { NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:/Program Files/VideoLAN/VLC"); } private JWindow frame; private Timer videoMoveTimer; private EmbeddedMediaPlayerComponent mediaPlayerComponent; private Runnable trackFinishedAction = null; private Consumer onTimeChanged = null; private Consumer onPositionChanged = null; private Consumer onMaxLenghtChanged = null; public VlcPlayerPane() { this.setBackground( new Background(new BackgroundFill(Color.BLACK, new CornerRadii(2), new Insets(2)))); Platform.runLater(() -> getScene().getWindow().focusedProperty().addListener((a, b, c) -> { if (frame != null) { if (c) { frame.setAlwaysOnTop(true); } else { frame.setAlwaysOnTop(false); } } })); } private void createMoveTimer() { videoMoveTimer = new Timer(); videoMoveTimer.schedule(new TimerTask() { private Bounds oldBounds = null; @Override public void run() { Bounds bounds = localToScreen(getBoundsInLocal()); if (!((Stage) getScene().getWindow()).isIconified()) { if (!frame.isVisible()) { frame.setVisible(true); } if (oldBounds == null || bounds.getMinX() != oldBounds.getMinX() || bounds.getMinY() != oldBounds.getMinY() || bounds.getWidth() != oldBounds.getWidth() || bounds.getHeight() != oldBounds.getHeight()) { oldBounds = bounds; frame.setLocation(((int) bounds.getMinX()), ((int) bounds.getMinY())); frame.setSize(((int) bounds.getWidth()), ((int) bounds.getHeight())); } } else { if (frame.isVisible()) { frame.setVisible(false); oldBounds = null; frame.setSize(0, 0); } } } }, 0, 50); } private void createPlayer() { frame = new JWindow(); mediaPlayerComponent = new EmbeddedMediaPlayerComponent(); frame.setContentPane(mediaPlayerComponent); frame.setSize(0, 0); frame.setVisible(true); createMoveTimer(); mediaPlayerComponent.getMediaPlayer().addMediaPlayerEventListener(new MyMediaPlayerEventListener() { @Override public void finished(MediaPlayer mediaPlayer) { if (trackFinishedAction != null) { trackFinishedAction.run(); } } @Override public void timeChanged(MediaPlayer mediaPlayer, long newTime) { if (onTimeChanged != null) { onTimeChanged.accept(newTime); } } @Override public void positionChanged(MediaPlayer mediaPlayer, float newPosition) { if (onPositionChanged != null) { onPositionChanged.accept(newPosition); } } @Override public void lengthChanged(MediaPlayer mediaPlayer, long newLength) { if(onMaxLenghtChanged !=null){ onMaxLenghtChanged.accept(newLength); } } }); } public void play(String path) { if (mediaPlayerComponent == null) { createPlayer(); } try { mediaPlayerComponent.getMediaPlayer().playMedia(path); }catch (Exception e){ e.printStackTrace(); } } public void pause() { if(mediaPlayerComponent != null) { mediaPlayerComponent.getMediaPlayer().pause(); } } public void continuePlaying() { if(mediaPlayerComponent != null) { mediaPlayerComponent.getMediaPlayer().play(); } } public void stopVideo() { if (mediaPlayerComponent != null && mediaPlayerComponent.getMediaPlayer() != null) { mediaPlayerComponent.getMediaPlayer().stop(); } videoMoveTimer.cancel(); frame.setVisible(false); frame.dispose(); frame = null; mediaPlayerComponent = null; videoMoveTimer = null; } public void setPlayPosition(int seconds){ if(mediaPlayerComponent != null){ mediaPlayerComponent.getMediaPlayer().setTime(seconds*1000); } } public void registerOnTimeChanged(Consumer action) { onTimeChanged = action; } public void registerOnPositionChanged(Consumer action) { onPositionChanged = action; } public void registerOnFinishedTrack(Runnable action) { trackFinishedAction = action; } public void registerOnMaxLengthChanged(Consumer action){ onMaxLenghtChanged = action; } public long getLength() { if(mediaPlayerComponent == null){ return 0; } return mediaPlayerComponent.getMediaPlayer().getLength(); } public float getActualPositionPercent() { if(mediaPlayerComponent == null){ return 0; } return mediaPlayerComponent.getMediaPlayer().getPosition(); } public long getActualPositionSecond() { if(mediaPlayerComponent == null){ return 0; } return mediaPlayerComponent.getMediaPlayer().getTime(); }