【问题标题】:VLCJ How to prepare media without playing it?VLCJ 如何在不播放的情况下准备媒体?
【发布时间】: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'等,然后如果我再次按播放,它就会开始播放。

标签: java javafx vlcj


【解决方案1】:

这似乎是一个实际问题,或者prepare 方法不应该像这样工作。至少我在开发的 github 页面上发布了这个问题,它已经打开了几天,没有任何人回应。

https://github.com/caprica/vlcj/issues/1094

vlcj 演示项目设置为自动播放视频,我猜是这样,因为这是唯一的方式。 prepare 方法似乎准备了一个视频,但您必须等待...或按一次播放以加载,然后再次播放。我想这有点“准备就绪”。

编辑:作者直接从 github 删除的问题没有解决方案。很奇怪。作者似乎没明白问题是播放延迟,而不是播放失败。在问题被删除之前,作者有这样的声明似乎可以解释延迟:

“理论上,您应该在 prepare 之后和调用 play 之前等待 mediaChanged 事件,因为最近 LibVLC 合理地使设置媒体异步。”

有一个即时播放的解决方法是使用start 方法并让它在第一次打开或媒体更改时暂停。这样一来,视频就可以立即播放了。

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多