我在使用vlcj的媒体播放器上有一个动作监听器。当我在调试模式下运行程序时,动作监听器会在视频完成时触发,但是当我在eclipse中正常运行时它不会触发。
我的动作听众
public static void youtubeGui(){
Main.playing = true;
final JFrame f = new JFrame();
f.setLocation(100,100);
f.setSize(1000,600);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setVisible(true);
Canvas c = new Canvas();
c.setBackground(Color.black);
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
p.add(c);
f.add(p);
NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(),"C:\\Program Files\\VideoLAN\\VLC");
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
MediaPlayerFactory mpf = new MediaPlayerFactory();
EmbeddedMediaPlayer emp = mpf.newEmbeddedMediaPlayer(new Win32FullScreenStrategy(f));
emp.setVideoSurface(mpf.newVideoSurface(c));
emp.setPlaySubItems(true);
String str = Insert.videoQueue.peek();
emp.prepareMedia(str);
emp.play();
Main.playing = true;
try {
TimeUnit.SECONDS.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
emp.addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
@Override
public void finished(MediaPlayer mediaPlayer) {
Insert.videoQueue.remove();
System.out.println("aaaaa");
f.setVisible(false);
f.dispose();
Main.playing = false;
}
});
}
检查新插入方法
public static void addCheck(String locationIn) throws IOException {
String fileLine = "";
String a = "";
while (true) {
Scanner inFile = new Scanner(new FileReader(
locationIn));
while (inFile.hasNext()) {
fileLine = inFile.nextLine();
}
if (fileLine.contains("watch?v=") && fileLine.contains("!add") && !fileLine.equals(a)) {
a = fileLine;
String result = fileLine.substring(fileLine.indexOf("[URL]") + 5, fileLine.indexOf("[/URL]"));
videoQueue.add(result);
result = "";
if(Main.playing == false){
Gui.youtubeGui();
}
}
inFile.close();
}
}
答案 0 :(得分:0)
我猜是因为我怀疑你发布的代码并不能说出完整的故事。
我在Eclipse中运行正常与调试模式时看到垃圾收集器的行为有所不同。
如果查看youtubeGui
方法,则将mpf
和emp
声明为本地堆变量。当该方法退出时,似乎没有其他任何东西保持这两个变量固定,因此引用的对象有资格进行垃圾收集。
如果您的emp
对象确实是垃圾收集的,那么这可以解释为什么您从未看到监听器被激活。
在调试模式下,垃圾收集可能已被延迟,而在非调试模式下,它会更快地运行。
您可能会认为媒体播放器如何被垃圾收集,因为视频仍在播放?好吧,媒体播放器已经在JVM外部创建了一些本地资源,并且没有任何内容显式地销毁这些本机资源,因为Java媒体播放器对象已被垃圾收集。通常会发生什么事,然后一些不确定的时间是本机崩溃。
因此,我建议您重新安排代码,以便您能够对媒体播放器(以及媒体播放器工厂)提供一些硬性参考。