2017-02-21 15 views
-2

У меня есть прослушиватель действий на медиаплеере с использованием vlcj. Когда я запускаю программу в режиме отладки, прослушиватель действий запускается, когда видео завершено, но когда я запускаю его обычно в затмении, он не запускается.Экстренный прослушиватель работает только в режиме отладки

Мои действия слушателем

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(); 
    } 
} 
+1

Я предполагаю, что у вас есть проблема с потоковой загрузкой графического интерфейса, что вы являетесь графическим интерфейсом, который блокируется из-за долгого кода, который выполняется в потоке событий GUI, но я буду проклят, если смогу доказать это как Я не совсем понимаю ваш код. Пожалуйста, подумайте о создании и публикации действительного [mcve]. –

+0

Кроме того, если вы форматируете свой код лучше, чтобы он соответствовал стандартам Java, всем нам было бы легче понять и прочитать. –

+0

Я отформатировал ваш код для удобочитаемости, но в будущем я настоятельно рекомендую вам сделать это самостоятельно, особенно, указав правильные отступы вашего кода, обычно 4 пробела на блок, и убедитесь, что весь код в том же блоке находится на одинаковый уровень отступов. Форматирование очень важно, потому что, если ваш код не находится в стандартном принятом формате, он не читается, и если он не читается, его трудно отлаживать и понимать. –

ответ

0

Я предполагаю, так как я подозреваю, что ваш код размещен не говорит всю историю.

Я видел, как сборщик мусора ведет себя по-разному, когда работает обычный режим отладки в Eclipse.

Если вы посмотрите в своем методе youtubeGui, вы объявляете mpf и emp как локальные переменные кучи. Когда этот метод завершает работу, похоже, что-либо еще не удерживает эти две переменные, чтобы привязанные объекты стали пригодными для сбора мусора.

Если ваш объект emp действительно был собран мусором, это может объяснить, почему вы никогда не видите, что слушатель активирован.

В режиме отладки сбор мусора, возможно, был отложен, тогда как в режиме без отладки он запускается раньше.

Возможно, вы думаете, что каким образом медиаплеер может собирать мусор, потому что видео все еще играет? Ну, медиа-плеер создал родной ресурсов за пределами JVM, и ничто явно не уничтожило эти собственные ресурсы только потому, что объект медиа-проигрывателя Java был собран мусором. То, что обычно случается, тогда какое-то неопределенное время позже является нативным крахом.

Поэтому я бы предложил изменить код, чтобы у вас было что-то, содержащее твердую ссылку на ваш медиаплеер (и, возможно, на фабрику медиаплеера).

+0

Спасибо, человек, вот и трюк! –