VLCJ playmedia()在播放约1秒后停止播放

时间:2014-12-18 18:47:54

标签: vlcj

我使用了Caprica旧版Tutorial2B.java中的代码来播放整个文件:

public class Tutorial2B {

private final EmbeddedMediaPlayerComponent mediaPlayerComponent;

public static void main(final String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Tutorial2B(args);
        }
    });
}

private Tutorial2B(String[] args) {
    JFrame frame = new JFrame("vlcj Tutorial");

    mediaPlayerComponent = new EmbeddedMediaPlayerComponent();

    frame.setContentPane(mediaPlayerComponent);

    frame.setLocation(100, 100);
    frame.setSize(1050, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    mediaPlayerComponent.getMediaPlayer().playMedia("/home/me/sample.MP3");
    }
}

但是,我无法获得以下代码来播放我的音频文件超过一秒钟:

public class Tutorial2B {

private final AudioMediaPlayerComponent mediaPlayerComponent;

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
   @Override
   public void run() {
      new Tutorial2B();
      }
   });
}

private Tutorial2B() {
    mediaPlayerComponent = new AudioMediaPlayerComponent();
    MediaPlayer  mediaPlayer = mediaPlayerComponent.getMediaPlayer();
    mediaPlayer.playMedia("/home/me/sample.mp3")
}

有关为什么不起作用的任何线索?

当前代码12月21日:

public class Tutorial2B {

static AudioMediaPlayerComponent mediaPlayerComponent = null;

public static void main(String[] args) {

    mediaPlayerComponent = new AudioMediaPlayerComponent();
    mediaPlayerComponent.getMediaPlayer().playMedia("/home/sss.mp3");

    }
}

2 个答案:

答案 0 :(得分:0)

删除了SwingUtilities调用。现在播放很好。

答案 1 :(得分:0)

教程应用程序的工作原理和修改过的音频播放器应用程序不是因为垃圾收集。

在这两个示例中,当您执行SwingUtilities.invokeLater()并且run()方法终止时,您的整个应用程序将超出范围,并有资格进行垃圾回收。您没有保留对应用程序类的引用。

在示例应用程序的情况下,这很正常,因为创建Swing UI(JFrame)足以防止应用程序被垃圾回收。

如果您修改了应用程序,则不会创建Swing UI,因此不会阻止应用程序被垃圾回收。实际上,在这种情况下,您的应用程序将只是退出。

我真的很惊讶你说删除使用SwingUtilities修复了你的问题,因为我仍然看不到任何可以防止你的应用被垃圾收集的东西。当我看到这样的应用程序时,我在Linux上看到它将立即退出,并且在Windows上它将在执行垃圾收集后退出一些不可预测的时间。

更强大的解决方案是在当前线程上使用join()之类的东西来阻止应用程序退出,或以某种方式保持对应用程序类的引用固定,然后例如等待媒体播放器在终止申请之前发生“已完成”或“错误”的事件。

在“真正的”应用程序中,这类事情通常不是问题,因为还有其他因素会阻止您的应用程序被垃圾收集(如UI或其他应用程序框架)。