【问题标题】:Playing Video in Java FX using vlcj api使用 vlc api 在 Javafx 中播放视频
【发布时间】:2015-09-09 09:39:59
【问题描述】:

我正在尝试播放有关 Java FX 组件的视频,但无法播放。 我知道如何使用 vlcj 在摇摆中播放视频,但是当我尝试相同时,我无法在 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 中所做的设置内容窗格。

【问题讨论】:

    标签: java javafx vlcj


    【解决方案1】:

    EmbeddedMediaPlayerComponent 需要重量级 AWT Canvas 来播放视频。您不能在 JavaFX 中使用这种方法。

    对于 JavaFX,您必须使用 DirectMediaPlayerComponent 自己渲染视频 - “直接”表示“直接渲染”。概括地说,这涉及获取视频数据(由组件为您提供),然后您以某种方式对其进行渲染,例如将视频数据复制到场景中的图像中。

    这里有一个完整的项目,展示了多种方法,包括一种让可调整大小的视频播放器正常工作的解决方案:

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

    【讨论】:

    • 谁能解释一下为什么这种方法使用 AnimationTimer 而不是中继 vlcj 渲染回调?
    【解决方案2】:

    我遇到了同样的问题。然后我尝试了上面提到的vlcj-javafx,但是使用该解决方案时,我遇到了性能问题并且无法观看视频。 因此,我尝试使用性能更好的 awt。

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

    我在 Java 开发方面没有那么丰富的经验,并且对 Java Fx 词不熟悉。但它工作安静好。 代码说明: 您可以在 Java Fx 中使用此面板,awt 面板将绘制在此面板上。 要播放视频,请使用:

    VlcPlayerPane#play(video_file_path.mp4)
    

    MyMediaPlayerEventListenerMediaPlayerEventListener,但每个方法都有一个空的默认值。

    //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<Long> onTimeChanged = null;
    private Consumer<Float> onPositionChanged = null;
    private Consumer<Long> 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<Long> action) {
        onTimeChanged = action;
    }
    
    public void registerOnPositionChanged(Consumer<Float> action) {
        onPositionChanged = action;
    }
    
    public void registerOnFinishedTrack(Runnable action) {
        trackFinishedAction = action;
    }
    
    public void registerOnMaxLengthChanged(Consumer<Long> 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();
    }
    

    【讨论】:

    • 嗨 Reto,任何更改都可以包含指向 GitHub 要点的链接,或者甚至更好地将代码复制/粘贴到此答案中?这将帮助遇到此问题并想尝试您的解决方案的任何人。谢谢!
    猜你喜欢
    • 2013-10-25
    • 2013-04-04
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多