【问题标题】:Video doesn't play on loop or repeat (vlcj-java)视频无法循环播放或重复播放(vlcj-java)
【发布时间】:2021-03-15 02:23:51
【问题描述】:

我在我的 java 程序中使用 vlcj。我需要反复播放视频。我用过 setRepeat(true);但这对我不起作用。这是循环视频的其他方法吗?还是我做错了?请帮我。非常感谢。

 public QueueMonitor() {
                    
        initComponents();
         
        //VIDEO
        chargerLibrairie();

        Canvas c = new Canvas();
        panel.add(c);
        MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
        //Create a media player instance
        EmbeddedMediaPlayer mediaPlayer = mediaPlayerFactory.newEmbeddedMediaPlayer();
        mediaPlayer.setVideoSurface(mediaPlayerFactory.newVideoSurface(c));
        
        mediaPlayer.playMedia("Ospital1.mp4");
        mediaPlayer.setRepeat(true);
        mediaPlayer.setPlaySubItems(true);

       
    }


    public static void chargerLibrairie(){
        NativeLibrary.addSearchPath(
        RuntimeUtil.getLibVlcLibraryName(), "C:/Program Files/VideoLAN/VLC");
        Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
        LibXUtil.initialise();
    }

另外,如何在程序运行时设置暂停、播放、降低音量等功能?就像普通的视频播放器一样。

【问题讨论】:

  • 您发布的代码犯了一个常见错误,即不保留对您的媒体播放器对象的引用 - 在这种情况下,“mediaPlayer”超出范围并在您的 QueueMonitor() 构造函数退出时有资格进行垃圾收集。您需要先解决这些问题,然后才能说出为什么重复播放不起作用。
  • 我究竟需要做什么来保持对媒体播放器对象的引用?
  • 由于这不是对已发布问题的回答,我将删除一个链接capricasoftware.co.uk/projects/vlcj-4/tutorials/…

标签: java windows loops media-player vlcj


【解决方案1】:

这里有一些关于如何使用 vlcj 进行重复播放的最小示例。

对于当前版本的 vlcj、4.x 及更高版本:

// vlcj 4.x+
public class RepeatPlayer {

    public static void main(String[] args) throws Exception {
        String mrl = "some-cool-video.mp3";

        EmbeddedMediaPlayerComponent mediaPlayerComponent = new EmbeddedMediaPlayerComponent();

        JFrame f = new JFrame("Repeat Player");
        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                mediaPlayerComponent.release();
            }
        });
        f.setContentPane(mediaPlayerComponent);
        f.setVisible(true);

        mediaPlayerComponent.mediaPlayer().controls().setRepeat(true);

        mediaPlayerComponent.mediaPlayer().media().play(mrl);

        Thread.currentThread().join();
    }
}

由于您使用的是旧版本的 vlcj,因此以前是这样完成的:

// vlcj 3.12.1
public class RepeatPlayer {

    public static void main(String[] args) throws Exception {
        String mrl = "some-cool-video.mp3";

        final EmbeddedMediaPlayerComponent mediaPlayerComponent = new EmbeddedMediaPlayerComponent();

        JFrame f = new JFrame("Repeat Player");
        f.setSize(800, 600);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                mediaPlayerComponent.release();
            }
        });
        f.setContentPane(mediaPlayerComponent);
        f.setVisible(true);

        mediaPlayerComponent.getMediaPlayer().setRepeat(true);

        mediaPlayerComponent.getMediaPlayer().playMedia(mrl);

        Thread.currentThread().join();
    }
}

因此,至少在重复播放功能方面,原始问题中的代码大体上是正确的。原始代码最可能的问题是媒体播放器由于未能保存对象引用而被垃圾回收。

【讨论】:

    【解决方案2】:
    public class Video extends javax.swing.JPanel
    {
    
      private EmbeddedMediaPlayerComponent video;
      private EmbeddedMediaPlayer mediaPlayer;
     
     public Video()
      {
        initComponents();
        initVideo();
      }
    
      private void initVideo()
      {
        video = new EmbeddedMediaPlayerComponent()
        {
          @Override
          public void finished(MediaPlayer mediaPlayer)
          {
            super.finished(mediaPlayer);
            System.out.println("FINISHED");
            new Thread(() -> {
              System.gc();
              mediaPlayer.controls().setTime(0);
              mediaPlayer.controls().play();
            }).start();
          }
        };
        mediaPlayer = video.mediaPlayer();
        mediaPlayer.input().enableKeyInputHandling(false);
        mediaPlayer.input().enableMouseInputHandling(false);
        add(video, BorderLayout.CENTER);
    
      }
      public void start(String path)
      {
        mediaPlayer.media().prepare(path);
        mediaPlayer.controls().play();
      }
      public void stop()
      {
        mediaPlayer.controls().stop();
        mediaPlayer.release();
        video.release();
      }
      @SuppressWarnings("unchecked")
      private void initComponents()
      {
        setLayout(new java.awt.BorderLayout());
      }
     }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多