首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用vlcj api在Java FX中播放视频

使用vlcj api在Java FX中播放视频
EN

Stack Overflow用户
提问于 2015-09-09 17:40:00
回答 2查看 4.3K关注 0票数 2

我正尝试在Java FX组件上播放视频,但无法播放。我知道如何使用vlcj在swing中播放视频,但当我尝试同样的操作时,我无法在javafx中执行此操作

代码语言:javascript
复制
    @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]);
    }

我想知道在我们在swing中做的settingContentPane的javafx中我需要做什么。

EN

回答 2

Stack Overflow用户

发布于 2015-09-09 23:39:52

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

对于JavaFX,你必须自己使用DirectMediaPlayerComponent来渲染视频--“直接”,意思是“直接渲染”。在较高的级别上,这涉及到获取视频数据(由组件为您提供),然后以某种方式呈现它,例如将视频数据复制到场景中的图像。

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

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

票数 4
EN

Stack Overflow用户

发布于 2018-08-27 23:47:24

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

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

我在Java开发方面没有那么多经验,对Java Fx word也不是很熟悉。但它工作得很好。代码说明:可以在Java Fx中使用的这个面板awt面板将被绘制在这个面板上。要播放视频,请使用:

代码语言:javascript
复制
VlcPlayerPane#play(video_file_path.mp4)

MyMediaPlayerEventListenerMediaPlayerEventListener,但每个方法的Defalt值都为空。

代码语言:javascript
复制
//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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32476109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档